Программа сборки рекурсивного отдела

Я работаю над сборкой, технически HLA (High Level Assembly), программой. Мне нужно преобразовать этот код C в ассемблер. Вот это задание. Напишите программу на языке ассемблера HLA, которая реализует следующую функцию:

процедура recursiveModulo( a: int32; b: int32); @нет дисплея; @noframe;

Эта функция должна возвращать в EAX значение% b на основе рекурсивного подхода. Для простоты предположим, что и a, и b будут больше или равны нулю. Используя рекурсию, вы будете вынуждены манипулировать стеком выполнения. Основывайте свое решение на следующих формулах:

Вот предоставленный код C:

int recursiveModulo( int a, int b ) 
{
   int result = 0;
   if (a == 0 || b == 0)
   {
     result = 0;
   }
   else if (b == 1)
   {
     result = 0;
   }
   else if (a < b)
   {
    result = a;
   } 
   else
   {
     result = recursiveModulo( a-b, b );
   }
     return( result );
}

Вот мой код HLA:

program RecursiveDivision;
#include( "stdlib.hhf" );
static
iDataValue1 : int32 := 0;
iDataValue2 : int32 := 0;

procedure recursiveModulo( a: int32; b : int32 ); @nodisplay; @noframe;
static
returnAddress : dword;


begin recursiveModulo;

pop(returnAddress);
pop(a);
pop(b);
push(returnAddress);
push(ECX);
push(EBX);


cmp(a, 0);
je equal;
jmp checkb;

checkb:
cmp(b, 0);
je equal;
jmp b1;

b1:
cmp(b, 1);
je equal;
jmp alessb;

equal:
mov(0, EAX);
jmp ExitSequence;

alessb:
mov(a, EBX);
cmp(b, EBX);
jg resulta;
jmp recursive;

resulta:
mov(a, EAX);
jmp ExitSequence;

recursive:
mov(a, ECX);
sub(b, ECX);
push(ECX);
push(b);
call recursiveModulo;
jmp ExitSequence;

ExitSequence:
pop(ECX);
pop(EBX);
ret();




end recursiveModulo;

begin RecursiveDivision;

stdout.put("Give me A",nl);
stdin.get(iDataValue1);
stdout.put("Give me B",nl);
stdin.get(iDataValue2);
push(iDataValue1);
push(iDataValue2);
call recursiveModulo;
stdout.puti32(EAX);


end RecursiveDivision;

Таким образом, часть моего кода, которая работает правильно, является первым блоком if. Для второго блока if, где результат должен быть равен нулю, если b = 1, это то, что он просто возвращает 1 вместо 0. Для третьего условного условия, где, если a меньше b, я получаю странные проблемы, когда он работает для некоторых комбинаций чисел., но в другой раз он просто возвращает ноль. для блока else, где предполагается рекурсивный вызов функции, он просто возвращает параметр a. `

1 ответ

Решение

POP выскакивает последнее нажатое значение. Вы нажимаете первым a затем bтак что вы должны сначала b затем a,

+ Изменить

pop(a);
pop(b);

в

pop(b);
pop(a);
Другие вопросы по тегам