玩了一下 Turbo Assembler 和 Turbo Debugger,我对操作码感到惊讶。更准确地说,我有一些组装的二进制文件,其中 Turbo Debugger 反汇编了这个词
29 C3
正确地sub bx, ax
. 然而,Turbo Assembler 将相同的指令汇编sub bx, ax
为以下字
2B D8
对此感到困惑,我发现这个参考文献指出从寄存器中减去寄存器确实可能以29
and开头2B
。真的是完全相同的指令可以用不同的操作码来表达吗?如果是这样,那是为什么?是因为历史原因和兼容性吗?参考说明了操作码的不同操作数类型,它们只是在sub bx, ax
. 这是为了以后通过自修改代码等修补不同操作数的能力吗?此外,Turbo Assembler 是否具有语法结构来选择一个操作码而不是另一个操作码?
注意:我知道条件跳转喜欢je
并jz
具有相同的操作码,因为它们具有相同的标志相关行为,并且存在不同的助记符以反映同一操作的不同语义,但前者让我感到困惑。