Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NASM在.text节中声明变量_Assembly_Nasm - Fatal编程技术网

Assembly NASM在.text节中声明变量

Assembly NASM在.text节中声明变量,assembly,nasm,Assembly,Nasm,我刚开始用nasm学习asm,我注意到如果我在.text部分声明一个变量,我的代码工作得非常好。我只是想知道为什么我可以这样做,它与使用.data部分有什么不同。我还注意到在.bss部分的变量名后面需要一个:而不是在.data部分。为什么会这样 section .text global _start _start: var: db "xyzzzzz" mov eax, 4 mov ebx, 1 mov ecx,

我刚开始用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
section.text
全球启动
_开始:
变量:db“xyzzzz”
mov-eax,4
mov-ebx,1
mov-ecx,var
mov edx,4
int 0x80
mov-eax,1
int 0x80
第2节bss
输出:resb 1
out2:resb 1
4000b0:78 79 js 40012b
4000b2:7a jp 40012e
4000b4:7a 7a jp 400130
4000b6:7a b8 jp 400070
4000b8:04 00添加$0x0,%al
4000ba:00添加%al,(%rax)
4000bc:bb 01 00 mov$0x1,%ebx
4000c1:b9 B000 4000MOV$0x4000b0,%ecx
4000c6:ba 04 00 mov$0x4,%edx
4000cb:cd 80整数$0x80
4000cd:b8 01 00 mov$0x1,%eax
4000d2:cd 80整数$0x80

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

正如Jester正确地说的,
.text
部分通常是只读的,仅用于可执行代码

在IA32e上,您可以将其用作只读区域,但某些体系结构(例如Harvard1体系结构)可能在不同的地址空间上有代码和数据,而不需要从代码地址空间读取数据的指令

此外,没有任何东西禁止体系结构拥有具有仅执行访问权限的内存页,从而防止在该区域读取而不获取


1如果您喜欢实验,可以在IA32e上对iTLB和dTLB进行去同步,以模拟哈佛大学的机器

注意,
.text
通常是只读的。当然,如果您将数据放入
.text
,您应该注意不要将其放入代码流中,否则cpu会尝试将其作为指令执行,正如您从反汇编中看到的那样(从
js
/
jp
将数据解释为指令)。您应该将
\u start
标签向下移动到实际代码。