IA32汇编中的简单除法功能

时间:2010-10-05 16:44:28

标签: assembly intel x86

我正在为我的课做作业。我的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;
}

感谢。

2 个答案:

答案 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,这就是你得到的。