2012-06-07 4 views
0

사용자가 두 자리 숫자를 입력 할 수있게하려고합니다. 첫 번째는 기본이고 두 번째 숫자는 지수입니다.잘못된 값을 반환하는 어셈블리 전원

이 두 값은 올바르게 저장됩니다. 나는 이것을 인쇄함으로써 이것을 안다 (이 인쇄 코드는 현재 주석 처리되어있다). 그러나 기본^지수의 대답을 계산하는 내 루프가 잘못된 값을 반환하고 있습니다.

누구나 올바른 방향으로 나를 가리키거나 내 문제를 해결할 수 있습니까? 사전에

#/** 
#* The pow subroutine calculates powers of natural bases 
#* and exponents. 
#* 
#* Arguments: 
#* 
#* base - the exponential base 
#* exp - the exponent 
#* 
#* Return value: 'base' raised to the power of 'exp'. 
#*/ 

#int pow(int base, int exp) 
# { 
# int total = 1; 
# while !(exp <= 0){ 
# total = total * base; 
# exp = exp -1; 
# } 
# return total; 
# } 

.bss 
    EXP: .long 
    BASE: .long 
    TOTAL: .long 

.text 
    FSTR: .asciz "%d" 
    PSTR: .asciz "%d\n" 

.global main 

    inout: 
    pushl %ebp  # Prolog: push the base pointer. 
    movl %esp, %ebp # and copy stack pointer to EBP. 

    subl $4, %esp  # Reserve stack space for variable 
    leal -4(%ebp), %eax  # Load address of stack var in eax 


    pushl %eax  # Push second argument of scanf 
    pushl $FSTR  # Push first argument of scanf 
    call scanf  # Call scanf 


    movl -4(%ebp), %eax  # Move result of scanf from stack to eax 

    movl %ebp, %esp  # Clear local variables from stack. 
    popl %ebp  # Restore caller's base pointer. 
    ret    # return from subroutine. 

    main: 
    call inout 
    movl %eax, BASE 

    #pushl BASE 
    #pushl $PSTR 
    #call printf 

    call inout 
    movl %eax, EXP 

    #pushl EXP 
    #pushl $PSTR 
    #call printf 


    #subl $4, %esp 
    #leal -4(%ebp), %eax 
    #movl %eax, TOTAL 

    movl $1, TOTAL 

    loop: 
    cmpl $0, EXP 
    jle end 
    movl TOTAL, %eax 
    mull BASE 
    movl %eax, TOTAL 
    decl EXP 
    jmp loop 
    end: 
    pushl %eax 
    pushl $PSTR 
    call printf 
    #addl $4, %esp  #\ 
    pushl $0  #- Clean up and exit 
    call exit  #/ 

감사 :

내 코드입니다.

+0

어떤 가치가 있습니까? scanf가 숫자 값 또는 ascii 값을 제공합니까? –

답변

1

하나의 가능성은 디버거에서 코드를 단일 단계로 실행하고 작업 레지스터에 예상 값이 들어 있는지 확인하는 것입니다.