Assembly IA-32汇编:8位操作对32位寄存器的影响
在一门计算机科学课程中,有人给了我一个二进制文件,并要求我使用逆向工程技术(即,分解文件并对其进行分析)找出它的作用。 我偶然发现了一行IA-32指令:Assembly IA-32汇编:8位操作对32位寄存器的影响,assembly,x86,Assembly,X86,在一门计算机科学课程中,有人给了我一个二进制文件,并要求我使用逆向工程技术(即,分解文件并对其进行分析)找出它的作用。 我偶然发现了一行IA-32指令: add %esi,%ecx 我了解到后缀为l的命令在32位寄存器上运行,后缀为w的命令在16位寄存器上运行,我认为(但不知道),没有后缀的操作符在8位寄存器上运行。编辑:见罗斯·里奇的评论,它推翻了我的假设 因此,我的问题是: 我上面的假设正确吗 如果是这样,上述指令的效果是什么(与addl),以及其他操作(如sub、mov等)的效果是
add %esi,%ecx
我了解到后缀为l
的命令在32位寄存器上运行,后缀为w
的命令在16位寄存器上运行,我认为(但不知道),没有后缀的操作符在8位寄存器上运行。编辑:见罗斯·里奇的评论,它推翻了我的假设
因此,我的问题是:
addl
),以及其他操作(如sub
、mov
等)的效果是什么提前谢谢 如果给出正确的寄存器名,后缀通常被忽略/不重要。因此,上面的指令是32位指令,因为esi和ecx是32位寄存器。在同一文件中也出现了
addl
。编译器有时生成add
指令,有时生成addl
指令的原因是什么?编译器不会生成不同的指令。这只是散播者如何命名指令的问题。但是,例如,在addl$1的情况下,(%eax)
需要l
,这样就可以知道32位的值是written@user3389669注意,没有后缀意味着汇编程序从操作数推断操作的宽度。后缀b
在8位操作需要显式执行时使用。@FPK是的,这很有意义-很明显,如果你说%eax
与%rax
或%ax
相比,它将能够分辨出区别。很酷,今天学到了一些东西。@user3389669addl
用于消除参数大小不明确的情况下的歧义。像%eax
这样的参数是32位的,并且没有歧义(同样,%ax
是16位,%al
是8位)。诸如3(%esi)
之类的内存引用是不明确的,因为它不指示被引用数据的大小。汇编器知道在这种情况下要操作的数据大小的唯一方法是在指令助记符中(addl
,例如,指示32位值),或者通过参数上的修饰符,例如dword ptr
,或者通过其他明确的操作数。