x86汇编地址分配规则咨询:为何数值3存储在地址Z+8
x86汇编地址分配逻辑解答
首先明确x86汇编常用数据定义伪指令的内存占用规则:
DB(定义字节):单字节数据,每个元素占1字节DW(定义字):双字节数据,每个元素占2字节DD(定义双字):四字节数据,每个元素占4字节
你疑问的Z标签分配逻辑
代码中Z DD 1,2,3表示从标签Z指向的内存地址开始,连续分配3个双字(4字节)的内存空间,按顺序存放初始值1、2、3。汇编器分配内存时会按定义顺序连续排布,无额外间隔,因此三个值的相对地址计算如下:
- 初始值1:对应
Z的起始地址,相对偏移为0,即地址Z + 0 - 初始值2:顺延4字节,相对偏移为4,即地址
Z + 4 - 初始值3:再顺延4字节,相对偏移为8,即地址
Z + 8
这就是注释标注3存储在Z+8的核心原理。
补充:整体数据段分配参考
如果汇编器未开启内存对齐,你给出的完整数据段所有变量的相对偏移(从数据段起始地址算起)如下,方便你理解全局分配逻辑:
.DATA var DB 64 ; 偏移0,占1字节 var2 DB ? ; 偏移1,占1字节 DB 10 ; 偏移2,占1字节 X DW ? ; 偏移3,占2字节(覆盖3、4两个地址) Y DD 3000 ; 偏移5,占4字节(覆盖5、6、7、8四个地址) Z DD 1,2,3 ; 起始偏移为9,三个元素分别占9-12、13-16、17-20四个地址
如果开启了内存对齐,X、Y、Z的起始偏移会调整到对应类型的对齐边界(比如双字要对齐到4的倍数地址),但Z内部三个元素的相对偏移始终是0、4、8,不会变化。
内容的提问来源于stack exchange,提问作者Phillip
相关产品推荐
相关产品推荐

