.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
否则程序将继续执行最后一条指令之后的内存内容,这很可能在所有情况下都是无效指令(甚至是无效内存位置)。
我只是想将 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
否则程序将继续执行最后一条指令之后的内存内容,这很可能在所有情况下都是无效指令(甚至是无效内存位置)。