.text 和 .data 之间的区别

difference between .text and .data

我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别。

我正在尝试 运行 我在此处添加的代码。 在数据部分 运行s 并打印 "af)a" 如果我将它更改为第 2 行的文本部分,它会出现段错误。

我无法弄清楚关键区别是什么。 谢谢 :)

global _start
section .data

_start: mov ecx, 3
    xor byte [_start + 1], 0x02
    pushad  
    mov eax, 4
    mov ebx, 1
    mov edx, ecx
    mov ecx, dword blah
    int 0x80
blah:   popad
    sub bx, ax
    loop _start
    mov eax, 1
    mov ebx, 2
    int 0x80
fin:

预期代码会产生相同的结果,但事实证明并非如此。

difference between .text and .data

我不知道 MASM 汇编器,但 GNU 汇编器有两个区别:

  1. 名称(在一种情况下为.text,在另一种情况下为.data)。但是,此名称被操作系统忽略
  2. 可执行文件中的段标志:
    • SHF_ALLOC | SHF_EXECINSTR 对于 .text
    • SHF_ALLOC | SHF_WRITE 对于 .data

"section flags" 告诉操作系统该部分中存在什么样的数据以及允许什么样的操作:

  • SHF_EXECINSTR表示该段包含可以执行的代码。如果此标志未命中,如果该部分包含代码,程序将在大多数 OS 秒内崩溃。旧的 32 位 CPU 不支持这个,所以这个标志在 运行 32 位程序时被许多 OS 忽略。显然,你的 OS 忽略了这个标志;否则程序的 .data 变体会崩溃,因为代码位于 .data 部分。

  • SHF_WRITE表示该段中的数据可以被覆盖。如果缺少此标志并且您正在尝试对该部分中的数据执行写操作,程序将崩溃。

当然可以通过 .text 部分设置 SHF_WRITE 标志的方式来操作可执行文件。 (并且一些汇编器允许直接为 .text 部分设置此标志。)在这种情况下,如果您写入 .text 部分,您的程序将不会崩溃。