2012-06-02 72 views
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除了系統調用接口以外的任何東西,這甚至在它得到那麼多之前崩潰!

+0

這是關於什麼?提出問題並立即回答? – hirschhornsalz

+0

我的意思是提出這個問題,但在提交之前(並且多次崩潰瀏覽器之後),我找到了答案。我繼續提出問題並回答,以防其他人偶然遇到同樣的問題。順便提一下,Stack Overflow在「提問問題」頁面上有一個複選框,可以讓您提交問題的答案。 – LnxPrgr3

+0

這是一個博客類型的問答,它是完全允許的,參考http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question以及http://stackoverflow.com/faq #questions「請環顧一下,看看你的問題是否曾經被問過,也可以問問並回答你自己的問題。」 –

回答

5

'A'畢竟被解釋爲地址。如果你想使用它作爲一個常數,你需要寫:

cmp $'A', %al