首页
社区
课程
招聘
[旧帖] 结构体数组使用align后的诡异情况 0.00雪花
发表于: 2014-1-14 10:18 1966

[旧帖] 结构体数组使用align后的诡异情况 0.00雪花

2014-1-14 10:18
1966
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,全压上了,还望高人不吝赐教啊,纠结好久了

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//