這個問題在這里已經有了答案: _start 中 RET 上的 Nasm 分段錯誤 1 ??個答案 18 小時前關閉。
我寫了一些簡單的匯編代碼,如下所示:
.global _start
.text
_start:
call _sum
subq $0x8, %rsp
popq %rax
ret
_sum:
ret
為了在 'popq' 指令之后得到 %rax 的值,
我使用“as”和“ld”命令組裝了該代碼。我通過在'_start'處放置斷點來啟動gdb除錯器
結果如下:
B > │0x400078 <_start> callq 0x400083 <_sum>
│ │0x40007d <_start 5> sub $0x8,%rsp
│ │0x400081 <_start 9> pop %rax
│ │0x400082 <_start 10> retq
│ │0x400083 <_sum> retq
但是,在進入 pop 指令之前,會出現一條錯誤訊息,指出
程式收到信號 SIGSEGV,分段錯誤。無法訪問地址 0x1 處的記憶體
(當我將 $0x8 更改為 $0x0~$0x7 時,一切正常。)
似乎在第一階段 sum 函式可能是問題所在。因為它實際上什么都不做,只是回傳。
那么,如何在 popq 指令之后修改此代碼以獲取 %rax 的值?
謝謝。
uj5u.com熱心網友回復:
我認為這個問題可能是重復的,但無論如何,您的代碼中存在一個問題。
.global _start
.text
_start:
call _sum
subq $0x8, %rsp
popq %rax
ret # <-- return to where?
_sum:
ret
mainC中的 A必須可以回傳,因為_start最終會呼叫main,但在這里,您是_start直接撰寫的。如果你放一個ret.
代替ret,將其改為。
movl $60,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443205.html
上一篇:初始化調色板組件
