2012-04-11 59 views
2

下面貼出的是我用於簡單的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存在相同的問題。這是爲什麼發生?
  • 當我使用地址線而不是標籤組裝程序時,會打印結果,但換行符不是。我怎樣才能解決這個問題?
  • 最後,一個小問題:如果我沒有評論作爲第一行,第一行代碼被忽略。這是否應該發生?

謝謝你的時間,我期待着你能提供的任何答案。

+0

我對此一無所知,但在網絡上查看它看起來像其他例子,我可以找到有程序集縮進,與標籤左邊的同一行例如http://csapp.cs .cmu.edu/public/simguide.pdf - 這可能會解釋標籤地址是錯誤的,如果它是一個非常糟糕的實現,甚至可能會解釋需要初始評論......換句話說,一個瘋狂的猜測是你的輸入格式是錯誤的,yas解析器很混亂。 – 2012-04-11 00:16:23

+0

如果將標籤放在指令所在行的同一行上,會發生什麼情況:'ALarger:wrint%eax' on the same line,etc. – 2012-04-11 00:44:10

+0

當我這樣做時,ALarger:wrint%eax的行仍然是0x016,End:irmovl $ 10,%ecx仍然是0x018。 jge和jmp指令也保持不變。似乎是一個風格的東西。無論如何感謝@andrew。 – 2012-04-11 01:00:21

回答

2

您在wrch之前放置了halt語句,因此在寫入換行符之前停止執行,看起來yas完全忽略它。這可能會解釋你的其他問題,如跳轉被移動一個字節;如果程序中的行數大於實際組裝的行數,可能會導致彙編程序在放入地址跳轉時混淆。

+0

果然,我試過了,如果你切換最後兩行,它的工作正常。 – scry 2012-04-11 02:32:49

+0

你的邏輯是合理的,這確實有道理。我不驚訝它爲你工作,這是應該的。我原本是按照你的建議編寫這段代碼的,但是當彙編時,.yo文件不合適。最後一行「停止」不會產生,每個地址都會加1,運行時程序將以1步停止。它會運行到異常「HLT」,也就是停止。我發現沒有把換行符暫停後對我產生這個問題。我有一種感覺,這可能是我無法控制的問題,很快就會聯繫我的教授。感謝您的答覆。 – 2012-04-11 06:36:46

+0

擺弄它,你是對的!訣竅是暫停後立即按下「Enter」鍵。暫停後需要有空行嗎? y86很奇怪。 – 2012-04-11 15:21:59

相關問題