2014-11-02 54 views
0

我是裝配新手並​​試圖弄清楚如何執行基本的寄存器功能,例如添加,乘法和分隔寫入32位x86程序。目前,我正在編寫計算「(5 + 4)/(10 * 3)」輸出的程序。計算完這個輸出後,我試圖以狀態碼的結​​果退出。我的代碼是目前:試圖乘法和除法時裝配「錯誤:垃圾」

.global main 

.type main @function 
main: 
movl $5, %ebx 
movl $4, %ecx 
addl %ebx, %ecx 
movl %ecx, %eax 

movl $10, %ebx 
movl $3, %ecx 
divl %ebx:%ecx 
mull %eax:%ecx 
push %ecx 
    call exit 

我目前得到的錯誤:

e2.s: Assembler messages: 
e2.s:19: Error: junk `:%ecx' after register 
e2.s:20: Error: junk `:%ecx' after register 

,當我嘗試編譯代碼:gcc -m32 -o e2 e2.s

我已經看了看Page 1,和Page 2,和「從頭開始編程」一書,但我無法弄清楚這個問題。

+0

恩,你鏈接的那個有答案。 「idivl只有一個參數。」 – 2014-11-03 00:16:24

回答

2

您應該改爲查看指令集引用。這會告訴你,divmul只佔用一個操作數,另一個操作數和結果是隱含的。具有32位操作數的

div將始終將由edx(高32位)和eax(低32位)形成的64位數量分開。至於結果,商數將在eax之內,餘數在edx之內。

mul帶有32位操作數總是會自動產生eax產生一個64位結果edxeax

另外,你的代碼首先執行了除法,然後乘法,這不是你的公式所說的。

考慮到上述情況,你可以重寫你的代碼,如:

movl $10, %eax 
movl $3, %edx 
mull %edx  # eax = 10 * 3, edx = 0 
movl %eax, %ecx # ecx = 10 * 3 

movl $5, %eax 
addl $4, %eax # eax = 5 + 4 

divl %ecx  # eax = (5 + 4)/(10 * 3) 
push %eax 
call exit 

注意,這是整數除法,那麼結果將是零。如果更改數字,請記住退出代碼僅爲8位。