为了我自己的病痛,我正在用 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 -nostdlib
GNU 汇编器进行组装。
崩溃后转储寄存器显示:
%rsi
包含指向字符串的预期指针%al
包含字符串中预期的第一个字符%rip
指向不涉及内存的指令
请忽略缺乏正常的调用约定——除了系统调用接口之外,我没有调用任何东西,而且它甚至在它到达那么远之前就崩溃了!