gpt4 book ai didi

linux - "movl(%ebx), %eax"段错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:44 27 4
gpt4 key购买 nike

我已经用汇编编写了一个程序,输入后:

as -32 maximum.s -o maximum.o
ld -m elf_i386 maximum.o -o maximum
./maximum

它显示段错误,当我使用 gdb 调试时,gdb 说:

Program received signal SIGSEGV, Segmentation fault.
max() at maximum.s:27
27 movl(%ebx), %eax

我的代码是:

section .date
data_items:
.long 23,35,67,89,212,45,233,63,45

.section .text

.globl _start
_start:
movl $data_items, %eax
pushl %eax
call max
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80

.type max, @function
max:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $0, %ecx
movl 8(%ebp), %ebx
movl 8(%ebp), %edx
movl (%ebx), %eax
addl $36, %edx
movl %edx, -4(%ebp)

loop_start:
movl -4(%ebp), %edx
cmpl %ebx, %edx
je loop_end
addl $4, %ebx
movl (%ebx), %edx
cmpl %eax, %edx
jle loop_start
movl %edx, %eax
jmp loop_start

loop_end:
movl %ebp, %esp
popl %ebp
ret

为什么以及如何修复它?

最佳答案

要调试 x86 asm 代码,请使用具有 asm 模式的调试器。 x86 tag wiki有一些有用的东西的链接,以及如何使用 gdb for asm 的说明。单步执行代码,并查看寄存器中的值发生变化时的情况。带有 layout reg 的 gdb 会在每条指令后突出显示更改的寄存器。

您可能将数据视为地址。我遵循了你的代码一段时间,但没有花时间来确定是否存在问题。

不是错误,而是

movl 8(%ebp), %ebx 
movl 8(%ebp), %edx

应该是

movl 8(%ebp), %ebx 
movl %ebx, %edx # more efficient, and shorter

关于linux - "movl(%ebx), %eax"段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467847/

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