下面貼出的是我用於簡單的y86組裝程序的代碼。給定兩個整數,它應該打印出兩者中較大的一個。在每一行的右邊我有一個等效的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處的指令爲。這是告訴程序計數器應該告訴它去0x016行去0x014(一條甚至不存在的行)。行0x011存在相同的問題。這是爲什麼發生?
- 當我使用地址線而不是標籤組裝程序時,會打印結果,但換行符不是。我怎樣才能解決這個問題?
- 最後,一個小問題:如果我沒有評論作爲第一行,第一行代碼被忽略。這是否應該發生?
謝謝你的時間,我期待着你能提供的任何答案。
我對此一無所知,但在網絡上查看它看起來像其他例子,我可以找到有程序集縮進,與標籤左邊的同一行例如http://csapp.cs .cmu.edu/public/simguide.pdf - 這可能會解釋標籤地址是錯誤的,如果它是一個非常糟糕的實現,甚至可能會解釋需要初始評論......換句話說,一個瘋狂的猜測是你的輸入格式是錯誤的,yas解析器很混亂。 – 2012-04-11 00:16:23
如果將標籤放在指令所在行的同一行上,會發生什麼情況:'ALarger:wrint%eax' on the same line,etc. – 2012-04-11 00:44:10
當我這樣做時,ALarger:wrint%eax的行仍然是0x016,End:irmovl $ 10,%ecx仍然是0x018。 jge和jmp指令也保持不變。似乎是一個風格的東西。無論如何感謝@andrew。 – 2012-04-11 01:00:21