Как исправить функцию sum_array в сборке 32bit - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь суммировать массив в сборке с помощью стека, но результаты не приемлемы.

Я пытался отладить код, печатая результаты регистра ecx в тот момент. я также пытался использовать gdb для отладки, но я не знаю, как я могу напечатать стек, указанный как esp или ebp

.extern printf
.extern exit
.extern scanf
.extern read

hex:    .asciz  "%x"
hexn:   .asciz  "%x\n"
intn:   .asciz  "%d\n"
strn:       .asciz  "%s\n"
charn:  .asciz  "%c"

pr_int:
    pushal
    pushl   %eax
    push    $intn
    call    printf
    addl    $8, %esp
    popal
    ret

pr_str:
    pushal
    pushl   %esi
    call    printf
    addl    $4, %esp
    popal
    ret

pr_hex:
    pushal
    pushl   %eax
    push    $hexn
    call    printf
    addl    $8, %esp
    popal
    ret

pr_char:
    pushal
    pushl   %eax
    push    $charn
    call    printf
    addl    $8, %esp
    popal
    ret

read_hex:
    pushl    %ebp
    movl     %esp, %ebp
    sub     $4, %esp
    # Keep important registers.
    # We can't use pusha here, because the result is inside eax.
    pushl    %ebx
    pushl    %ecx
    pushl    %edx

    leal     -4(,%ebp), %ebp
    pushl    %ebx
    push     $hex
    call    scanf
    addl    $8, %esp
    mov     (,%ebx),    %eax

    # Restore registers:
    popl     %edx
    popl     %ecx
    popl     %ebx
    leave
    ret
.include    "include.s"

.section    .text

.align  32
.globl     main

main:
    pushl   $arr
    pushl   $arrlen
    call    sum
    addl    $8, %esp
    call    pr_int
    ret

sum:
    pushl   %ebp
    movl    %esp, %ebp
    xor %edx, %edx
    xor %ecx, %ecx
    movl    20(,%ebp), %ecx

# debugging code
movl    %ecx,   %eax
call    pr_int
xor %eax, %eax
# debugging code ends

    movl    24(,%ebp), %eax
sum_arr:

    addl    (,%eax), %edx
    addl    $4, %eax
    dec %ecx
    loopne  sum_arr
    popl    %ebp
    ret

arr:    .long   1,2,3,4,5,6,7,8,9
arrlen = (. - arr)/4

Я ожидаю, что выход функции sum будет 45, нофактический результат - какое-то случайное число.

...