Assembly 装配结构

Assembly 装配结构,assembly,x86,Assembly,X86,但当我在内存中看到它说使用57字节的空间 mov eax,TYPE Employee ; it says used 60byte space 因此,如果我使用该语句,我永远不会得到正确的值。 但是如果我把057h移到esi,我可以得到正确的值,即30h,为什么 但是让我们尝试一些代码 mov esi,员工类型;也就是说12月60日 mov ax,员工[esi]。年;这永远不会得到正确的值 如果我没有使用align,它将是正确的 mov esi,员工类型;也就是12月57日,雇员[esi]

但当我在内存中看到它说使用57字节的空间

mov eax,TYPE Employee ; it says used 60byte space
因此,如果我使用该语句,我永远不会得到正确的值。 但是如果我把057h移到esi,我可以得到正确的值,即30h,为什么

但是让我们尝试一些代码

mov esi,员工类型;也就是说12月60日

mov ax,员工[esi]。年;这永远不会得到正确的值


如果我没有使用align,它将是正确的


mov esi,员工类型;也就是12月57日,雇员[esi]年;将得到正确的值FF

mov esi,0 mov eax,0 mov ax,员工[esi]。年;AX=0xFF

是的,这绝对是正确的值,因为从基本指针…尝试编译movesi,键入employee

如果使用align,则无法获得正确的值,如果没有结构上的align,则可以获得正确的值。。。我试了差不多一天才得到这个信息


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

我也对这个问题进行了测试,只做了一个小小的改动,将LastName字段的所有30个字符都填上了。移到EDX的SIZEOF值实际上是0x3C(60十进制),这考虑了结构定义中的ALIGN语句。但是,当您在“调试内存”窗口中检查初始化的结构时,employees数组的每个实例仅占用0x39字节(57位小数)。这是我的源代码,显示了字段的十六进制偏移量:

一句话:使用字段初始值设定项声明结构实例时,ALIGN指令似乎对数据对齐没有影响

mov esi,SIZEOF Employee;
mov eax,employees[esi].Years

作者Kip Irvine回答:

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


我不能完全理解你的问题。无论如何,你考虑过填充吗?你的问题中几乎没有差异,这使得不使用自己的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
的内存视图令人困惑,字节视图请再次查看该内存视图,您的屏幕必须由与问题中不同的源代码创建。如果
年字节
,那么没有对齐的
可以在偏移量39处,
工资历史
可以在偏移量40处,并且40+16=56。可能会有帮助(对于有MASM和VS的人,而不是我);1-我不这么认为:-)上次我检查时,一个单词是两个字节。对不起,我忘记编辑了,因为我在MASM上编辑了,没有再重新编写。谢谢您好,先生,我很高兴您对我的帖子发表评论,但让我们试试您的代码。。。mov esi,员工类型;也就是12月60日,它在你的书mov ax,employees[esi]上写着索引1。年;如果我不使用align,这将永远不会得到正确的值,它将是正确的----movesi,TYPE Employee;也就是12月57日,雇员[esi]年;将得到正确的值FF
mov esi,SIZEOF Employee;
mov eax,employees[esi].Years
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
mov esi,0
mov eax,0
mov ax, employees[esi].Years         ; AX = 0xFF