2011-11-19 83 views
3

我已經聲明瞭兩個空格,我將其用作一個數組。 (這正是我所希望的)程序集(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

發佈seg故障的堆棧跟蹤一定會有所幫助。 – steve

+0

如何檢查堆棧跟蹤? – Bewn

+0

你是哪個操作系統? – steve

回答

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 

如果然後幫助你發現問題。您只需確保在函數調用期間保留寄存器。這通常通過在函數調用之前將寄存器值推入堆棧,然後在之後將其值返回來完成。

+0

感謝您的答案!在我使用pushal和popal後它工作得很好!非常感謝! :) – Bewn