汇编中的算术运算出现问题

时间:2014-12-23 11:38:09

标签: assembly x86 att

我正在尝试解决在AT& T汇编程序中提供不同输出的算术运算。算术运算类似于((i-(a+b)*(g+c))/((h*e)+(f+j)*d)。值如下

a: .long 1
b: .long 2
c: .long 3
d: .long 1
e: .long 1
f: .long 1
g: .long 2
h: .long 2
i: .long 20
j: .long 2

根据我的计算,结果应为1.但是,我已经给出了完整的代码。

.data
intout: .string "Wert %d\n"

a: .long 1
b: .long 2
c: .long 3
d: .long 1
e: .long 1
f: .long 1
g: .long 2
h: .long 2
i: .long 20
j: .long 2

  .text

  .globl main

main:
  movl i, % eax
pushl % eax# i in the stack
movl a, % eax
movl b, % ebx
addl % eax, % ebx# a + b

pushl % ebx#(a + b) in the stack

movl g, % eax
movl c, % ebx
addl % eax, % ebx# g + c

popl % eax# get(a + b)
imull % ebx#(a + b) * (g + c), Result in eax
popl % ebx# get i
subl % ebx, % eax#[i - (a + b) * (g + c)]
pushl % eax#[i - (a + b) * (g + c)] in the stack

movl h, % eax
movl e, % ebx
imul % ebx#(h * e)
pushl % eax#(h * e) in the stack

movl f, % eax
movl j, % ebx
addl % eax, % ebx#(f + j)

movl d, % eax
imul % ebx#(f + j) * d

popl % eax# get(h * e)
addl % eax, % ebx#[(h * e) + (f + j) * d]

popl % eax#[i - (a + b) * (g + c)]
idivl % ebx#[i - (a + b) * (g + c)] / [(h * e) + (f + j) * d]

# Value = "Wert" in % eax given
pushl % eax
pushl $intout
call printf
addl $8, % esp

# Exit
movl $1, % eax
int $0x80

P.S。如果我犯了任何错误,请通知我。

1 个答案:

答案 0 :(得分:2)

首先,subl计算%eax - %ebx,所以它是(a + b)*(g + c) - i。

popl % ebx# get i
subl % ebx, % eax#[i - (a + b) * (g + c)]

您可以否定结果以使其正确:

negl %eax
pushl % eax#[i - (a + b) * (g + c)] in the stack

其次,imull存储导致%eax,如前所述。因此,在此代码中,您计算​​结果,然后"忘记"它:

movl d, % eax
imul % ebx#(f + j) * d

popl % eax# get(h * e)

只需更改您正在使用的注册表即可。 (它是imull,而不是imul?)