inc CX // это должно выглядеть так inc ecx
mov j,CX //а вот так mov j,ecx
inc DX // таке же edx
mov k,DX // edx
inc BX // ebx
mov g,BX // ebx
Проблема с ассемблером
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<dos.h>
void vivod(int g)
{
cout<<"\Otritsatelinix "<<g<<endl;
cout<<"Ravnix nuliu "<<j<<endl;
cout<<"Bolishe nulea"<<k<<endl;
}
void main(){
int a,g=0,j=0,k=0;
clrscr();
cout<<"Vvedite tsifru \n";
cin>>a;
asm{
mov BX,0h
mov CX,0h
mov DX,0h
cmp a,0h
jnz m1 //esli ==0
inc CX
mov j,CX
jmp m3
}
m1:
asm{
js m2
inc DX //esli bolishe nulea
mov k,DX
jmp m3
}
m2:
asm{
inc BX //esli menishe nulea
mov g,BX
jmp m3
}
m3:
asm{
}
vivod(g,j,k);
getch();}
Код:
и в други такихже местах тоже нужно поменять
ну а если тебе нужно вызвать твою функцию из ассемблерной вставки то делается это так
Код:
asm{
push 3 // k
push 2 // j
push 1 // g
call vivod
add esp,0С <<<<< чистим стек
}
push 3 // k
push 2 // j
push 1 // g
call vivod
add esp,0С <<<<< чистим стек
}
Кстати не знаю, может я плохо шарю в с++ ,но твой код у меня выдает много ошибок так что я его немного подправил
Код:
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<dos.h>
void vivod(int g,int j,int k)
{
cout<<"\Otritsatelinix "<<g<<endl;
cout<<"Ravnix nuliu "<<j<<endl;
cout<<"Bolishe nulea"<<k<<endl;
}
void main(){
int a,g=0,j=0,k=0;
clrscr();
cout<<"Vvedite tsifru \n";
cin>>a;
asm{
mov eBX,0h
mov eCX,0h
mov eDX,0h
cmp a,0h
jnz m1 //esli ==0
inc eCX
mov j,eCX
jmp m3
}
m1:
asm{
js m2
inc eDX //esli bolishe nulea
mov k,eDX
jmp m3
}
m2:
asm{
inc eBX //esli menishe nulea
mov g,eBX
jmp m3
}
m3:
vivod(g,j,k);
getch();}
#include<iostream.h>
#include<conio.h>
#include<dos.h>
void vivod(int g,int j,int k)
{
cout<<"\Otritsatelinix "<<g<<endl;
cout<<"Ravnix nuliu "<<j<<endl;
cout<<"Bolishe nulea"<<k<<endl;
}
void main(){
int a,g=0,j=0,k=0;
clrscr();
cout<<"Vvedite tsifru \n";
cin>>a;
asm{
mov eBX,0h
mov eCX,0h
mov eDX,0h
cmp a,0h
jnz m1 //esli ==0
inc eCX
mov j,eCX
jmp m3
}
m1:
asm{
js m2
inc eDX //esli bolishe nulea
mov k,eDX
jmp m3
}
m2:
asm{
inc eBX //esli menishe nulea
mov g,eBX
jmp m3
}
m3:
vivod(g,j,k);
getch();}
Цитата: palevo060
.хм может я ошибаюсь но по моему вот так делать нельзя
и в други такихже местах тоже нужно поменять
Код:
inc CX // это должно выглядеть так inc ecx
mov j,CX //а вот так mov j,ecx
inc DX // таке же edx
mov k,DX // edx
inc BX // ebx
mov g,BX // ebx
mov j,CX //а вот так mov j,ecx
inc DX // таке же edx
mov k,DX // edx
inc BX // ebx
mov g,BX // ebx
и в други такихже местах тоже нужно поменять
Код:
[COLOR="Red"]#include<conio.h>
#include<dos.h>[/COLOR]
#include<dos.h>[/COLOR]
Цитата: palevo060
ну а если тебе нужно вызвать твою функцию из ассемблерной вставки то делается это так
Код:
asm{
push 3 // это те самые буквы g, k, j которые здесь vivod(g,j,k);
push 3 // просто тут они передаются через стек
// если ты понимаешь о чем я говорю и разбираешься в ассемблере
push 3
call vivod
}
push 3 // это те самые буквы g, k, j которые здесь vivod(g,j,k);
push 3 // просто тут они передаются через стек
// если ты понимаешь о чем я говорю и разбираешься в ассемблере
push 3
call vivod
}
Про соглашения вызовов не забываем?
Цитата:
asm{
push 3 // k
push 2 // j
push 1 // g
call vivod
add esp,0С <<<<< чистим стек
}
У меня все отлично работает
Цитата:
Про соглашения вызовов не забываем?
:cool: а что такое соглашения вызовов? :D
так и не понял чего я не так написал? можно поподробней
Соглашения о вызовах–каким образом передаются параметры в функцию–через стек(в прямом/обратном порядке) или через регистры.Как-то так
Цитата: @pixo $oft
Соглашения о вызовах–каким образом передаются параметры в функцию–через стек(в прямом/обратном порядке) или через регистры.Как-то так
Здесь это значения имеет мало, а вот кто чистит стек здесь значения имеет больше.
Код:
asm{
push 3 // k
push 2 // j
push 1 // g
call vivod
add esp,0С <<<<< чистим стек
}
push 3 // k
push 2 // j
push 1 // g
call vivod
add esp,0С <<<<< чистим стек
}
Вроде так :) или нет?
Цитата:
Здесь это значения имеет мало, а вот кто чистит стек здесь значения имеет больше.
.хм Ramon заводит меня в тупик)
Цитата: palevo060
.хм Ramon заводит меня в тупик)
Тупик тупиком, а различие между cdecl и stdcall существует.
Спасибо большое за информацию:)