2

以下に投稿されたのは、単純な 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にも同じ問題があります。なぜこうなった?
  • ラベルの代わりにアドレス行を使用してプログラムをアセンブルすると、結果は出力されますが、改行は出力されません。どうすればこれを修正できますか?
  • 最後に、ちょっとした質問です。最初の行にコメントがない場合、コードの最初の行は無視されます。これは起こるはずですか?

お時間をいただきありがとうございます。ご回答いただけることを楽しみにしています。

4

2 に答える 2

3

YAS では、正しい yo コードを作成するために、最後の行の後に改行が必要です。詳細については、http: //y86tutoring.wordpress.com/2012/11/06/yas-no-halt-for-the-wicked/を参照してください。

于 2012-11-06T21:56:07.760 に答える
2

wrch の前に halt ステートメントを配置したため、実行は改行を書き込む前に停止し、yas はそれを完全に無視しているように見えます。これは、ジャンプが 1 バイトずつシフトされるなど、他の問題を説明している可能性があります。プログラム内の行数が実際にアセンブルされる行数より多いと、アセンブラがアドレス ジャンプを挿入するときに混乱する可能性があります。

于 2012-04-11T01:44:03.727 に答える