【问题标题】:Segfault running cmp 'A', %al‽段错误运行 cmp 'A', %al‽
【发布时间】: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


【解决方案1】:

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

cmp $'A', %al

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2022-11-28
    • 2017-01-04
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多