大会 - 结构
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,类型的员工;这就是说60年代
mov ax,employees [esi] .Years;这将是永远无法得到正确的价值
如果我因此未使用对齐,这将是正确的
MOV ESI,类型的员工;这是57 dec mov ax,employees [esi]。年;将得到正确的值FF
mov esi,0 mov eax,0 mov ax,employees [esi] .Years; AX = 0xFF的
是其绝对正确的价值,因为从基指针...尝试编译MOV ESI,类型的员工
与之对齐这将是不能得到正确的值,而对结构对齐我可以得到适当的价值...我试了差不多1天得到这些信息
有人能告诉我正确的原因吗?
通过笔者回答,硖欧文:
它看起来我们应该避免在结构定义中使用
ALIGN
。
我对此也进行了测试,只需填写LastName字段的所有30个字符进行一些小改动。移至EDX的SIZEOF值确实为0x3C(60十进制),它将结构定义中的ALIGN语句考虑在内。但是,当您在“调试内存”窗口中检查初始化结构时,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
好消息是,下列说法正确的 “年” 的数值装入AX寄存器:
mov esi,0
mov eax,0
mov ax, employees[esi].Years ; AX = 0xFF
您好先生,我非常高兴您对我的帖子发表评论 但让我们尝试一下您的代码... mov esi,TYPE employee;这是60十二月,它说你的书上的索引号为1 mov ax,employees [esi]。年;这将永远不会得到正确的值 如果我没有使用对齐,这将是正确的 ---- mov esi,TYPE Employee;这是57 dec mov ax,employees [esi]。年;会得到正确的值FF –
我不能完全明白你的问题。无论如何,你有没有考虑填充? –
在你的问题中几乎没有差异,这使得在实际使用自己的MASM(我没有)的情况下难以遵循。如果'STRUCT'中的'ALIGN'起作用,那么偏移应该是IdNum ='0',LastName ='9',Years ='40'(39 + 1),SalaryHistory ='44'(42 + 2), ENDS ='60'(注意,第二个对齐只做+2,而不是+3,因为'WORD'是2B)。但是后来我不明白你如何结束内存视图,其中'0x30'年的偏移量为'39',这就像'ALIGN'根本不工作,或者'DUP'填充错误。那个'qwords'的内存视图很混乱,字节视图请问? – Ped7g
再次看一下内存视图,您的屏幕必须由不同的源代码创建,而不是在问题中。如果“年BYTE”,那么“没有对齐的年份”可以在偏移量39,“SalaryHistory”可以是40,40和16 = 56. [MCVE]可能会有所帮助(对于某人有MASM和VS,不适合我)。 – Ped7g