2017-09-01 60 views
0

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的正确值,为什么?

enter image description here

但让我们尝试一些代码...

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天得到这些信息

有人能告诉我正确的原因吗?

+0

我不能完全明白你的问题。无论如何,你有没有考虑填充? –

+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

+0

再次看一下内存视图,您的屏幕必须由不同的源代码创建,而不是在问题中。如果“年BYTE”,那么“没有对齐的年份”可以在偏移量39,“SalaryHistory”可以是40,40和16 = 56. [MCVE]可能会有所帮助(对于某人有MASM和VS,不适合我)。 – Ped7g

回答

-1

通过笔者回答,硖欧文:

它看起来我们应该避免在结构定义中使用ALIGN

Answer pict

0

我对此也进行了测试,只需填写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 
+0

您好先生,我非常高兴您对我的帖子发表评论 但让我们尝试一下您的代码... mov esi,TYPE employee;这是60十二月,它说你的书上的索引号为1 mov ax,employees [esi]。年;这将永远不会得到正确的值 如果我没有使用对齐,这将是正确的 ---- mov esi,TYPE Employee;这是57 dec mov ax,employees [esi]。年;会得到正确的值FF –