我有以下汇编代码:
.text
.global main
main:
push %r13
push %r14
push %r15
jmp rest
x:
.data
y0: .quad 0
.text
mov %r14, y0
mov $format,%rdi
push y0
popq %rsi
movq %rsi, %r15
call printf
mov $format,%rdi
mov $10,%rsi
call printf
ret
rest:
movq $5, %r9
pushq %r9
popq %rsi
movq %rsi, %r14
jmp x
mov $0,%rax
pop %r15
pop %r14
pop %r13
ret
.data
format:
.byte 37
.byte 108
.byte 117
.byte 0
我希望ret会让程序跳回到原来的位置:但是,我遇到了分段错误。这是为什么?
答案 0 :(得分:2)
由于未能清理堆栈而导致这些问题几乎始终。在你的情况下也是如此。
首先:
main:
push %r13
push %r14
push %r15
jmp rest
然后在rest
内
jmp x
在x
内执行此操作:
mov $format,%rdi
mov $10,%rsi
call printf
ret
这会让你在堆栈上留下三件没有处理过的东西。执行此ret
时,它会将先前的%r15
值移动到指令指针和段错误中。
ret
不会从跳跃中返回。它返回call
之后的指令。