gpt4 book ai didi

汇编 (x86) 循环段错误

转载 作者:行者123 更新时间:2023-12-02 19:18:50 26 4
gpt4 key购买 nike

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

WORM_X: .space 128
WORM_Y: .space 128

它们将保存 X 和 Y 坐标。

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

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

(顺便说一句,我是汇编的初学者)

# 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

最佳答案

调用库函数通常会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

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

关于汇编 (x86) 循环段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com