为了我自己的病态,我正在为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
指向不接触内存的指令请忽略缺少正常的调用约定 - 除了系统调用接口之外我没有调用任何东西,并且在它甚至到达那么远之前崩溃了!
答案 0 :(得分:5)
'A'
毕竟被解释为一个地址。如果要将其用作常量,则需要编写:
cmp $'A', %al