Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с ассемблером

49K
29 ноября 2009 года
Gheorghii
11 / / 24.10.2009
Добрый день! У меня есть программа, написанная на Си, со ставкой asm кода. Как сделать так, чтобы можно было функцию vivod вызвать из ассемлеровской вставки???
#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();}
10K
29 ноября 2009 года
palevo060
144 / / 05.09.2009
.хм может я ошибаюсь но по моему вот так делать нельзя

 
Код:
inc CX  // это должно выглядеть так inc ecx
mov j,CX   //а вот так  mov j,ecx


inc DX //  таке же edx
mov k,DX    // edx


inc BX       //  ebx
mov g,BX   // ebx

и в други такихже местах тоже нужно поменять


ну а если тебе нужно вызвать твою функцию из ассемблерной вставки то делается это так

 
Код:
asm{
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();}
260
29 ноября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: 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

и в други такихже местах тоже нужно поменять



 
Код:
[COLOR="Red"]#include<conio.h>
#include<dos.h>[/COLOR]
260
29 ноября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: palevo060

ну а если тебе нужно вызвать твою функцию из ассемблерной вставки то делается это так

 
Код:
asm{
push 3   // это те самые буквы g, k, j которые здесь vivod(g,j,k);
push 3  // просто тут они передаются через стек
           // если ты понимаешь о чем я говорю и разбираешься в ассемблере
push 3
call vivod
}



Про соглашения вызовов не забываем?

10K
29 ноября 2009 года
palevo060
144 / / 05.09.2009
Цитата:

asm{
push 3 // k
push 2 // j
push 1 // g
call vivod
add esp,0С <<<<< чистим стек

}


У меня все отлично работает

Цитата:

Про соглашения вызовов не забываем?


:cool: а что такое соглашения вызовов? :D

так и не понял чего я не так написал? можно поподробней

7
29 ноября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Соглашения о вызовах–каким образом передаются параметры в функцию–через стек(в прямом/обратном порядке) или через регистры.Как-то так
260
29 ноября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: @pixo $oft
Соглашения о вызовах–каким образом передаются параметры в функцию–через стек(в прямом/обратном порядке) или через регистры.Как-то так



Здесь это значения имеет мало, а вот кто чистит стек здесь значения имеет больше.

10K
29 ноября 2009 года
palevo060
144 / / 05.09.2009
хорошо вроде понял. Тогда уточню
 
Код:
asm{
push 3   //  k
push 2   //  j    
push 1   //  g
call vivod
add esp,0С  <<<<< чистим стек

}


Вроде так :) или нет?

Цитата:

Здесь это значения имеет мало, а вот кто чистит стек здесь значения имеет больше.


.хм Ramon заводит меня в тупик)

260
29 ноября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: palevo060
.хм Ramon заводит меня в тупик)



Тупик тупиком, а различие между cdecl и stdcall существует.

49K
30 ноября 2009 года
Gheorghii
11 / / 24.10.2009
Спасибо большое за информацию:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог