2012-04-11 5 views
2

以下は、単純なy86アセンブリプログラムのコードです。 2つの整数が与えられた場合、2つの整数のうち大きい方を出力するはずです。各行の右側には、同等のC言語の翻訳があります。 ヤスアセンブラを使用してy86アセンブリラベルが何をしていないのですか

# 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 

、結果.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の命令はです。これは、0x014に行くように指示しなければならないときに、0x014(存在しない行)に行くようにプログラムカウンタに指示しています。同じ問題が行0x011に存在します。なぜこうなった?
  • ラベルの代わりにアドレス行を使用してプログラムをアセンブルすると、結果が出力されますが、改行は出力されません。これをどうすれば解決できますか?
  • 最後に、軽微な質問:最初の行にコメントがない場合、最初の行は無視されます。これは起こるはずですか?

ありがとうございます、私はあなたが提供できる答えをお待ちしております。

+0

私はこれについて何も知らないけど、ネット上を見れば、同じ行の左にあるラベル(例:http://csapp.cs)を使って、アセンブリのインデントを見つけることができる他の例のように思えます。 .cmu.edu/public/simguide.pdf - これはラベルのアドレスが間違っていることを説明しているかもしれませんし、実際には気まずい実装であれば、最初のコメントの必要性を説明するかもしれません...言い換えれば、あなたの入力形式が間違っていて、yasパーサーが混乱しています。 –

+0

ラベルと同じ行に 'Alarger:wrint%eax'というラベルを同じ行に置くとどうなりますか –

+0

これを行うと、ALarger:wrint%eaxの行は0x016のままで、End:irmovl $ 10、%ecxはまだ0x018です。 jgeおよびjmp命令も変更されません。文体的なものに見えます。とにかく@andrewありがとう。 –

答えて

2

wrchの前にhalt文を置くと、改行を書き込む前に実行が停止し、yasは完全に無視されるように見えます。これはジャンプが1バイトだけシフトされるような、あなたの他の問題を説明するかもしれません。プログラムの行数が実際にアセンブルされている行数より多いと、アセンブラがアドレスジャンプをするときに混乱している可能性があります。

+0

確かに、私はそれを試して、最後の2行を切り替えるとうまくいきます。 – scry

+0

あなたのロジックは健全であり、理にかなっています。私はそれがあなたのために働いて驚くことではない、これはどのようにする必要があります。私はもともと、あなたが提案した方法でこのコードを書いていましたが、組み立てたときに、.yoファイルはうんざりしていました。最後の行「停止」は生成されず、すべてのアドレスが1つずつインクリメントされ、実行されるとプログラムは1ステップで停止します。それはException 'HLT'、つまり停止します。私は、改行をAFTER停止にしないと、この問題が発生することがわかりました。私はこれが私の支配の外で問題になるかもしれないと感じており、すぐに私の教授に連絡します。ご回答いただきありがとうございます。 –

+0

それと一緒にフィディッとして、あなたは正しい!トリックは停止直後に「Enter」を押していた。停止後に空行が必要ですか? y86は変です。 –

関連する問題