Assembly .text和.data之间的差异

Assembly .text和.data之间的差异,assembly,x86,nasm,Assembly,X86,Nasm,我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别 我试图运行我在这里添加的代码。 在数据部分,它运行并打印“af)a” 如果我将其更改为第2行中的文本部分,则表示seg故障 我搞不清楚关键的区别是什么。 谢谢:) 预期代码会产生相同的结果,但事实证明并非如此 .text和.data 我不知道MASM汇编程序,但GNU汇编程序有两个区别: 名称(.text在一种情况下,另一种情况下,.data)。但是,此名称被操作系统忽略 可执行文件中的节标志: SHF_ALLOC | SHF_EX

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

我试图运行我在这里添加的代码。 在数据部分,它运行并打印“af)a” 如果我将其更改为第2行中的文本部分,则表示seg故障

我搞不清楚关键的区别是什么。 谢谢:)

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

.text
.data

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

  • 名称(
    .text
    在一种情况下,另一种情况下,
    .data
    )。但是,此名称被操作系统忽略
  • 可执行文件中的节标志:
    • SHF_ALLOC | SHF_EXECINSTR
      用于
      .text
    • SHF|u ALLOC;SHF|u WRITE
      for
      。data
  • “节标志”告诉操作系统节中存在什么类型的数据以及允许什么类型的操作:

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

    • SHF_WRITE
      表示可以覆盖节中的数据。如果缺少此标志,并且您正试图对节中的数据执行写入操作,则程序将崩溃


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

    文本部分可执行但不可写,数据部分可写但不可执行。某些操作系统无法执行“不执行”规则。
    。text
    通常是只读的可执行文件
    .data
    是读写的,不应该是可执行的,尽管有时(如您的情况)是可执行的。请注意,这些只是内置的默认属性。另请参见nasm手册。您的代码似乎过于复杂。使用慢速
    循环
    指令,但在循环内将循环计数器重置为
    3
    。您可以使用
    pushad
    /
    popad
    无原因地保存/恢复所有寄存器。只需使用
    jmp\u start
    而不是
    loop
    。或者,如果你想要一个非无限循环,请为计数器使用不同的寄存器。。这是我的教授,hahaYou可以通过链接
    gcc-zexecstack
    获得可执行的
    .data
    (以及堆栈和BSS)。
    ld
    手册页文档
    ld-N
    (又称
    ld--omagic
    )授予文本段读写权限。(并且
    .text
    部分链接到可执行文件的文本段)。
    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: