390 likes | 563 Views
第 4 章. 指令系统. 操作码 地址码. 4 . 1 指令格式. 4 . 1 . 1 指令格式 指令是由许多部分组成的,在构成指令的这几部分中,只有操作码部分是必需存在的。其余各部分则要根据指令操作所涉及的操作数类型、以及操作数存放在何处等因素决定取舍。 任何一条机器指令都是由一组二进制代码构成,通常又被进一步分成操作码部分和地址码部分,一般的指令格式如图所示。.
E N D
第 4 章 指令系统
操作码 地址码 4.1 指令格式 4.1.1 指令格式 指令是由许多部分组成的,在构成指令的这几部分中,只有操作码部分是必需存在的。其余各部分则要根据指令操作所涉及的操作数类型、以及操作数存放在何处等因素决定取舍。 任何一条机器指令都是由一组二进制代码构成,通常又被进一步分成操作码部分和地址码部分,一般的指令格式如图所示。
操作码 MOD-REG-R/M 位移量 立即数 1~2字节 0~1字节 0~1字节 0~2字节 8086~80286是16位的微处理器, 16位的指令格式如图所示。
指令前缀 0或1字节 段的超前前缀 0或1字节 地址大小前缀 0或1字节 操作数大小前缀 0或1字节 立即数 0,1,2或4字节 位移量 0,1,2或4字节 操作码 1或2 字节 Mod R/M 0或1 字节 SIB 0或1字节 指令前缀 Mod Reg/OPcode R/M SS Index Base 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 指令 Pentium(32位)指令的一般格式如图所示; 。 由图可知,一条指令是由可任选的指令前缀(可以以任何的次序)、一个或两个原操作码字节、有可能要用的地址说明符(由ModR/M字节和按比例变址基地址SIB字节构成)、一个位移量(根据需要)和一个立即操作数数据字段(如果需要的话)等元素组成的。 Pentium的所有指令都是如图所示的指令格式的子集
1.指令前缀 指令前缀是置于指令前面的一个或多个字节,它的作用是用来修改指令的操作。下面所列出的这四个指令前缀就是供应用程序使用的。 (1)指令前缀: (2)段的超前前缀: (3) 操作数大小前缀: (4)地址大小前缀:
2.指令中各字段意义 (1)操作码字段 (2)Mod R/M字段 (3)SIB字段 (4)偏移量 (5)立即数
4.2 寻址方式 寻址方式是指微处理器获取操作数的方式。一条指令必须说明两个问题;一是要说明这条指令要进行什么操作,二是要说明这条指令的操作数位于何地。一条指令可以对零个或多个操作数操作。零个操作数的指令的例子是NOP指令(即没有数)。操作数可以位于下列位置处: (1)指令本身有操作数;即立即操作数 (2)操作数在寄存器中; (3)操作数在存储器中 (4)操作数在I/O端口
存储器 1350H ┋ 1351H AH AL 19H 99H 操作码 指令 代码段 99H 19H ┋ 1380H 1381H 4.2.1 常用寻址方式 1.立即操作数寻址 是说指令本身带的数据作为一个操作数用,即指令所用的操作数是指令自身所拥有的,像单操作数指令或两操作数指令即是这类指令。凡指令本身所拥有的操作数就称之为立即操作数。 例如, MOV AX,1999H ;这条指令的功能是将16进制的立即操作数1999传送到AX寄存器。由于立即操作数1999是16位的,其中存放在代码段的高地址字节中的内容被传送到AH寄存器,低地址字节中的内容被传送到AL寄存器,如图所示。
MOV EDX , EAX 源操作数 目标操作数 EAX D 4 0 7 1 3 9 A 9 9 9 9 EBX 2 2 3 3 9 9 9 9 ECX 1 1 0 0 EDX D 4 0 7 1 3 9 A 2.寄存器操作数寻址 将操作数存放在32位通用寄存器中,或存放在16位通用寄存器中,或存放在8位通用寄存器中,并对操作数进行访问操作,称之为寄存器操作数寻址。指令 MOV EDX,EAX ;
8 0 3 8 6 A B C 存储器 ┋ ┋ 1233H 80 1232H 38 1231H 6A 1230H BC EAX 3 存储器操作数寻址 (1)直接寻址 直接寻址是一种很简单的寻址方式,虽然操作数存放在存储器内,但在这种直接寻址方式下,操作数的有效地址是由指令直接给出。例如: MOV EAX, LISTT 这条指令的功能是,将地址LISTT处4个连续字节地址中的32位操作数传送到寄存器EAX内。LISTT 是存储器中存储单元的符号地址,LISTT的实际地址是1230H这个十六进制地址
A3 D4 10 00 存储器 ┋ 1003H 89 1002H 35 EAX 1001H A3 EBX 1000H D4 (2)寄存器间接寻址 寄存器间接寻址这种寻址方式,可以对存储器内的任何存储单元的数据进行寻址,只是要借助于在BP,BX,DI和SI这些寄存器内保存的偏移地址。 例,如果寄存器BX的内容是1000H,在执行MOV AX,[BX]指令之后,地址1000H处的字内容被传送到AX寄存器中,如图所示。
存储器 EAX 0 A 1 0 EBX 102CH A B ECX 102BH A B 8 9 102AH 8 9 EDX 1029H 100AH EBP 1028H 1027H ESI 0020H 1026H + 0 0 2 0 EDI ESP 102AH (3)基地址加变址寻址 所谓基地址加变址寻址,就是操作数位于所选的存储器段内,操作数的有效地址由一个基地址寄存器的内容再加上一个变址寄存器的内容构成。 通常,在基地址寄存器内保存的是位于存储器内数组的起始地址,而在变址寄存器内保存的是数组元素的相对位置。每次BP寄存器在对存储器内的数组进行寻址时,由BP寄存器和堆栈段寄存器两者生成有效地址。 例如:MOV EDX ,[EAX + EBX]
AB D6 12 00 存储器 ┋ ┋ EAX EBX 2203H 99 1200H 2202H 45 1000H 2201H + AB 2200H D6 2200H 位移量 (4)寄存器相对寻址 寄存器相对寻址类似于基址加变址寻址,只不过是在寄存器相对寻址方式下,在变址寄存器或基地址寄存器的内容中,加上了一个位移量,而形成了操作数的有效地址的值,然后是用这个有效地址的值,对存储器中的操作数进行寻址。 操作数的有效地址是由基地址或变址寄存器的内容再加上一个8位数值、16位数值或32位数值的位移量组成。 例如:MOV EAX, [ECX+1AH] 指令是,将数据段中由ECX寄存器上的内容,再加上1A这个数值所形成的操作数地址中的内容传送至EAX寄存器。 指令 MOV AX,[BX+1000H]的操作过程 如图示
存储器 2 B 5 9 0 A 1 0 112CH EAX 2 B 112BH EBX 112AH 5 9 ECX 1129H 100AH EDX 1128H 0020H + 1127H 0 0 2 0 EBP 1126H ESI 102AH EDI 112AH + ESP 位移量0100H (5)相对基地址加变址寻址 相对基地址加变址寻址类似于基地址加变址寻址,它除了需要加上位移量之外,仍然需要用基地址寄存器和变址寄存器的内容来形成操作数的地址。也就是说,它是用基址寄存器和变址寄存器上的内容再加上位移量,从而形成操作数在存储器中的有效地址。这种寻址方式常被用来对存储器内的二维数组的数组元素进行寻址。例如: MOV EDX ,[EBX+ECX+200H] 图中以指令MOV EAX,[BX+SI+100H]执行过程为例,展示出用相对基址加变址寻址方式进行寻址的操作过程。
( 6)带比例因子的变址寻址 这种寻址方式是80386~Pentium所特有的,在对存储器进行寻址操作时,要用到两个寄存器,第1个是基地址寄存器,第2个是变址寄存器,它们均是32位的寄存器。 这种寻址,只有第2个变址寄存器才会与比例因子相乘,变址寄存器内容乘以比例因子后,再加上位移量即可形成操作数的32位的有效地址。 比例因子可以是1、2、4或8。比例因子为1是默认的,例如,指令MOV AL,[EBX+ECX] 就没有在变址寄存器ECX前面显式地乘以1。 比例因子为2用来对字数组中的数组元素进行寻址操作的 比例因子为4用来对双字数组中的数组元素进行寻址, 例如: MOV EAX ,[EBX+4*ECX] 比例因子为8用来对四字数组中的数组元素进行寻址。
(7)基地址加比例因子变址寻址 这种寻址方式是在前面所述带比例因子的变址寻址方式的基础上,再加上一个位移量就构成了这种寻址方式。例如: MOV [ EAX + 2 * EBX + 100H ] , DX 这条指令的功能是将16位寄存器DX之内容存储到,由EAX内容加上EBX寄存器内容的2倍,再加上位移量100H而生成的存储器地址。
基地址 (base) EAX EBX ECX EDX ESP EBP ESI EDI 变址 (index EAX EB EC ED — EBP ESI EDI 段 CS SS DS ES FS GS 比例常数 (scale) 1 2 4 8 位移量 (displancement) 0位移量 8位位移量 16位位移量 (segment + + + × 有效地址= 4.2.2.有效地址计算 在指令的操作码后面有mod R/M字节时,是最常用的一种指令格式,该字节为用户提供了灵活的寻址方式。存储器中操作数由mod R/M字节指定。被选中段内偏移量是位移量、基地址寄存器内容、一个变址寄存器的内容乘比例因子之和。mod R/M字节给出了有效地址的计算过程公式; 有效地址= 段+基地址+ (变址 ×比例因子)+位移量
4.3 指令系统 指令是对计算机发出的要计算机执行部件执行某种操作的操作命令,且由计算机直接识别执行。一般说来,一条指令对应着计算机的一种基本操作。 8086~Pentium的指令系统分成如下几类 (1) 数据传送指令 (2) 算术运算指令 (3) 基本逻辑运算指令 (4) 控制转移指令 (5) 处理器控制指令 (6) 输入输出指令 (7) 串操作指令 (8) 新增指令
4.3.1 数据传送类指令 1.通用传送类MOV指令 指令格式: MOV 目的操作数,源操作数 指令功能:把源操作数的内容复制到目的操作数中去。8086~Pentium的几个MOV指令都具有同样的功能。都是把源操作数的内容传送(复制)到目的操作数中,但不破坏源操作数的内容。 例如: ① 从存储器将数据传送到寄存器AX ② 从寄存器将数据传送到存储器 ③ 从段寄存器将数据传送到存储器/寄存器 ④ 从存储器/寄存器将数据传送到段寄存器 ⑤ 从一个寄存器将数据传送到另一个寄存器 ⑥ 从存储器/寄存器将数据传送到寄存器 ⑦ 把立即数据传送到寄存器 ⑧ 把立即数据传送到存储器/寄存器
2.堆栈操作指令 (1)PUSH 把操作数下压入栈 指令格式: PUSH 源操作数 (2) PUSHA把全部16位通用寄存器内容下压 入堆栈 指令格式: PUSHA (无操作数) (3)POP 上托堆栈字至目的寄存器/存储器 3. XCHG交换指令 指令格式: XCHG 目的寄存器,源寄存器/存储单元
4.3.2 算术运算指令 又可分为加法指令,减法指令,乘法指令,除法指令。 1.加法指令 (1) ADD 加法指令 指令格式: ADD 目的操作数,源操作数 指令功能: 两个操作数相加 例如: ① 两寄存器操作数内容相加 ② 寄存器与存储器内容相加 ③ 存储器与寄存器内容相加 ④ 立即数与寄存器内容相加 ⑤ 立即数与存储器的内容相加
(2)A DC 带进位加法指令 指令格式: ADC 目的操作数,源操作数 指令功能: 带进位的两个操作数相加 例: ① 立即数与寄存器进行带进位相加 ② 立即数与存储单元带进位相加 ③ 寄存器与寄存器带进位相加 ④ 寄存器与存储器带进位相加 ⑤ 存储器与寄存器带进位相加 (3) 1NC 增1指令 指令格式: lNC 目的操作数 指令功能: 使寄存器、或存储单元的内容增1
2. 减法指令 (1)SUB 减法指令 指令格式: SUB 目的操作数,源操作数 指令功能: 完成整数减法 例 ① 寄存器与寄存器之间的减法 ② 立即数减法 ③ 寄存器与存储器之间的减法
(2)SBB 带借位减法 指令格式: SBB 目的操作数,源操作数 指令功能: 完成带借位的整数减 (3) DEC 减l指令 指令格式: DEC 目的操作数 指令功能: 从寄存器/存储单元的字节或字或双字数据中减1 3.CMP 两操作数比较 指令格式: CMP 目的操作数,源操作数 指令功能: 从目的操作数减去源操作数,但不改变操 作数,其结果要引起标志的变更。
4.乘法指令 (1) MUL 乘法指令(无符号) 指令格式: MUL 源操作数 指令功能: 执行无符号的乘法(AX=AL×指定的字节操作数) 执行无符号的乘法(DX-AX =AX×指定的字操作数) 执行无符号的乘法(EDX-EAX =EAX×指定的双字操作数) 例如: ① 8位乘法指令 ② 16位乘法指令 ③ 32位乘法指令
5. 除法指令 (1)DIV 除法指令 指令格式: 语法 DIV 源操作数(除数) 指令功能: 执行AX寄存器中(无符号)字节数据的除法 执行DX-AX寄存器对中(无符号)字数据的除法 执行EDX-EAX寄存器对中(无符号)双字数据的除法 例如: ① 8位除法指令 ② 16位除法指令 ③ 32位除法指令
6.BCD运算调整指令 二进制编码的十进制数叫作BCD数,BCD数通常是以压缩格式形式出现,每个字节存放两位BCD数字。 (1) 压缩的BCD调整指令 ① DAA加后的十进制调整 指令格式: DAA (无操作数) 指令功能: 加后的十进制调整 ② DAS减法十进制调整 指令格式: DAS (无操作数) 指令功能: 减后十进制调整
(2) 非压缩的BCD调整指令 非压缩的BCD是指ASCII码数,对ASCII码的数据进行算术运算操作有4条指令,它们分别是: AAA(加法后ASCII调整)、 AAS(减法后ASCII调整), AAM(乘法后ASCII调整) AAD(除法前ASCII调整)。 这4条指令均是以寄存器AX作为源操作数或目标操作数。ASCII码的30H~39H 之间的这十个数与十进制的0~9是相对应的。
4.3.3 逻辑运算指令 1.逻辑指令 (1) NOT 逻辑“非” 指令格式: NOT 目的操作数 指令功能: NOT指令使字节或字或双字中的每一位都取反 (2) AND 逻辑“与” 指令格式: AND 目的操作数,源操作数 指令功能: 两个操作数的逻辑“与”操作 (3) 0R逻辑“或” 指令格式: OR 目的操作数,源操作数 指令功能: 完成逻辑“或”操作 (4)XOR 逻辑“异或” 指令格式: XOR 目的操作数,源操作数 指令功能: 完成逻辑“异或”操作
2.移位指令 (1)SAL/SAR/SHL/SHR 移位指令 指令格式: SAL 目的操作数,移位次数 指令功能: SAL 算术左移指令 SAR 算术右移指令 SHL 逻辑左移指令 SHR 逻辑右移指令 指令操作: SAL或SHL指令命令指定的操作数左移一位。这样就把最高有效位MSB移进CF,把最低有效位LSB置0。
3.循环移位指令 (1) ROL/ROR/RCL/RCR 循环移位指令 指令格式:RCL 目的操作数,循环移位次数 指令功能: ROL 左环移 ROR 右环移 RCL 经过进位左环移 RCR 经过进位右环移 左环移指令ROL把所有位都左移一个位置,把最高有效位MSB移出环绕一周变成最低有效位LSB。
4.3.4 控制转移指令 1.无条件转移指令 (1) JMP 无条件转移指令 指令格式: JMP (转移的目标地址) 指令功能: 完成一次无条件的转移 举例: ① 段间直接转移 ② 段间间接转移 ③ 段内直接转移
2.条件转移指令 (1) J 指令 指令格式: J (测试条件) 指令功能: 若条件满足则短距离转移
3.CALL 调用一个过程 指令格式: CALL 参数操作数 指令功能: CALL指令把程序流程传递到 被调用的过程 4.RET 从过程返回 指令格式: RET (无操作数) 指令功能: 返回到NEAR或FAR调用程序
5.LOOP 循环控制指令 指令格式: LOOP 目的地址 指令功能: 用CX计数器中内容控制循环 LOOP 如果CX内容不为0,则CX-1再转移至目的地址 LOOPE 如果CX≠0,ZF=1,则CX-1再转移至目的地址 LOOPNE如果CX≠0,ZF=0, 则CX-1再转移至目的地址 LOOPNZ如果CX≠0,ZF=0,则CX-l再转移至目的地址 LOOPZ 如果CX≠0,ZF=1,则CX-1再转移至目的地址 6. INT/INTO中断指令 指令格式: INT 中断类型 指令功能: 产生调用中断过程
4.3.5 处理器控制指令 1.HLT 暂停指令 指令格式: HLT (无操作数) 指令功能: 微处理器暂时停止运行 2.WAIT 微处理器等待 指令格式: WAIT (无操作数) 指令功能: 微处理器等待,检验数值异常的出现 3.NOP 空操作 指令格式: NOP (无操作数) 指令功能: 实现一次空操作
4.3.6 输入/输出指令 1.IN 输入指令 指令格式: IN 寄存器,端口 指令功能: 从指定的端口输入字节数据或字数据或双字数据 2.OUT 输出指令 指令格式: OUT 端口,寄存器 指令功能: 把字节或字或双字发送到用立即数指出的I/O端口
4.3.7 新增加的指令 由于Intel系列微处理器是带有一点RISC色彩的CISC,其指令系统内拥有几百条指令之多,以上仅仅介绍了用户常用的部分指令,像标志控制指令、结构化语言指令、数字指令、浮点运算指令、段寄存器指令、保护型指令、以及多条杂项指令等,限于篇幅不能一一列出。 经典Pentium 新增加的指令 经典Pentium 较之它的前辈80386、80486,又新增加了指令,其中包括3条微处理器专用指令,4条系统控制指令。 CMPXCH8B 8字节比较和交换 CPUID CPU标识 RDTSC 读时间标记计数器 RDMSR 读方式专用寄存器 WRMSR 写方式专用寄存器 RSM 恢复系统管理模式 MOV CR4 与CR4寄存器的传送
2. MMX指令 是Intel 最新的一项多媒体增强指令技术。它的指令系统由此而新增加了57条MMX指令,被称之为“多媒体扩展指令系统”。 Pentium MMX使用了一种叫做单指令、多数据SIMD(single-instruction multiple-data)的技术,该技术能够使CPU同时对2个、4个甚至8个数据元素进行计算,且不会降低操作速度。 3.互联网SSE指令 PentiumIII新增添的71条互联网SSE指令,SSE指令包含以下三类指令: ① 8条高速缓冲存储器控制指令; ② 50条单指令多数据浮点运算指令; ③ 12条新的多媒体指令等; 4.SSE2 指令 Pentium 4为加速执行各种应用程序,而设计出包含有144条多媒体及图形指令的单指令多数据扩展的数据流 SIMD SSE2指令集,它是第二代高级浮点以及多媒体指令集SSE2。 5. 64位微处理器的 SSE3延伸技术 64位微处理器新增加的指令以及新的增强的指令计有 432条。