我刚开始用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跳过数据以便它不会执行我的字符串?
答案 0 :(得分:1)
正如Jester所说,.text
部分通常是只读,仅适用于可执行代码。
在IA32e上,您可以将它用作只读区域,但某些体系结构(例如Harvard 1 )可能在不同的地址空间中包含代码和数据而没有读取指令来自代码地址空间的数据。
此外,没有任何内容禁止具有仅执行访问权限的内存页面的架构,从而阻止读取但不取回该区域。
1 如果您想进行实验,可以在IA32e上取消同步iTLB和dTLB以模拟哈佛机器!