Простая функция деления в сборке IA32 - PullRequest
1 голос
/ 05 октября 2010

Я работаю над заданием для моего класса. Мой код C ++ вызывает функцию _Divide, которая принимает 2 значения, которые делятся и возвращаются в «Результат». Для начала я перехожу -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 ]

4 голосов
/ 05 октября 2010

Ваш код делит -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, что выглядит так, как будто вы делаете,аргументы будут в стеке.

2 голосов
/ 05 октября 2010

Если вы хотите написать функцию в ассемблере, вы должны сначала узнать о соглашениях о вызовах: http://en.wikipedia.org/wiki/X86_calling_conventions.По сути, соглашение о вызовах представляет собой набор соглашений между вызывающей стороной и функцией о том, как они будут передавать и возвращать значения.

Обычно для C ++ обычно используется __cdecl или __stdcall.Оба требуют, чтобы возвращаемое значение было передано через EAX.Поскольку EAX всегда имеет -1, это то, что вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...