以下に投稿されたのは、単純な y86 アセンブリ プログラム用のコードです。2 つの整数を指定すると、2 つの大きい方を出力する必要があります。各行の右側には、同等の C 翻訳があります。
# I ask about the need for a first line comment below.
rdint %eax # scanf("%d", &a);
rdint %ebx # scanf("%d", &b);
rrmovl %eax, %ecx # c = a;
subl %ebx, %ecx # c = a - b;
jge ALarger # if (c >= 0) { goto ALarger };
wrint %ebx # printf("%d", b);
jmp End # goto End;
ALarger:
wrint %eax # printf("%d", a);
End:
irmovl $10, %ecx # c = 10;
halt
wrch %ecx
アセンブラーyasを使用すると、結果の .yo ファイルは次のようになります。
0x000: f118 | # I ask about the need for a first line comment below.
0x002: f208 | rdint %eax # scanf("%d", &a);
0x004: f238 | rdint %ebx # scanf("%d", &b);
0x006: 2001 | rrmovl %eax, %ecx # c = a;
0x008: 6131 | subl %ebx, %ecx # c = a - b;
0x00a: 7514000000 | jge ALarger # if (c >= 0) { goto ALarger };
0x00f: f338 | wrint %ebx # printf("%d", b);
0x011: 7016000000 | jmp End # goto End;
|
0x016: | ALarger:
0x016: f308 | wrint %eax # printf("%d", a);
|
0x018: | End:
0x018: 30810a000000 | irmovl $10, %ecx # c = 10;
0x01e: 10 | halt
- これは正しく組み立てられていません。ラベルが見つかると、プログラム内で見つかった場所のアドレスに置き換えられると言われました。入力された最初の数値がより大きい場合、行0x00aの命令は7514000000です。これは、プログラムカウンターに 0x016 に移動するように指示する必要があるときに、行0x014 (存在しない行) に移動するように指示しています。行0x011にも同じ問題があります。なぜこうなった?
- ラベルの代わりにアドレス行を使用してプログラムをアセンブルすると、結果は出力されますが、改行は出力されません。どうすればこれを修正できますか?
- 最後に、ちょっとした質問です。最初の行にコメントがない場合、コードの最初の行は無視されます。これは起こるはずですか?
お時間をいただきありがとうございます。ご回答いただけることを楽しみにしています。