【发布时间】:2020-09-06 13:24:47
【问题描述】:
.data
format: .asciz "%lx, %lx, %lx, %lx\n"
.text
.global main
.extern printf
main:
movq $6, %rax # op1
movq $7, %rbx # op2
movq $8, %r8 # id
movq $9, %r9 # signed
cmpq %rax, %rbx
jne _fakertn
_fakertn2:
pushq %rax
pushq %rbx
pushq %r8
pushq %r9
call _myfunc
xorq %rax, %rax
movq %rbp, %rsp
pop %rbp
ret
_fakertn:
jmp _fakertn2
_myfunc:
pushq %rbp
movq %rsp, %rbp
leaq format(%rip), %rdi
movq 16(%rbp), %r8
movq 24(%rbp), %rcx
movq 32(%rbp), %rdx
movq 40(%rbp), %rsi
xorq %rax, %rax
call printf
movq %rbp, %rsp
pop %rbp
movq $0, %rax
ret
我使用以下命令编译:gcc test.s -g -no-pie -o test
这是标准输出:
6、7、8、9
分段错误(核心转储)
在main函数中执行ret后出现分段错误。
我在这上面花了 5 个小时,仍然找不到原因。请帮助确定问题。谢谢!
【问题讨论】:
-
对于像这样的小程序,最好的调试方法是一次单步执行一条指令,并在每条指令之后检查寄存器和内存以确认它们是否符合您的预期他们要包含。在某些时候,您的期望会与现实背道而驰。这就是错误所在。