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天得到这些信息
有人能告诉我正确的原因吗?
我不能完全明白你的问题。无论如何,你有没有考虑填充? –
在你的问题中几乎没有差异,这使得在实际使用自己的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