簡體   English   中英

遞歸除法匯編程序

[英]Recursive Division Assembly program

我正在開發一個程序集,技術上是 HLA(高級程序集)程序。 我需要將此 C 代碼轉換為匯編。 這是任務。 編寫一個 HLA 匯編語言程序,實現以下功能:

過程 recursiveModulo( a: int32; b : int32 ); @nodisplay; @無框;

這個函數應該基於遞歸方法將 a % b 的值返回到 EAX 中。 為簡單起見,我們假設 a 和 b 都大於或等於 0。 通過使用遞歸,您將被迫操作運行時堆棧。 您的解決方案基於以下公式:

這是提供的 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 塊。 對於如果 b = 1 結果應該為零的第二個 if 塊,它只是簡單地返回 1 而不是 0。對於第三個條件,如果 a 小於 b 我會遇到這個奇怪的問題,它適用於某些數字組合,但其他時候它只返回零。 對於應該遞歸調用函數的 else 塊,它只是簡單地返回參數 a。 `

POP彈出最后推送的值。 你先推送a然后b ,所以你必須先彈出b然后a

改變

pop(a);
pop(b);

pop(b);
pop(a);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM