我已声明了两个空格,我将用作数组。 (无论如何,这就是我所希望的)
WORM_X: .space 128
WORM_Y: .space 128
它们将保持X和Y坐标。
我试图将som值放在数组中,然后使用nib_put_scr在屏幕上打印它们,这是一个使用curses.h的C函数。
当我运行此代码时,我得到分段错误。 现在做任何人我做错了什么?
(我是装配btw的完全初学者)
# Sets up the WORM_Y array
mov LENGTH, %eax
add Y, %eax
mov %eax, CMP
mov $WORM_Y, %eax
mov Y, %ebx
loop_addy:
mov %ebx, 0(%eax)
add $4, %eax
inc %ebx
cmp CMP, %ebx
jne loop_addy
# Sets up the WORM_X array
mov LENGTH, %eax
add X, %eax
mov %eax, CMP
mov $WORM_X, %eax
mov X, %ebx
mov X, %ecx
loop_addx:
mov %ecx, 0(%eax)
add $4, %eax
cmp CMP, %ebx
jne loop_addx
# Prints out signs on the screen with coordinates WORM_X & WORM_Y
mov $WORM_X, %ebx
mov $WORM_Y, %edx
loop_printtest:
push $48
push (%ebx)
push (%edx)
call nib_put_scr
addl $12, %esp
add $4, %ebx
add $4, %edx
mov (%ebx), %ecx
cmp $0, %ecx
jne loop_printtest
答案 0 :(得分:2)
调用库函数通常是destroy the eax/ecx/edx registers。我猜测对nib_put_scr
的调用是在ncurses内部的某个地方摧毁这些寄存器的内容。
您可以通过使用操作码包装函数调用来存储/恢复所有寄存器来轻松测试:
pushal ; store all regs
; Call function as usual
push $48
push (%ebx)
push (%edx)
call nib_put_scr
addl $12, %esp
popal ; restore all regs
如果有帮助那么你就找到了问题。然后,您只需要确保在函数调用期间保留寄存器。这通常通过在函数调用之前将寄存器值推送到堆栈来完成,然后再将其值弹回。