2012-06-07 3 views
0

Я пытаюсь ввести пользователя в 2 цифры, первый из которых является базовым, а второй - показателем.Сборка, возвращающая неправильное значение

Эти два значения хранятся правильно. Я знаю это, печатая их (этот код печати в настоящее время прокомментирован). Однако моя петля для вычисления ответа базового экспонента возвращает неправильное значение.

Может ли кто-нибудь указать мне в правильном направлении или даже решить мою проблему?

Это мой код:

#/** 
#* 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

Одна из возможностей состоит в том, чтобы сделать один шаг кода в отладчике и убедиться, что рабочие регистры содержат ожидаемые значения.