Я пытаюсь суммировать массив в сборке с помощью стека, но результаты не приемлемы.
Я пытался отладить код, печатая результаты регистра 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, нофактический результат - какое-то случайное число.