【发布时间】:2015-12-03 16:31:00
【问题描述】:
我正在玩 x86 ISA,当我尝试使用 nasm 将一些汇编指令转换为机器指令时,我发现了一些有趣的东西。
mov [0x3412],al
mov [0x3412], bl
mov [0x3412], cl
mov [0x3412], dl
1 00000000 A21234 mov [0x3412], al
2 00000003 881E1234 mov [0x3412], bl
3 00000007 880E1234 mov [0x3412], cl
4 0000000B 88161234 mov [0x3412], dl
如您所见,mov [0x3412], al 是该规则的一个例外。
另外,我发现mov [0x3412], al 映射到两个不同的机器指令。
root@localhost:~/asm$ ndisasm 123
00000000 88061234 mov [0x3412],al
00000004 A21234 mov [0x3412],al
除了这条特殊指令之外,x86 中是否还有其他汇编指令映射到多个机器指令?
【问题讨论】:
-
您偶然发现了英特尔设计的 808X 产品。 AX 是一个通用的 16 位寄存器,但英特尔将 AX(或 AH 和 AL 的高/低 8 位版本)专门用于某些操作。英特尔将 AX 寄存器视为累加器。 AX(和 AH、AL)对某些指令有特殊的编码(通常少一个字节)。您可以选择使用较短或较长的指令(对于有限的内存而言,越短越好)。除MOV外,AX/AH/AL还有ADC、ADD、AND、CMP、OR、SBB、SUB、TEST、XOR等特殊编码。
-
@MichaelPetch:这实际上是答案,而不仅仅是评论!
-
如果你对这些东西感兴趣,你一定要看看指令集参考。
-
@MichaelPetch 谢谢你的回答,你真的帮了我。
-
您可以阅读英特尔手册,了解哪些指令具有针对特定寄存器目标的自定义编码。
标签: assembly x86 nasm disassembly