汇编(x86)循环分段错误

时间:2011-11-19 21:54:46

标签: assembly x86

我已声明了两个空格,我将用作数组。 (无论如何,这就是我所希望的)

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

1 个答案:

答案 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

如果有帮助那么你就找到了问题。然后,您只需要确保在函数调用期间保留寄存器。这通常通过在函数调用之前将寄存器值推送到堆栈来完成,然后再将其值弹回。