Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 递归除法汇编程序_Assembly_Recursion_Modulus_Low Level_Hla - Fatal编程技术网

Assembly 递归除法汇编程序

Assembly 递归除法汇编程序,assembly,recursion,modulus,low-level,hla,Assembly,Recursion,Modulus,Low Level,Hla,我正在做一个汇编程序,技术上是HLA(高级汇编)程序。我需要将此C代码转换为Assembly。 这是作业。 编写实现以下功能的HLA汇编语言程序: 过程递归模(a:int32;b:int32)@节点显示@无框架 此函数应基于递归方法将%b的值返回到EAX中。为了简单起见,我们假设a和b都大于或等于零。通过使用递归,您将被迫操作运行时堆栈。您的解决方案基于以下公式: 以下是提供的C代码: int recursiveModulo( int a, int b ) { int result =

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

过程递归模(a:int32;b:int32)@节点显示@无框架

此函数应基于递归方法将%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 );
}

因此,我的代码中正确工作的部分是第一个if块。对于第二个if块,如果b=1,结果应该为零,它只是简单地返回1而不是0。对于第三个条件,如果a小于b,我得到一个奇怪的问题,它适用于一些数字组合,但其他时候它只返回零。对于应该递归调用函数的else块,它只返回参数a`

POP
弹出上次按下的值。首先按
a
然后按
b
,因此必须先按
b
然后按
a

改变

pop(a);
pop(b);


我不知道HLA的所有规则,但你的解决方案在我看来很有趣。特别是,你是“流行(a)”。。。那个弹出的值到哪里去了?通常,在编写递归汇编过程时,希望将所有内容都保留在寄存器中或堆栈顶部。另一件看起来很奇怪的事情是在函数进入时按ECX和EBX,这意味着您总是在调用的“叶”过程中这样做,而这可能对您没有帮助。如果目的是使ECX和EBX免费使用,您可以在调用站点上这样做,从而避免在leaf过程中这样做的成本。公平地说,如何管理保存/恢复寄存器通常是一个惯例问题。如果您不关心性能,那么您应该使用“首选约定”,因为这是您代码的其他读者(您的教授?)所期望的。编写递归除法的事实已经告诉我们,性能不是目标,所以可能首选约定是您想要的。OTOH,在实践中,编写汇编程序的通常原因是为了性能,所以我的个人雷达总是以这种方式关注。是的,我同意你的说法,但我只是在遵循我必须为分配做的事情。我还注意到原始算法中的一个错误:
a
b
是有符号整数,因此,假设a=-5,b=2:`if(apop(a); pop(b);
pop(b);
pop(a);