1
爲了我自己的生病愉快,我正在爲Linux編寫一個x86_64程序集的小程序。然而,我在一個比較立即操作數和寄存器的指令中遇到了一個段錯誤,這對我來說絕對沒有意義。是什麼賦予了?Segfault正在運行cmp'A',%al‽
這裏的領導到崩潰的代碼:
_start:
sub $8, %rsp
mov %rsp, %rbx
lea le_string(%rip), %rsi
mov %rsi, %rdi
add $8, %rdi
mov $26, %cl
mov (%rsi), %al
cmp 'A', %al /* This line segfaults */
/* snip code that never runs */
le_string:
.ascii "YrFgevat"
我與gcc -nostdlib
,這是調用GNU彙編組裝。
大跌後傾寄存器顯示:
%rsi
包含預期的字符串指針%al
包含字符串在預期第一個字符%rip
指向不指令touch memory
請忽略缺少正常調用約定 - 我不是c除了系統調用接口以外的任何東西,這甚至在它得到那麼多之前崩潰!
這是關於什麼?提出問題並立即回答? – hirschhornsalz
我的意思是提出這個問題,但在提交之前(並且多次崩潰瀏覽器之後),我找到了答案。我繼續提出問題並回答,以防其他人偶然遇到同樣的問題。順便提一下,Stack Overflow在「提問問題」頁面上有一個複選框,可以讓您提交問題的答案。 – LnxPrgr3
這是一個博客類型的問答,它是完全允許的,參考http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question以及http://stackoverflow.com/faq #questions「請環顧一下,看看你的問題是否曾經被問過,也可以問問並回答你自己的問題。」 –