Assembly 装配结构
但当我在内存中看到它说使用57字节的空间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]
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