我正在为我的课做作业。我的C ++代码调用_Divide
函数来接受2个值来划分并返回'Result'。首先,我将-1移入eax。一旦我完成了这个过程,我的eax就会继续返回'-1'作为值。我能做错什么?这是我的汇编代码:
public _Divide
.386
.model flat
.code
_Divide proc
mov eax, -1
mov ebx, 1
cdq
idiv ebx
ret
_Divide endp
end
这是我的C ++代码
#include <iostream>
using namespace std;
extern "C" long Divide (long, long, long *);
void main ()
{
long Result;
long Remainder;
long Dividend;
long Divisor;
do {
cout << "Enter Dividend" << endl;
cin >> Dividend;
cout << "Enter Divisor" << endl;
cin >> Divisor;
Result = Divide (Dividend, Divisor, &Remainder);
cout << "Result is " << Result << " and Remainder is " << Remainder << endl;
} while ((Result >= 0) || (Remainder != 0));
Result = Divide (Dividend, Divisor, 0);
cout << "Result is " << Result << " and Remainder is not used" << endl;
}
感谢。
答案 0 :(得分:4)
您的代码将-1
除以1
。答案是-1
,这就是你的回报。让我们分解代码(我只是提出内联注释):
mov eax, -1 ; Put -1 in eax
mov ebx, 1 ; put 1 in ebx
cdq ; sign extend eax -> edx:eax = -1
idiv ebx ; divide edx:eax (-1) by ebx (1)
; result goes in eax, so now eax = -1
ret ; return eax (-1) to caller
如果要分割传递给此函数的参数,则需要以某种方式访问它们。你没有向我们展示C ++函数签名,所以我无法帮助你了解更多细节。
提示:如果您正在编写IA32代码,它看起来就像您正在做的那样,参数将在堆栈中。
答案 1 :(得分:2)
如果你想在汇编中编写函数,你应该首先了解调用约定:http://en.wikipedia.org/wiki/X86_calling_conventions。基本上调用约定是调用者和函数之间关于如何传递和返回值的协议集。
C ++的常规约定通常是__cdecl
或__stdcall
。两者都要求通过EAX
传递返回值。由于EAX
总是有-1,这就是你得到的。