ret导致装配中的段错误

时间:2017-02-10 03:26:29

标签: assembly segmentation-fault x86-64

我有以下汇编代码:

.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会让程序跳回到原来的位置:但是,我遇到了分段错误。这是为什么?

1 个答案:

答案 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之后的指令。