-
-
[旧帖] 结构体数组使用align后的诡异情况 0.00雪花
-
发表于: 2014-1-14 10:18 1984
-
inter汇编语言程序设计》第五版10.1.3中的一个例子:
定义结构体:
Employee STRUCT
id BYTE "000000000"
lastname BYTE 30 DUP(1)
ALIGN WORD
Years WORD 8
ALIGN DWORD
SalaryHistory DWORD 1000h, 2000h, 3000h, 4000h
Employee ENDS
该结构体在内存中的布局为:
总存储大小为60个字节
再用该结构体声明一个结构体数组:
department Employee 5 DUP(<>)
利用调试器查看内存时发现数组中的每个元素都变成了145个字节:
lastname和years之间多了44个字节,years和salary之间也多了44个字节,不管是填充的字节数量和years、salary的起始地址,这都不符合对齐原则吧
但是用TYPE department获得的字节数却是60字节,和实际存储的字节不符,并且对department中的元素进行寻址时,地址完全对不上了,
如:mov ax, department.Years //years被初始化为8
实际读取的结果:
ax为0,从内存代码可知实际读取的是00402028处的值,而years在初始化时被放在了00402053,
更诡异的是,在department后再声明两个变量:
department Employee 5 DUP(<>)
a WORD 65535 //0xffff
b WORD 65534 //0xfffe
通过调试器查看内存发现a和b的值已经覆盖了department中的部分数据:
注意看00402120这行最后四个字节,这里本来是department第三个元素存放的位置,但是a和b的值覆盖了4个字节
哪位高人能给指点下,定义成数组后结构体被扩充到这么大是不是正常的?如果是正常,又是依照什么标准进行扩充?而且扩充后WORD和DWORD类型并没有对齐啊;
如果这种扩充是不正确的,哪又是什么原因造成的呢?
就20kx,全压上了,还望高人不吝赐教啊,纠结好久了
定义结构体:
Employee STRUCT
id BYTE "000000000"
lastname BYTE 30 DUP(1)
ALIGN WORD
Years WORD 8
ALIGN DWORD
SalaryHistory DWORD 1000h, 2000h, 3000h, 4000h
Employee ENDS
该结构体在内存中的布局为:
总存储大小为60个字节
再用该结构体声明一个结构体数组:
department Employee 5 DUP(<>)
利用调试器查看内存时发现数组中的每个元素都变成了145个字节:
lastname和years之间多了44个字节,years和salary之间也多了44个字节,不管是填充的字节数量和years、salary的起始地址,这都不符合对齐原则吧
但是用TYPE department获得的字节数却是60字节,和实际存储的字节不符,并且对department中的元素进行寻址时,地址完全对不上了,
如:mov ax, department.Years //years被初始化为8
实际读取的结果:
ax为0,从内存代码可知实际读取的是00402028处的值,而years在初始化时被放在了00402053,
更诡异的是,在department后再声明两个变量:
department Employee 5 DUP(<>)
a WORD 65535 //0xffff
b WORD 65534 //0xfffe
通过调试器查看内存发现a和b的值已经覆盖了department中的部分数据:
注意看00402120这行最后四个字节,这里本来是department第三个元素存放的位置,但是a和b的值覆盖了4个字节
哪位高人能给指点下,定义成数组后结构体被扩充到这么大是不是正常的?如果是正常,又是依照什么标准进行扩充?而且扩充后WORD和DWORD类型并没有对齐啊;
如果这种扩充是不正确的,哪又是什么原因造成的呢?
就20kx,全压上了,还望高人不吝赐教啊,纠结好久了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- 结构体数组使用align后的诡异情况 1985
- [求助]请教汇编ALIGN伪指令的问题 5814
- [分享]国外的IDA Pro视频教程 3065
- [求助]OD设置断点的问题 1285
看原图
赞赏
雪币:
留言: