代码之家  ›  专栏  ›  技术社区  ›  chasep255

NASM在.text节中声明变量

  •  3
  • chasep255  · 技术社区  · 9 年前

    我刚开始用nasm学习asm,我注意到如果我在.text部分声明一个变量,我的代码工作得非常好。只是想知道为什么我可以这样做,以及它与使用.data部分有何不同。我还注意到,在.bss部分中的变量名后面需要一个:,但在.data部分中不需要。这是为什么?

    section .text
        global _start
    
        _start:
            var: db "xyzzzzz"
    
    
            mov eax, 4
            mov ebx, 1
            mov ecx, var
            mov edx, 4
            int 0x80
    
            mov eax, 1
            int 0x80
    
    section .bss
        out: resb 1
        out2: resb 1
    
    
    
        4000b0: 78 79                   js     40012b <_start+0x7b>
      4000b2:   7a 7a                   jp     40012e <_start+0x7e>
      4000b4:   7a 7a                   jp     400130 <_start+0x80>
      4000b6:   7a b8                   jp     400070 <_start-0x40>
      4000b8:   04 00                   add    $0x0,%al
      4000ba:   00 00                   add    %al,(%rax)
      4000bc:   bb 01 00 00 00          mov    $0x1,%ebx
      4000c1:   b9 b0 00 40 00          mov    $0x4000b0,%ecx
      4000c6:   ba 04 00 00 00          mov    $0x4,%edx
      4000cb:   cd 80                   int    $0x80
      4000cd:   b8 01 00 00 00          mov    $0x1,%eax
      4000d2:   cd 80                   int    $0x80
    

    我还通过objdump运行了它。它似乎也有js和jp命令。这些是否告诉cpu跳过数据,使其不会执行我的字符串?

    1 回复  |  直到 9 年前
        1
  •  1
  •   user781847 user781847    9 年前

    正如杰斯特正确地说的, .text 截面通常为 只读 并且仅用于可执行代码。

    在IA32e上,您可以将其用作只读区域,但对于某些架构(例如哈佛 1. 一个)在不同的地址空间上具有代码和数据,而没有用于从代码地址空间读取数据的指令。

    此外,没有什么可以阻止架构拥有仅执行访问权限的内存页,从而阻止读取但不获取这些区域。

    1. 如果您想进行实验,可以在IA32e上对iTLB和dTLB进行去同步,以模拟哈佛机器!