为了我自己生病的乐趣,我正在用x86_64汇编语言为linux编写一个小程序。然而,在一条将立即数操作数与寄存器进行比较的指令中,我遇到了一个对我来说完全没有意义的segfault。给什么?
下面是导致坠机的代码:

_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"

我正在使用调用gnu汇编程序的gcc -nostdlib进行汇编。
崩溃后转储寄存器会显示:
%rsi包含指向字符串的预期指针
%al包含字符串中预期的第一个字符
%rip指向不接触内存的指令
请忽略缺乏正常的调用约定-除了syscall接口之外,我没有调用任何东西,而且在它达到那个程度之前就崩溃了!

最佳答案

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

cmp $'A', %al

07-24 09:45
查看更多