递归分部大会计划

时间:2015-11-12 01:41:23

标签: assembly recursion modulus low-level hla

我正在进行一项装配,即技术HLA(高级装配)计划。我需要将此C代码转换为可装配的。 这是作业。 编写一个实现以下功能的HLA汇编语言程序:

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

此函数应基于递归方法将%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块。对于第二个if块,如果b = 1,结果应该为零,那就是它只是返回1而不是0.对于第三个条件,如果a小于b,我得到这个奇怪的问题,它适用于某些数字组合,但其他时间它只返回零。对于应该以递归方式调用函数的else块,它只是简单地返回参数a。 `

1 个答案:

答案 0 :(得分:2)

POP弹出最后推送值。您先推送a然后推送b,这样您就必须先点击b然后再点a

更改

pop(a);
pop(b);

pop(b);
pop(a);