【发布时间】:2017-09-01 06:36:39
【问题描述】:
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 员工;也就是说 12 月 60 日
mov ax, employees[esi].Years ;这永远不会得到正确的价值
如果我不使用对齐,那将是正确的
mov esi,TYPE Employee ;这是 57 dec mov ax,employees[esi].Years ;会得到正确的值 FF
mov esi,0 mov eax,0 mov ax, employees[esi].Years ; AX = 0xFF
是的,它绝对是正确的值,因为从基指针...尝试编译 mov esi,TYPE employee
使用 align 将无法获得正确的值,如果没有 align on struct 我可以获得正确的值...我尝试了将近 1 天来获取此信息
谁能告诉我正确的原因?
【问题讨论】:
-
我无法完全理解您的问题。无论如何,您是否考虑过填充?
-
您的问题几乎没有差异,这使得如果不实际使用自己的 MASM(我没有)就很难理解。如果
ALIGN在STRUCT中起作用,那么偏移量应该是IdNum=0, LastName=9, Years=40(39+1), SalaryHistory=44(42+2), ENDS=60(顺便说一句,第二个对齐只做+2,而不是+3,因为WORD是2B)。但是我不明白你是如何以内存视图结束的,其中年份0x30位于偏移量39,这就像ALIGN根本不起作用,或者你的填充DUP是错误的。qwords的内存视图令人困惑,请字节视图? -
再看一下那个内存视图,你的屏幕必须由与问题不同的源代码创建。如果
Years BYTE,那么没有对齐的Years可以在偏移量39,SalaryHistory可以是40,并且40+16 = 56,这将是有意义的。minimal reproducible example 可能会有所帮助(对于有MASM 和 VS,不适合我)。 -
Years WORD 30 ; 1- 我不这么认为 :-) 最后我检查了一下,一个单词是 两个 字节。 -
对不起,我忘记编辑了,因为我在我的 MASM 上编辑,没有重新写过,谢谢