NASM在.text部分声明变量

时间:2015-07-18 14:19:56

标签: assembly 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跳过数据以便它不会执行我的字符串?

1 个答案:

答案 0 :(得分:1)

正如Jester所说,.text部分通常是只读,仅适用于可执行代码。

在IA32e上,您可以将它用作只读区域,但某些体系结构(例如Harvard 1 )可能在不同的地址空间中包含代码和数据而没有读取指令来自代码地址空间的数据。

此外,没有任何内容禁止具有仅执行访问权限的内存页面的架构,从而阻止读取但不取回该区域。

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