Segfault运行cmp'A',%al‽

时间:2012-06-02 11:44:44

标签: linux assembly segmentation-fault x86-64

为了我自己的病态,我正在为Linux编写x86_64程序集中的一个小程序。但是,在一个比较立即操作数和寄存器的指令中,我遇到了一个对我来说完全没有意义的段错误。是什么给了什么?

以下是导致崩溃的代码:

_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指向不接触内存的指令

请忽略缺少正常的调用约定 - 除了系统调用接口之外我没有调用任何东西,并且在它甚至到达那么远之前崩溃了!

1 个答案:

答案 0 :(得分:5)

'A'毕竟被解释为一个地址。如果要将其用作常量,则需要编写:

cmp $'A', %al