2013-10-16 86 views
0

有人能告訴我爲什麼我可能會收到這些錯誤。當我嘗試運行./yas -爲什麼y86代碼中會出現逗號錯誤

Error on line 22: Expecting Register ID 
Line 22, Byte 0x0032:  subl $24, %esp 
Error on line 24: Expecting Register ID 
Line 24, Byte 0x0036:  subl $0,8(%ebp) 
Error on line 27: Expecting Register ID 
Line 27, Byte 0x0043:  mrmovl $0, -20(%ebp) 
Error on line 33: Expecting Comma 
Line 33, Byte 0x005a:  mrmovl %eax, -8(%ebp) 
Error on line 38: Expecting Register ID 
Line 38, Byte 0x0077:  mrmovl (%eax), -4(%ebp) 
Error on line 43: Expecting Comma 
Line 43, Byte 0x0091:  mrmovl %edx, -20(%ebp) 

y86中有一個subl指令嗎? 任何幫助將不勝感激。

回答

0

我只是開始學習Y86,但我想我可以幫你的忙:

問題第22行),前兩個subl操作失敗的原因是因爲你只能夠執行subl操作在兩個寄存器之間(認爲它是對第一個寄存器應用的一個二的恭維否定,然後加到第二個,只改變第二個寄存器的值)。 解決方案第22行)使用堆棧存儲寄存器的值並加載常量進行減法。不要忘記用流行音樂恢復註冊!

pushl %edx 
irmovl $24, %edx 
subl %edx, %exp 
popl %edx 

問題行24)類似的問題與subl需要一個寄存器。但是,你也試圖直接改變內存中的值(因爲它是被改變的第二個參數)。 解決方案第24行)使用堆棧存儲兩個寄存器值並加載常量進行相減,並從內存中加載該值。不要忘記恢復與彈出註冊!

pushl %edx    # edx first in 
pushl %ebx    # ebx last in 
mrmovl 8(%ebp), %ebx #move memory integer to ebx 
subl %edx, %ebx 
rmmovl %ebx, 8(%ebp) #move register integer to memory 
popl %ebx    # ebx first out 
popl %edx    # edx last out 

問題線27 & & 38)從存儲器中的整數傳遞至寄存器使用一個MRmovl操作(強調M和R,而不是R至M在rmmovl操作)。 解決方案行27 & & 38)要使用常量,請使用先前的堆棧技巧。另外,由於-20(%ebp)的內存地址必須是第一個參數,所以請切換順序。

問題行33 & & 43)除了現在確實正在使用寄存器(不需要堆棧)之外,請參見上面的問題。 解決方案行33 & & 43)和以前一樣,swap參數將內存值加載到寄存器%eax中。

希望這可以清除y86的一些指令(irmovl從立即值註冊,rmmovl從寄存器到內存,以及mrmovl從內存到註冊)以及介紹如何使用堆棧來管理臨時值。