我是汇编新手并试图找出如何进行基本寄存器功能,例如添加,乘法和分割写入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
答案 0 :(得分:2)
您应该查看指令集引用。这将告诉您div
和mul
只接受一个操作数,另一个操作数和结果是隐式的。
div
将始终除以edx
(高32位)和eax
(低32位)形成的64位数量。至于结果,商将在eax
中,余数在edx
。
mul
将始终乘以eax
自动生成edx
:eax
中的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位。