Передача аргументов из c ++ для сборки в cout

Я пишу простое сочетание c ++ и nasm ассемблера atm и не понимаю, почему результаты различаются внутри и снаружи «cout». Может быть, это какое-то исключение, однако я хотел бы знать разницу. Спасибо за любую помощь.

C ++ PART

#include <iostream>
#include <cstring>
using namespace std;
extern "C" unsigned int quot (unsigned int, unsigned int);
extern "C" unsigned int remainder (unsigned int, unsigned int);

int main()
{
unsigned int i=0, j=0, k=0;
cout << "Numbers 'x y'" << endl;
cin >> i >> j;
k = quot(i,j);
cout<< "Result: " <<k;
k = remainder(i,j);
cout <<" r. "<< k <<endl;

cout << "Result: "<<quot(i,j)<<" r. "<<remainder(i,j)<<endl;

return 0;
}

NASM
Функции квотирования и напоминания практически одинаковы. единственное отличие прокомментировано в коде

section .data

section .text
global quot

quot:
; intro
push ebp
mov ebp,esp

xor edx, edx
mov eax, [ebp+8]
mov ebx,[ebp+12]

div ebx

; DIFFERENCE: in remainder we have additionaly
; mov eax, edx

mov esp,ebp
pop ebp
ret

РЕЗУЛЬТАТЫ
Для 12 5 ввода мы ожидаем Результат: 2 р. 2 но мы получаем.

Result: 2 r. 2
Result: 2 r. 5

1

Решение

Вы должны сохранить ценность ebx в ваших функциях asm (см. http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl). Нарушение соглашения о вызовах может привести к различным диапазонам ошибок, от незначительных до сбоев.

использование ecx вместо ebxили попробуйте div dword ptr [ebp+12],

1

Другие решения


По вопросам рекламы [email protected]