递归除法组装程序
Recursive Division Assembly program
我正在研究一个程序集,技术上是 HLA(高级程序集)程序。我需要将此 C 代码转换为汇编代码。
这是作业。
编写一个实现以下功能的HLA汇编语言程序:
过程递归模数(a:int32;b:int32); @nodisplay; @无框;
这个函数应该return根据递归的方式把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 块。对于第二个 if 块,如果 b = 1,结果应该为零,它只是 returns 1 而不是 0。对于第三个条件,如果 a 小于 b,我在它工作的地方遇到了这个奇怪的问题对于某些数字组合,但其他时候它只是 return 为零。对于应该递归调用函数的 else 块,它只是简单地 returns 参数 a。 `
POP
弹出 last 推送的值。你先 push a
然后 b
,所以你必须先 pop b
然后 a
.
改变
pop(a);
pop(b);
至
pop(b);
pop(a);
我正在研究一个程序集,技术上是 HLA(高级程序集)程序。我需要将此 C 代码转换为汇编代码。 这是作业。 编写一个实现以下功能的HLA汇编语言程序:
过程递归模数(a:int32;b:int32); @nodisplay; @无框;
这个函数应该return根据递归的方式把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 块。对于第二个 if 块,如果 b = 1,结果应该为零,它只是 returns 1 而不是 0。对于第三个条件,如果 a 小于 b,我在它工作的地方遇到了这个奇怪的问题对于某些数字组合,但其他时候它只是 return 为零。对于应该递归调用函数的 else 块,它只是简单地 returns 参数 a。 `
POP
弹出 last 推送的值。你先 push a
然后 b
,所以你必须先 pop b
然后 a
.
改变
pop(a);
pop(b);
至
pop(b);
pop(a);