2012-06-02 70 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