文档介绍:Vol. 2B A- 1 附录 A 操作码表1 使用该章节的操作码表来翻译基于 IA-32 和 intel 64 架构目标代码. 指令被分为如下的编码组别:?用于编码整数, 系统,MMX,SSE/SSE2/SSE3/SSSE3, 以及 VMX 的单,双, 三字节操作码指令. 这些指令通过 A-2 至 A-6 表给出. ?用于浮点操作的转义操作码指令( 格式为: 转义码(ESC character)+ 操作码(opcode)+ModR/M 字节). 这些指令通过 A-7 至 A-22 : 表中的所有空白都属于保留的范围不能被使用. 毋要依赖未定义的或者空白的操作码. 使用操作码表该附录中的表列出了指令对应的操作码( 包括需要的指令前缀, 以及 ModR/M 中的操作码扩展). 表中空白的单元格即保留或未定义. 操作码表由十六进制数组织, 高低 4 位表示一个操作码字节. 单字节操作码( 表 A-2) 通过高4 位索引行,低4 0F 开始的双字节指令(表 A-3) 忽略掉所有的指令前缀, 通过 0Fh 字节( 可能有前导的 66h,F2h, 或者 F3h) 和下一字节的高 4 位索引行,低4 位索引列. 类似的, 以 0F38h 或 0F3Ah 开始的 3- 字节指令( 表 A-4) 忽略掉所有的指令前缀, 通过 0F38h 或 0F3Ah 和第 3 字节的高 4 位索引行, 低4 位索引列. 请查看第 节, “单, 双, 三字节操作码查找示例”.当 ModR/M 字节含有操作码扩展时, 该操作码扩展决定指令的具体操作. 通过查看第 节了解表 A-2, 表 A-3 中含有操作码扩展的部分. 含有转义码的浮点操作指令表通过每页的高 8 位定位. 请查看第 节. 若相应的 ModR/M 字节属于 00h-BFh 的范围,第 3-5 位(the top row of the third table on each page) 以及 ModR/M 中的 REG 00h-BFh 范围之外的操作码通过每页下部的两张表给出. 重要的缩写操作数由两个字母即 Zz 的形式指定. 第一个字母大写, 指定寻址方式;第二个字母小写指定操作数的种类. 寻址方式编码以下缩写用于记录寻址方式: A- 2 Vol. 2B A (direct Address) 直接寻址: 指令没有 ModR/M 字节;操作数的地址直接编码于指令中;没有 SIB 字节.( 如 far JMP(EA)) EA 00104000 1 jmp far 001B:00401000 C (Control regs) ModR/M 的 reg 域指定为控制寄存器(如 MOV(0F20,0F22)) 0F20C0 mov eax, cr0 D (Debug regs) ModR/M 的 reg 域指定为调试寄存器(如 MOV(0F21,0F23)) 0F21C0 mov eax, dr0 E 操作码后跟随有一个 ModR/M 字节, 操作数为通用寄存器(GPR — General-Purpose Register) 或者一个内存地址. 若为内存地址, 该地址通过段寄存器和基寄存器﹑索引寄存器﹑比例因子, 以及偏移量中的任意部分计算得出. F (Flag regs) EFLAGS/RFLAGES 寄存器 G (General-purpose regs) ModR/M 为通用寄存器(如,AX(000)) I (Immediate data) 立即数: 操作数的值被接下来的字节编码 J 指令中包含一个相对偏移量被加至指令指针寄存器( 如 JMP(0E9),LOOP) M (Memory) ModR/M 字节可能仅编码内存操作数( 如 BOUND,LES,LDS,LSS,LFS,LGS,CMPXCHG8B) N ModR/M 字节的 reg 域指定为紧缩四字的 MMX 寄存器( 所谓“紧缩整形数据”是指多个 8/16/32 位的整形数据组合成为一个 64 位的数据: 紧缩字节(Packed Byte): 8 个字节组合成一个 64 位的数据; 紧缩字(Packed Word): 4 个字组合成一个 64 位的数据; 紧缩双字(Packed Doubleword): 2 个双字组合成一个 64 位的数据; 紧缩 4 字(Packed Quadword): 一个 64 位数据.) O 没有 ModR/M 字节. 操作数的偏移被编码为字或双字( 依据地址大小属性决定).没有 SIB 字节.(如 MOV(A0-A3)) A0 00104000 mov al, byte ptr [00401000] P ModR/M