2014-11-02 18 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位。