【问题标题】:NASM Segmentation fault when modifying a variable that should be in the read-write .data section (section .data doesn't work without a space?)修改应该在读写 .data 部分中的变量时出现 NASM 分段错误(.data 部分没有空格就不能工作?)
【发布时间】:2020-03-12 13:22:35
【问题描述】:

我在使用 SASM 在 NASM 中编写的程序时遇到问题,我使用变量作为计数器,一旦我修改它并尝试将新值保存在内存中使用的地址中,我得到一个分段错误。 以下是有关变量的代码:

section.data
p_count DW 0

section.text
global CMAIN
CMAIN:
    mov ebp, esp; for correct debugging
    mov bx, [p_count]
    inc bx
    mov [p_count], bx

    ret

程序到达最后一行时停止运行。 任何人都知道问题可能是什么?

【问题讨论】:

  • 请发布可用于重现问题的完整最小示例。
  • 我修改了帖子中的代码以包含它。
  • section.text 行在单词“section”和部分名称之间缺少一个空格。 .data 也一样。

标签: assembly x86 nasm


【解决方案1】:

您忘记了section.data(和.text)中的空格,所以默认情况下所有内容都进入只读.text部分。

section.data 被解析为一个标签,就像foo.bar: 一样,而不是section 指令。当标签名称不是像loop:这样的有效指令助记符时,标签末尾的冒号是可选的

相反的错误(有效的section .data 但有错误的section.text)导致将您的代码放入.data,该.data 链接到不可执行的内存页面。在这种情况下,你会从第一条指令中提取代码的段错误!


你应该从 NASM 收到这样的警告:

warning: label alone on a line without a colon might be in error [-w+orphan-labels]

如果您的 NASM 未发出警告,请使用默认开启的较新版本,
或使用 -Worphan-labels 运行 NASM 以启用有用的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 2020-10-31
    • 2016-03-24
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多