assembly - 递归除法汇编程序

标签 assembly recursion modulus low-level hla

我正在开发一个 assembly ,技术上是 HLA(高级 assembly )程序。我需要将这个 C 代码转换为汇编代码。 这是作业。 编写一个HLA汇编语言程序,实现以下功能:

过程 recursiveModulo( a: int32; b : int32 ); @无显示; @无框;

该函数应基于递归方法将 a % b 的值返回到 EAX 中。为了简单起见,我们假设 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 block 。对于第二个 if block ,如果 b = 1,结果应该为零,它只是简单地返回 1 而不是 0。对于第三个条件,如果 a 小于 b,我遇到了这个奇怪的问题,它适用于某些数字组合,但其他时候它只返回零。对于应该递归调用函数的 else block ,它只是简单地返回参数 a。 `

最佳答案

POP 弹出最后推送的值。您先推送 a,然后推送 b,因此您必须先弹出 b,然后推送 a

改变

pop(a);
pop(b);

pop(b);
pop(a);

关于assembly - 递归除法汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663067/

相关文章:

汇编语言 : cbw

c++ - 警告 #13212 : Reference to ebx in function requiring stack alignment

php - MySQL 模组与 PHP 模组

c++ - 如何在另一种语言的随机函数中复制 C++ rand?

lisp - 如何在 LISP 中获取模数

assembly - 如何在 x86 ASM 中将整数转换为浮点值?

c - 标签作为内联汇编宏中的值

c++ - 计算 (2^k)m=input 的递归函数

c - 带指针的递归 -C

list - Haskell:递归处理任意深度嵌套的列表