Assembly 汇编指令如何区分寄存器、内存地址、立即数或偏移量参数?

Assembly 汇编指令如何区分寄存器、内存地址、立即数或偏移量参数?,assembly,parameters,x86,decoding,instruction-set,Assembly,Parameters,X86,Decoding,Instruction Set,我一直在想,是否有一些不可见的操作码或标志或任何东西告诉汇编指令如何处理其参数?我有点困惑,因为显然同一条指令可以使用不同类型的操作数进行操作—支持寄存器、内存地址、偏移量和立即数 汇编程序的“文本表示”中似乎没有任何额外的细节,但二进制中可能存在差异,例如,一些位被切换,以便CPU知道使用哪种类型的操作数?指令在硬件中编码。具体如何做到这一点取决于CPU。在x86体系结构上,有些位定义了操作数寻址模式。有关更多详细信息,请参阅《英特尔程序员参考手册》,其中有详细说明 有时,有些指令具有不同的操

我一直在想,是否有一些不可见的操作码或标志或任何东西告诉汇编指令如何处理其参数?我有点困惑,因为显然同一条指令可以使用不同类型的操作数进行操作—支持寄存器、内存地址、偏移量和立即数


汇编程序的“文本表示”中似乎没有任何额外的细节,但二进制中可能存在差异,例如,一些位被切换,以便CPU知道使用哪种类型的操作数?

指令在硬件中编码。具体如何做到这一点取决于CPU。在x86体系结构上,有些位定义了操作数寻址模式。有关更多详细信息,请参阅《英特尔程序员参考手册》,其中有详细说明

有时,有些指令具有不同的操作码和相同的效果,在这种情况下,汇编程序可以选择一个


如果您愿意,助记符是“重载”的,并且根据操作数的类型引用多个不同的实际指令。@KerrekSB-我最感兴趣的是,不同的指令是否隐藏在一个名称后面,比如重载函数,或者它与CPU在硬件中动态解码的一些额外数据编码的功能相同?如果您对x86感兴趣,请查看;这一点在那里描述得非常清楚。初始字节是固定的,但操作数在指令的后续字节中以系统的方式进行编码。@KerrekSB-如果您能告诉我该在哪里查找,可能会有所帮助。我有两本关于组装的书,相当新,一本是2005年的,另一本是2009年的,但这两本书似乎都没有明确说明这个问题。但这是很多材料,也许我忽略了,这就是为什么我要寻找具体的指针。谢谢Ops,刚刚看到你的编辑,将检查链接。我将从一些你最感兴趣的说明开始,然后从那里继续。这相当复杂。我曾经写过一本dsissambler,当时正在用卡车翻阅手册,需要一些时间才能习惯。:)