2014-12-23 3 views
0

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. 실수를 저 지르더라도 알려주십시오.

답변

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) 

작업중인 레지스터 만 변경하십시오. (A + B) * (g의 + - (? 그리고 그것은 imull하지 imul입니다)

+0

덕분에 많이 ... 문제가 로했다'POPL %의 EBX 번호 내가 subl % EBX, % eax에 번호 [내가 얻을 c)]' 여기 내가 바꾼 것은 : popl % ebx # get i subl % eax, % ebx # [i - (a + b) * (g + c)] pushl % ebx # [i - (a + b) * (g + c)] 스택 – user1946440

관련 문제