我刚开始用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来模拟哈佛机器!