[英]ret is causing a segfault in assembly
我有以下匯編代碼:
.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
的指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.