试图乘法和除法时装配“错误:垃圾”

时间:2014-11-02 22:30:05

标签: assembly x86

我是汇编新手并试图找出如何进行基本寄存器功能,例如添加,乘法和分割写入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 1Page 2以及“从头开始编程”一书,但我无法弄清楚这个问题。

1 个答案:

答案 0 :(得分:2)

您应该查看指令集引用。这将告诉您divmul只接受一个操作数,另一个操作数和结果是隐式的。

带有32位操作数的

div将始终除以edx(高32位)和eax(低32位)形成的64位数量。至于结果,商将在eax中,余数在edx

具有32位操作数的

mul将始终乘以eax自动生成edxeax中的64位结果。

此外,您的代码首先执行除法,然后是乘法,这不是您的公式所说的。

考虑到上述情况,您可以重写代码,如:

 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位。