我声明了两个空格,我将使用它们作为数组。(这就是我所希望的)
WORM_X: .space 128
WORM_Y: .space 128它们将保持X和Y坐标。
我试着把一些值放在数组中,然后用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发布于 2011-11-21 16:51:36
调用库函数通常会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如果这有帮助,那么您就找到了问题所在。然后,您只需确保在函数调用期间保留寄存器。这通常是通过在函数调用之前将寄存器值推送到堆栈,然后在函数调用后弹出它们的值来完成的。
https://stackoverflow.com/questions/8197647
复制相似问题