Segfault运行cmp'A',%al‽

Lnx*_*gr3 1 linux assembly x86-64 segmentation-fault

为了我自己的病态,我正在编写一个用于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"
Run Code Online (Sandbox Code Playgroud)

我正在组装gcc -nostdlib,它正在调用GNU汇编程序.

崩溃后倾倒寄存器显示:

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

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

Lnx*_*gr3 5

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

cmp $'A', %al
Run Code Online (Sandbox Code Playgroud)