intel手册附录A.docx
- 文档编号:11402899
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:27
- 大小:1.15MB
intel手册附录A.docx
《intel手册附录A.docx》由会员分享,可在线阅读,更多相关《intel手册附录A.docx(27页珍藏版)》请在冰豆网上搜索。
intel手册附录A
附录A
操作码表¹
使用该章节的操作码表来翻译基于IA-32和intel64架构目标代码.指令被分为如下的编码组别:
●用于编码整数,系统,MMX,SSE/SSE2/SSE3/SSSE3,以及VMX的单,双,三字节操作码指令.这些指令通过A-2至A-6表给出.
●用于浮点操作的转义操作码指令(格式为:
转义码(ESCcharacter)+操作码(opcode)+ModR/M字节).这些指令通过A-7至A-22给出.
注:
表中的所有空白都属于保留的范围不能被使用.毋要依赖未定义的或者空白的
操作码.
A.1使用操作码表
该附录中的表列出了指令对应的操作码(包括需要的指令前缀,以及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位索引列.请查看第A.2.4节,“单,双,三字节操作码查找示例”.
当ModR/M字节含有操作码扩展时,该操作码扩展决定指令的具体操作.通过查看第A.4节了解表A-2,表A-3中含有操作码扩展的部分.
含有转义码的浮点操作指令表通过每页的高8位定位.请查看第A.5节.若相应的ModR/M字节属于00h-BFh的范围,第3-5位(thetoprowofthethirdtableoneachpage)以及ModR/M中的REG位确定操作码.而00h-BFh范围之外的操作码通过每页下部的两张表给出.
A.2重要的缩写
操作数由两个字母即Zz的形式指定.第一个字母大写,指定寻址方式;第二个字母小写指定操作数的种类.
A.2.1寻址方式编码
以下缩写用于记录寻址方式:
A(directAddress)直接寻址:
指令没有ModR/M字节;操作数的地址直接编码于指令中;没有SIB字节.(如farJMP(EA))
EA001040001jmpfar001B:
00401000
C(Controlregs)ModR/M的reg域指定为控制寄存器(如MOV(0F20,0F22))
0F20C0moveax,cr0
D(Debugregs)ModR/M的reg域指定为调试寄存器(如MOV(0F21,0F23))
0F21C0moveax,dr0
E操作码后跟随有一个ModR/M字节,操作数为通用寄存器(GPR—General-PurposeRegister)或者一个内存地址.若为内存地址,该地址通过段寄存器和基寄存器﹑索引寄存器﹑比例因子,以及偏移量中的任意部分计算得出.
F(Flagregs)EFLAGS/RFLAGES寄存器
G(General-purposeregs)ModR/M为通用寄存器(如,AX(000))
I(Immediatedata)立即数:
操作数的值被接下来的字节编码
J指令中包含一个相对偏移量被加至指令指针寄存器(如JMP(0E9),LOOP)
M(Memory)ModR/M字节可能仅编码内存操作数(如BOUND,LES,LDS,LSS,LFS,LGS,CMPXCHG8B)
NModR/M字节的reg域指定为紧缩四字的MMX寄存器(所谓“紧缩整形数据”是指多个8/16/32位的整形数据组合成为一个64位的数据:
紧缩字节(PackedByte):
8个字节组合成一个64位的数据;
紧缩字(PackedWord):
4个字组合成一个64位的数据;
紧缩双字(PackedDoubleword):
2个双字组合成一个64位的数据;
紧缩4字(PackedQuadword):
一个64位数据.)
O没有ModR/M字节.操作数的偏移被编码为字或双字(依据地址大小属性决定).没有SIB字节.(如MOV(A0-A3))
A000104000moval,byteptr[00401000]
PModR/M的reg域指定为紧缩四字的MMX寄存器
Q操作码后跟随一字节ModR/M指定操作数,操作数为MMX寄存器或者内存地址.若为内存地址,该地址通过段寄存器和基寄存器﹑索引寄存器﹑比例因子,以及偏移量中的任意部分计算得出.
RModR/M的R/M域可能仅为通用寄存器(如MOV(0F20-0F23))
S(Segmentregister)ModR/M的reg域为段寄存器(如MOV(8C,8E))
UModR/M的R/M域为128位的XMM寄存器
VModR/M的reg域为128位的XMM寄存器
W操作码后跟随一字节ModR/M指定操作数,操作数为128位的MMX寄存器或者内存地址.若为内存地址,该地址通过段寄存器和基寄存器﹑索引寄存器﹑比例因子,以及偏移量中的任意部分计算得出.
X内存寻址为DS:
rSI寄存器对(如MOVS,CMPS,OUTS,LODS)
Y内存寻址为ES:
rDI寄存器对(如MOVS,CMPS,STOS,SCAS)
A.2.2操作数类型编码
以下缩写用于记录操作数类型:
a两个单字内存操作数或两个双字内存操作数,依据操作数尺寸属性决定(仅在BOUND指令中使用)
b字节,不论操作数尺寸属性
c字节或字,依据操作数尺寸属性决定
d双字,不论操作数尺寸属性
dq八字(Double-quadword),不论操作数尺寸属性
p32位,48位或者80位指针,依据操作数尺寸属性决定
pd128位紧缩双精度浮点数
pi四字MMX寄存器(如mm0)
ps128位紧缩单精度浮点数
q四字操作数,不论操作数尺寸属性
s6字节或10字节伪描述符(pseudo-descriptor)
ss128位紧缩单精度浮点数的标量部分(scalarelementofa128-bitpackedsingle-precisionfloatingdata)
si双字整数寄存器(如eax)
v字,双字或四字(64位模式),依据操作数尺寸决定
w字,不论操作数尺寸
z在16位模式中为字,在32位或64位环境中为双字
A.2.3寄存器编码
当操作码需要一个特定的寄存器作为操作数,该寄存器通过名字确定(如AX,CL,ESI).
同时该名字也指明了64,32,16,8位等宽度.
当寄存器与操作数尺寸属性有关时,以eXX或rXX的形式标明.eXX在16位或32位尺
寸的时候出现,rXX在16,32,64位尺寸时出现.如eAX标明在16位的时候为AX,在32位是为EAX.rAX则可能为AX,EAX,RAX.
当REX.B位被用于改变操作码中的reg域指定的寄存器,这种情况下在寄存器名后增加“/x”指定增加的情况.如rCX/r9表示寄存器可以是rCX或r9,注意这时r9的尺寸要依据操作数尺寸而定(就像rCX一样).
A.2.4单字节,双字节及三字节操作码查找示例
这一小节提供了几个例子演示如何查找操作码表.
A.2.4.1单字节操作码指令
单字节操作码指令通过表A-2给出,该表按行列布置.每一个条目列出了如下类型的操作码:
●通过第A.2给出的符号表示的指令助记符和操作数类型
●指令前缀
表格中的每一个单元格对应一条指令,你可以通过以下的一种情况翻译:
●需要一个ModR/M字节并且通过第A.1和第2章“指令格式”翻译.操作数的类型通过第A.2节列出的符号翻译.
●需要一个ModR/M字节并且包含其中的操作码扩展.使用表A-6表翻译该ModR/M字节.
●ModR/M字节被保留或未定义.一般适用于指令前缀或不需要ModR/M指定操作数的情形(如:
60H,PUSHA;06H,PUSHES).
例A-1单字节操作码查找示例
指令030500000000H,这是一条add指令,使用下列步骤查表A-2:
●第一位0确定行,第二位3确定列.查找到是一条使用两个操作数的ADD指令.
●第一个操作数(Gv)表示通用寄存器且根据操作数尺寸属性为字或双字.第二个操作数(Ev)表示后面跟随有一个ModR/M字节指示一个字或双字通用寄存器或内存地址.
●ModR/M字节即05H,表示后面跟随一个32位的偏移量(00000000H).reg/opcode域(第3-5位)为000,表示寄存器EAX.
该指令为ADDEAX,mem_op,即ADDEAX,dwordptr[0]
某些单字节,双字节操作码指令指向成员组(groupnumbers)(表中的阴影部分).成员组意味着指令使用reg/opcode域作为指令的操作码扩展(请查看第A.4节).
A.2.4.2双字节操作码指令
双字节操作码指令通过表A-3给出,一般为两或三字节.通常是以0FH开头,长度为两字节.第二字节的高低4位分别用于索引表A-3的行和列.
长度为三字节的双字节指令通常以66H,F2H,F3H和0FH等强制性前缀开头.第三个字节的高,低4位分别用于索引表A-3的行和列;当第三字节为38H或3AH是例外,这种情况请查阅第A.2.4.3节.
表格中的每一个单元格对应一条指令,你可以通过以下的一种情况翻译:
●需要一个ModR/M字节并且通过第A.1节和第2章“指令格式”翻译.操作数的类型通过第A.2节的符号翻译.
●需要一个ModR/M字节并且其中包含操作码扩展.使用表A-6表翻译该ModR/M字节.
●ModR/M字节被保留或未定义.一般适用于不适用ModR/M指定操作数的情形(如:
0F77H,EMMS).
例A-2双字节操作码查找示例
指令0FA4050000000003H,这是一条SHLD指令,使用下列步骤查表A-3:
●该指令位于A行4列.查找到是一条SHLD指令.操作数为:
Ev:
ModR/M字节指示一个字或双字操作数
Gv:
ModR/M的reg域为一个通用寄存器
Ib:
立即数
●ModR/M字节即05H,表示后面跟随一个32位的偏移量(00000000H)作为第一个操作数.reg/opcode部分为(第3-5位)000,表示寄存器EAX,为第二个操作数.
●接下来是32位的偏移量(00000000H),最后的字节是一个立即数(03H).
●该指令为SHLDDS:
00000000H,EAX,3
A.2.4.3三字节操作码指令
三字节操作码指令通过表A-4和A-5给出,一般为三或四字节.通常是以0F38H,0F3AH开头,长度为三字节.第三字节的高,低4位分别用于索引表A-4和A-5的行和列.
长度为四字节的三字节操作码指令通常以66H,F2H,F3H等强制性前缀以及0F38H,0F3AH开头.第四个字节的高,低4位分别用于索引表A-4,A-5的行和列.
表格中的每一个单元格对应一条指令,你可以通过以下的一种情况翻译:
●需要一个ModR/M字节并且通过第A.1节和第2章“指令格式”翻译.操作数的类型通过第A.2节的符号翻译.
例A-2三字节操作码查找示例
指令660F3A0FC108H,这是一条PALIGNR指令,使用下列步骤查表A-5:
●66H是一个前缀,0F3AH指示应该查找表A-5.该操作码位于0行F列.查找到是一条PALIGNR指令.操作数为:
Vdq:
ModR/M的reg域为一个128位的XMM寄存器
Wdq:
ModR/M的R/M域为一个128位的XMM寄存器或内存地址
Ib:
立即数
●ModR/M字节即C1H,reg域表示第一个操作数为XMM0,R/M域表示寄存器且第二个操作数为XMM1.
●最后的字节是一个立即数(08H)
●该指令为PALIGNRXMM0,XMM1,8
A.2.5表中使用的一些标记
表A-1记录了该章操作码查找表中使用的一些特定的注释,这些注释都是以上标的形式给出的.而操作码查找表中的灰色单元格属于指令成员组的范围.
TableA-1操作码查找表中使用的上标
上标
符号的意义
1A
ModR/M的3-5位为扩展操作码(请查阅第A.4节“单字节和双字节指令的扩展操作码”)
1B
使用0F0BH(UD2指令)或者0FB9H故意产生一个指令异常(#UD)
1C
奔3处理器增加的一些指令可能使用同样的双字节操作码.若指令有变动,或者操作码表现为不同的指令,ModR/M字节将被用于区分不同指令.查看表A-6了解这种情况下被编码的ModR/M字节的值.
这些指令包括SFENCE,STMXCSR,LDMXCSE,FXRSTOR,FXSAVE以及PREFETCH及其变种.
i64
该指令在64位模式中为非法或未被编码.40-4F(单字节指令为INC,DEC)在64位环境中为REX前缀(使用FE/FF/Grp4和5代替INC/DEC)
o64
该指令仅在64位模式中可用
d64
64位模式中,指令的操作数默认为64位,不能编码32位数据
f64
64位模式时,操作数被强制为64位,使用操作数尺寸前缀无效
A.3单,双和三字节指令表
表A-2至A-6被分为多页显示,以方便查找.请注意表下部的脚注仅在表所在的最后一页显示,而不是每页.
A.4单双字节操作码的操作码扩展
某些单双字节操作码指令使用ModR/M字节的3-5位(图A-1的nnn域)作为操作码的扩展.
mod
nnn
R/M
图A-1ModRv/M的nnn域
含有操作码扩展的指令通过组号组织成A-6表.组号从1到16(表中的第二列)指示表的入口.r/m域的编码为第三列.
A.4.1含有操作码扩展的操作码查找
例子如下.
例A-3翻译一条ADD指令
单字节操作码指令ADD的操作码80H属于组1:
●表A-6指示ModR/M的操作码扩展部分为000B
●R/M域可以为寄存器(11B)或者内存地址(mem=00B,01B,10B)
例A-2查找0F01C3H
使用表A-2,A-3,A-6查找指令0F01C3:
●0F指示这是一条双字节操作码指令
●01表A-3行0列1指示该指令位于表A-6的组7
●C3为ModR/M字节.高两位为11B,这告诉我们去查找表A-6中组7所在的行
●Op/Reg域(5,4,3位)为000B,这告诉我们查看组7中的第000列
●最后R/M域(2,1,0位)为011B,这就确定了该指令是VMRESUME指令
A.4.2操作码扩展表
A.5转义操作码
协处理器转义码指令(X87浮点指令)通过表A-7至A-22列出.这些表通过指令的第一个字节组织,范围为D8-DF.这些指令都有ModR/M字节.若ModR/M属于00H-BFH的范围,ModR/M的第3-5位为操作码扩展,类似于单双字节操作码(请查看第A.4节).若ModR/M不属于00H-BFH的范围,整个ModR/M字节被当做操作码扩展使用.
A.5.1转义操作码查找示例
示例如下.
例A-5ModR/M属于00H-BFH范围的转义操作码查找
DD0504000000H可以按以下顺序解析:
●ModR/M字节为05H属于00H-BFH的范围,位3-5为000B,该指令为FLD双精度浮点指令(查看表A-9)
●被加载的双精度浮点数在偏移00000004H处
例A-3ModR/M不属于00H-BFH范围的转义指令查找
D8C1H可以按以下顺序解析:
●ModR/M字节为C1H不属于00H-BFH的范围,这条指令可以按照第A.4节的方式翻译.
●通过表A-8,ModR/M字节为C1H,第C行8列即为FADD指令,使用ST(0),ST
(1)两个操作数
A.5.2转义操作码表
A.5.2.3以D8开头的转义操作码
表A-7和A-8包含以D8H开头的转义操作码.表A-7列出了ModR/M属于00H-BFH时的扩展操作码的情况.
表A-8列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.2以D9开头的转义操作码
表A-9和A-10包含以D9开头的转义操作码.表A-9列出了ModR/M属于00H-BFH的情况.
表A-10列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.3以DA开头的转义操作码
表A-11和A-12包含以DA开头的转义操作码.表A-11列出了ModR/M属于00H-BFH的情况.
表A-12列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.3以DB开头的转义操作码
表A-13和A-14包含以DA开头的转义操作码.表A-13列出了ModR/M属于00H-BFH的情况.
表A-14列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.3以DC开头的转义操作码
表A-15和A-16包含以DA开头的转义操作码.表A-15列出了ModR/M属于00H-BFH的情况.
表A-16列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.3以DD开头的转义操作码
表A-17和A-18包含以DA开头的转义操作码.表A-17列出了ModR/M属于00H-BFH的情况.
表A-18列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.3以DE开头的转义操作码
表A-19和A-20包含以DA开头的转义操作码.表A-19列出了ModR/M属于00H-BFH的情况.
表A-20列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
A.5.2.3以DF开头的转义操作码
表A-21和A-22包含以DA开头的转义操作码.表A-21列出了ModR/M属于00H-BFH的情况.
表A-22列出了ModR/M超出00H-BFH的情况.ModR/M的高4位索引行,低4位索引列.
1.翻译时将opcode译为操作码,instruction译为指令,严格的说操作码(opcode)是指令(instruction)的一部分,请注意区分.紫色部分表示有待考虑的地方.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- intel 手册 附录