Intel开发者⼿册第⼆卷指令集⼿册第2章
指令格式
这⼀章详细描述所有Intel 64和IA-32处理器指令格式.保护模式指令,实地址模式以及虚拟8086模式指令格式将在2.1节描述.IA-32e模式及其⼦模式指令格式将在2.2节描述.
2.1 实模式,保护模式,以及虚拟8086模式指令格式
Intel-64和IA-32架构指令编码是图2-1所⽰格式的⼦集.⼀条指令包括可选的指令前缀(顺序任意),主操作码(最多3字节),由ModR/M和SIB字节(可选) 组成的地址格式描述符(如果需要的话),偏移量(可选)以及⽴即数(可选).
图 2-1. Intel 64 和 IA-32 架构指令格式
2.1.1 指令前缀
指令前缀分为四组,每⼀组包含⼀些允许的前缀码.对于任何指令,前缀可以从这四组(组
1,2,3,4)⾥的挑选,并且它们不区分次序.
组1
—锁定和重复前缀:
Vol. 2A 2-1
指令格式
字符串截取前2位F0H - LOCK
F2H - REPNE/REPNZ,仅⽤于串操作和I/O指令,也可被⽤作某些指令的强制性前缀
F3H - REP或REPE/REPZ,仅⽤于串操作和I/O指令,也可被⽤作某些指令的强制性前缀
组2
—段重载前缀:
2EH—CS 段重载(⽤于任意分⽀指令时保留 )
36H—SS 段重载(⽤于任意分⽀指令时保留 )
3EH—DS 段重载(⽤于任意分⽀指令时保留 )
26H—ES 段重载(⽤于任意分⽀指令时保留 )
64H—FS 段重载(⽤于任意分⽀指令时保留 )
65H—GS 段重载(⽤于任意分⽀指令时保留 )
—分⽀提⽰:
2EH—分⽀不被接受(仅⽤于Jcc指令中)
3EH—分⽀被接受(仅⽤于Jcc指令中)
组3
66H—操作数⼤⼩重载前缀,也可被⽤作某些指令的强制性前缀.
组4
67H—地址尺⼨重载前缀
LOCK前缀(F0H)在多处理器环境下强制执⾏独占共享内存操作.详见《Instruction Set Reference, A-M》第三章"LOCK –断⾔LOCK#信号前缀".
重复前缀(F2H,F3H)将会重复操作字符串的每⼀个元素.只有
MOVS,CMPS,SCAS,LODS,STOS,INS,OUTS等字符串操作或I/O指令才能使⽤这些前缀. 对Intel 64 或 IA-32 其他指令使⽤重复前缀和/或未定义的操作码是被保留的,将会引起不可预知的⾏为.
某些指令可能使⽤F2H,F3H作为强制性前缀来表⽰特定的功能.强制性前缀应当位于其他可选的前缀之后(例外的情形请查看第2.2.1节,‖REX前缀‖)
2-2 Vol. 2A
指令格式
分⽀提⽰前缀(2EH,3EH)允许程序给处理器⼀个最有可能的执⾏分⽀提⽰.这些前缀只能⽤于条件指令(Jcc).在Intel 64 或 IA-32其他指令中使⽤分⽀预测前缀或者未定义的操作码是被保留的,将引起不可预知的⾏为.
操作数⼤⼩重载前缀允许程序在16位和32位操作数⼤⼩间切换.它们中任⼀个都可以是默认值,⽽使⽤这个前缀则选择⾮默认值.
某些SSE2/SSE3/SSSE3/SSE4和使⽤3字节操作码的指令可能使⽤66H作为强制性前
缀来表⽰特定的功能. 强制性前缀应当位于其他可选的前缀之后(例外的情形请查看第
2.2.1节,‖REX前缀‖) . 66H前缀的其他⽤法是被保留的, 将引起不可预知的⾏为.
地址尺⼨重载前缀(67H)允许程序在16位和32位地址间切换.它们中的任何⼀个都可以是默认值,使⽤这个前缀选择⾮默认值.当指令中的操作数不在内存中,使⽤这个前缀或未定义的操作码时,操作被保留,可能引起不可预知的⾏为.
2.1.2 操作码
主操作码长度为1,2或3字节. ModR/M可能编码附加的3位操作码. 主操作码中定义了⼀些更⼩的域.这些域定义了操作⽅向,偏移⼤⼩,寄存器编码,条件代码,或符号扩充.指令使⽤的域因操作码的类别⽽不同.
双字节通⽤和SIMD指令操作码由下⾯部分组成:
转义码(0FH),加上第⼆个操作码字节,或者
⼀个强制性前缀(66H,F2H,或F3H), 转义码(0FH),第⼆个操作码字节(和上⾯⼀样)
例如,CVTDQ2PD由下⾯的⼆进制序列组成:F3 0F E6 .第⼀个字节是⼀个
SSE/SSE2/SSE3指令的强制性前缀(不被视为重复前缀).
三字节通⽤和SIMD指令操作码由下⾯部分组成:
转义码(0FH),加上另外2个操作码字节,或者
⼀个强制性前缀(66H,F2H,或F3H), 转义码(0FH),另外2个操作码字节(和上⾯⼀样)
⽐如,XMM寄存器指令PHADDW由下⾯的⼆进制序列组成:66 0F 38 01.第⼀个字节即强制性前缀.
有效的操作码在附录A和附录B中被定义.
Vol. 2A 2-3
指令格式
2.1.3 ModR/M 和 SIB 字节
许多涉及内存操作数的指令都有⼀个紧挨着主操作码的寻址格式说明字节(叫做ModR/M字节),ModR/M字节包含3个域信息:
mod域与r/m域组成32个可能的值:8个寄存器和24个寻址模式.
reg/opcode域确定寄存器号或者附加的3位操作码.reg/opcode域的⽤途由主操作码确定.
r/m域确定⼀个寄存器为操作数或者和mod域⼀起编码寻址模式.有时候有些指令使⽤特定的mod域和r/m域组合来表⽰操作码信息.
某些ModR/M字节编码需要第⼆寻址字节(SIB).基址+索引或者⽐例+索引形式的32位寻址需要SIB字节.SIB字节包括下列域: scale 域指定⽐例因⼦.
index域指定索引寄存器号.
base 域指定基址寄存器号.
ModR/M和SIB编码详见第2.1.5节.
2.1.4 偏移量和⽴即数字节
某些地址构成包含ModR/M以及紧随ModR/M其后的偏移量(或者是SIB字节).如果需要偏移量,它可以是1,2,或者4字节.
若指令指定⼀个⽴即操作数,该操作数总是在偏移量之后,⽴即操作数可以为1,2,4字节. 2.1.5 ModR/M和SIB字节寻址模式编码
表2-1⾄表2-3列出了ModR/M和SIB字节和寻址模式的对应情况:表2-1列出的是16位地址模式的情形,⽽表2-2则是32位的情况,表2-3则是由SIB字节指定的32位地址的情况.在附录B中列出了当ModR/M的reg/opcode域表现为操作码扩展时的编码情况.
在表2-1和2-2中,指定了由Mod域和R/M域组合的32种有效地址形式,其中前24个是内存操作数,后8个(mod=11B)是供通⽤寄存器,MMX以及XMM寄存器使⽤.
2-4 Vol. 2A
指令格式
表2-1和2-2中的Mod和R/M列给出了第⼀列对应有效地址时Mod和R/M的值.例
如:Mod=11B,R/M=000B,该⾏确定通⽤寄存器EAX,AX或AL,MMX寄存器MM0,或者XMM寄存器XMM0.最终使⽤的寄存器由操作码字节以及操作数尺⼨属性决定.
现在看看表2-1或2-2的第7⾏(―REG=‖),当需要指定第⼆操作数时,该⾏指定Reg/Opcode 域的⽤途,该操作数必须为通⽤寄存器或者MMX,XMM寄存器,第⼀⾄五⾏为对应的寄存器,同样的,最终使⽤的寄存器由操作码字节以及操作数尺⼨属性决定.
若指令不需要第⼆操作数,Reg/Opcode可能被⽤作操作码扩展,即第六
⾏‖/digit(Opcode)‖所指,以⼗进制数的形式表⽰.
表2-1和2-2的主体(即‖ ModR/M值 (⼗六进制)‖)是⼀个32*8的矩阵,囊括了ModR/M的256个可能值.由位3-5索引列,位0-2和6,7索引列.下图演⽰了表中的⼀个值的解析.
图 2-2. ModR/M (C8H) 值的解析
Vol. 2A 2-5
指令格式
注:
1. BP作为索引默认以SS为段寄存器,其他的寻址⽅式默认以DS段寄存器.
2. “disp16”记号表⽰ModR/M 后跟随⼀个16位的偏移量,该偏移量被加⾄有效地址.
3. “disp8”记号表⽰ModR/M 后跟随⼀个8位的偏移量,该偏移量将被符号扩展,然后被加⾄有效地址.
2-6 Vol. 2A
指令格式
注:
1. “[--][--]”记号表⽰ModR/M 后跟随有⼀个SIB字节.
2. “disp32”记号表⽰ModR/M(或者SIB,如果出现的话) 后跟随⼀个32位的偏移量,该偏移量被加⾄有效地址.
3. “disp8”记号表⽰ModR/M(或者SIB,如果出现的话) 后跟随⼀个8位的偏移量,该偏移量将被符
号扩展,然后被加⾄有效地址.
表2-3囊括了SIB 的256个可能值(⼗六进制形式) . 可以作为基的通⽤寄存器通过表的上部列出,也列出了相应的base域值. 表的主体的每⾏列出了索引(index SIB的3,4,5位)对应的寄存
器及倍率因⼦(scaling factor SIBbyte的6,7位).
Vol. 2A 2-7
指令格式

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。