私はアセンブリ、技術的には HLA (High Level Assembly) プログラムに取り組んでいます。この C コードをアセンブリに変換する必要があります。これが課題です。次の関数を実装する HLA アセンブリ言語プログラムを作成します。
プロシージャ recursiveModulo( a: int32; b : int32 ); @nodisplay; @noframe;
この関数は、再帰的アプローチに基づいて 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 ブロックです。b = 1の場合に結果がゼロになる2番目のifブロックは、単に0ではなく1を返すということです. 、しかしそれ以外の場合はゼロを返します。関数を再帰的に呼び出すことになっているelseブロックでは、単にパラメータaを返すだけです。`