>我有以下汇编代码:
.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 能让程序跳回到原来的位置:但是,我得到了一个分段错误。这是为什么呢?
这些问题几乎总是由未能清理堆栈引起的。 在您的情况下也是如此。
您首先是:
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
后的指令。