在.text节中声明NASM变量



我刚开始用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跳过数据,以便它不会执行我的字符串?

正如Jester正确地说,.text节通常是只读的,并且仅用于可执行代码。

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

也没有禁止一个体系结构拥有只执行访问权限的内存页,从而阻止读取但不读取该区域。

1如果您喜欢实验,您可以在IA32e上设计iTLB和dTLB来模拟哈佛机器!

最新更新