.text .data 和 main 的分段错误(.data 部分中的 main)

segmentation fault with .text .data and main (main in .data section)

我只是想将 myarray[0] 的值加载到 eax:

        .text
        .data

        # define an array of 3 words
array_words:     .word 1, 2, 3

        .globl main

main:
        # assign array_words[0] to eax
        mov [=10=], %edi
        lea array_words(,%edi,4), %eax

但是当我 运行 这样做时,我不断遇到段错误。 有人可以指出我在这里做错了什么吗?

标签 main 似乎在 .data 部分。

它会导致不允许在 .data 部分执行代码的系统出现分段错误。 (大多数现代系统映射 .data 具有读取和写入权限,但没有执行权限。)

程序代码应在 .text 部分。 (阅读+执行)

令人惊讶的是,在 GNU/Linux 系统上,手写的 asm 通常会生成可执行文件 .data 除非你小心避免这种情况,所以这通常不是真正的问题:见 Why data and stack segments are executable? 但是将代码放在 .text 它所属的地方可以使一些调试工具更好地工作。


您还需要从 main ret 或调用 exit(或进行 _exit 系统调用),这样执行就不会在 main 结束时中断进入接下来的任何字节。参见

您需要正确终止您的程序,例如在 Linux x86_64 上调用 sys_exit 系统调用:

...
main:
     # assign array_words[0] to eax
     mov [=10=], %edi
     lea array_words(,%edi,4), %eax

     mov , %rax       # System-call "sys_exit"
     mov [=10=], %rdi        # exit code 0
     syscall

否则程序将继续执行最后一条指令之后的内存内容,这很可能在所有情况下都是无效指令(甚至是无效内存位置)。