RET 导致程序集中出现段错误



>我有以下汇编代码:

.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后的指令。

相关内容

  • 没有找到相关文章

最新更新