1

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

这是导致崩溃的代码:

_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 -nostdlibGNU 汇编器进行组装。

崩溃后转储寄存器显示:

  • %rsi包含指向字符串的预期指针
  • %al包含字符串中预期的第一个字符
  • %rip指向不涉及内存的指令

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

4

1 回答 1

5

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

cmp $'A', %al
于 2012-06-02T11:44:44.630 回答