.text和.data之间的区别

时间:2019-06-21 19:14:32

标签: assembly x86 nasm

我想知道就特定部分中的整个代码而言,数据部分和文本部分之间有什么区别。

我正在尝试运行在此添加的代码。 在数据段中,它运行并显示“ 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:

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

1 个答案:

答案 0 :(得分:3)

  

.text.data之间的差异

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

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

“部分标志”告诉操作系统该部分中存在哪种数据以及允许哪种操作:

  • SHF_EXECINSTR表示该节包含可以执行的代码。如果此标志未命中,则如果该部分包含代码,则该程序将在大多数操作系统中崩溃。较早的32位CPU不支持此功能,因此在运行32位程序时,许多操作系统都会忽略此标志。显然,您的操作系统会忽略此标志;否则,程序的.data变体将崩溃,因为代码位于.data部分。

  • SHF_WRITE意味着该节中的数据可以被覆盖。如果缺少此标志,而您正在尝试对该部分中的数据执行写操作,则程序将崩溃。

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