【发布时间】:2012-06-02 11:44:44
【问题描述】:
为了我自己的病痛,我正在用 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指向一条不涉及内存的指令
请忽略缺乏正常的调用约定——除了系统调用接口之外,我没有调用任何东西,而且它甚至在它到达那么远之前就崩溃了!
【问题讨论】:
-
那是怎么回事?提出问题并立即回答?
-
我是想问这个问题,但在我提交之前(并且在我的浏览器多次崩溃之后)我找到了答案。我继续提交了问题并回答了它,以防其他人碰巧遇到同样的问题。顺便说一句,Stack Overflow 在“”页面上有一个复选框,可让您提交问题的答案。
-
是博客类型的问答,完全允许,参考meta.stackexchange.com/questions/17845/… 以及stackoverflow.com/faq#questions "请看看你的问题之前有没有被问过,问和答也可以你自己的问题。"
-
在这种情况下,我想要求指定您使用的汇编程序(可能是 nasm?),并非所有汇编程序都使用相同的 $ 常量约定。
-
好点!它是 GNU 汇编器 (
as),我已经更新了问题以反映这一点。
标签: linux assembly segmentation-fault x86-64