Assembly NASM在.text节中声明变量
我刚开始用nasm学习asm,我注意到如果我在.text部分声明一个变量,我的代码工作得非常好。我只是想知道为什么我可以这样做,它与使用.data部分有什么不同。我还注意到在.bss部分的变量名后面需要一个:而不是在.data部分。为什么会这样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,
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
标签向下移动到实际代码。