Employee STRUCT
IdNum BYTE "000000000" ; 9
LastName BYTE 30 DUP(0) ; 30
ALIGN WORD ; 1 byte added
Years WORD 30 ; 2
ALIGN DWORD ; 2 byte added
SalaryHistory DWORD 0,0,0,0 ; 16
Employee ENDS
employees Employee 5 DUP (<"123456789","AAAAAAAA",30h,4 DUP(0EEEEEEEEh)>)
当我使用
时mov eax,TYPE Employee ; it says used 60byte space
但是当我在内存上看到它说使用了57个字节的空间
mov esi,SIZEOF Employee;
mov eax,employees[esi].Years
所以,如果我使用该陈述,我永远不会得到正确的价值。 但如果我把057h移到esi,我可以得到正确的值30h,为什么?
但是让我们尝试一些代码......
mov esi,TYPE员工;这是说60月12日
mov ax,employees [esi] .Years;这将永远不会得到正确的价值
如果我没有使用对齐,那就是正确的
mov esi,TYPE Employee;员工[esi]。这是57 dec mov ax。会得到正确的值FF
mov esi,0 mov eax,0 mov ax,employees [esi] .Years; AX = 0xFF
是的,它绝对是正确的值,因为从基指针...尝试编译mov esi,TYPE员工
使用对齐它将无法获得正确的值,如果没有对齐结构我可以得到正确的值...我试了将近1天来获取此信息
有人能告诉我正确的理由吗?
答案 0 :(得分:0)
我也对此进行了测试,通过填写LastName字段的所有30个字符进行了一些小改动。移到EDX的SIZEOF值确实是0x3C(十进制60),它考虑了结构定义中的ALIGN语句。但是,当您检查Debug Memory窗口中的初始化结构时,employees数组的每个实例仅占用0x39字节(十进制57)。这是我的源代码,显示了字段的十六进制偏移量:
结论:当您使用字段初始化程序声明结构的实例时,ALIGN指令似乎对数据的对齐没有影响。
Employee STRUCT
IdNum BYTE "000000000"
LastName BYTE 30 DUP(0)
ALIGN WORD
Years WORD 30
ALIGN DWORD
SalaryHistory DWORD 0, 0, 0, 0
Employee ENDS
.data
employees Employee 5 DUP(<"111111111", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0FFh, 4 DUP(0EEEEEEEEh)>)
; hex offsets: 00--08, 09-26, 27-28, 29-38.
.code
main proc
mov eax,offset employees
mov edx,SIZEOF Employee ; 0x3C
好消息是,以下陈述正确加载了&#34;年&#34;进入AX寄存器:
mov esi,0
mov eax,0
mov ax, employees[esi].Years ; AX = 0xFF
答案 1 :(得分:-1)
作者回答,Kip Irvine:
看起来我们应该避免在结构定义中使用
ALIGN
。