首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组件(x86)循环分段故障

组件(x86)循环分段故障
EN

Stack Overflow用户
提问于 2011-11-20 05:54:46
回答 1查看 811关注 0票数 3

我声明了两个空格,我将使用它们作为数组。(这就是我所希望的)

代码语言:javascript
复制
WORM_X: .space 128
WORM_Y: .space 128

它们将保持X和Y坐标。

我试着把一些值放在数组中,然后用nib_put_scr把它们打印在屏幕上,这是一个使用curses.h的C函数。

当我运行这段代码时,我得到了分段错误。现在有人知道我做错了什么吗?

(我对组装btw完全是个初学者)

代码语言:javascript
复制
# 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-21 16:51:36

调用库函数通常会destroy the eax/ecx/edx registers。我猜测对nib_put_scr的调用正在销毁这些寄存器的内容,在ncurses内部。

您可以通过使用操作码包装函数调用来轻松地测试这一点,以存储/恢复所有寄存器:

代码语言:javascript
复制
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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8197647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档