私はアセンブリ言語に非常に慣れておらず、C にもかなり慣れていません。C コードから関数呼び出しを作成する例を見てきました。アセンブリ コードには、計算を実行して値を返す関数があります (これは代入です)。 ) C コード:
#include <stdio.h>
int Func(int);
int main()
{
int Arg;
Arg = 5;
printf("Value returned is %d when %d sent\n",Func(Arg), Arg);
}
アセンブリ コード:
.global Func
Func: save %sp,-800, %sp
add %i0, -45 , %l0
mov %l0, %i0
ret
restore
C コードから値を取得し、その値をアセンブリ コードの数値に加算して、新しい数値を出力します。私はこの事例を大部分理解しています。私たちの課題 (コードの変更): 「A と B の 2 つのパラメーターで Func1 を呼び出す C ソース ファイルと、Func1 と Func2 の 2 つのメソッドを含むアセンブリ ソース ファイルを作成します。Func2(Q) であるかのように、Func1 に Func2 を呼び出させます。 . Func2 はその入力引数を 2 倍にして、その 2 倍した値を Func1 に送り返す必要があります。Func1 は、値 2*A + 2*B を C メインに返す必要があります。" 私はこれを試みましたが、この解決策を見つけました(今日の時点でこれに慣れていないことを許してください)
#include <stdio.h>
int Func1(int, int);
void Func2(int, int);
int main()
{
int Arg1 = 20;
int Arg2 = 4;
printf("Value returned is %d ",Func1(Arg1,Arg2));
}
組み立て:
.global Func1
Func1: save %sp,-800, %sp
mov %l0, %i0
mov %l1, %i1
call Func2
nop
ret
restore
Func2: save %sp,-800, %sp
umul %i0, 2 , %l0
umul %i1, 2 , %l1
call Func1
nop
それは機能していません。私は少しも驚きません。このコードには多くの問題があると確信していますが、ここで何が起こっているか、または私が間違っていることについての完全な説明が本当に役に立ちます。