为了我自己生病的乐趣,我正在用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