Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统

Similar presentations


Presentation on theme: "第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统"— Presentation transcript:

1 第3章 80x86的指令系统和寻址方式 § 3.1 80x86的寻址方式 § 3.3 80x86的指令系统

2 基本概念—指令系统 每一种计算机都有一组指令集供用户使用,这 组指令集称为该计算机的指令系统。指令集中的每 条指令在汇编语言中都是用助记符来表示的。

3 基本概念—指令的构成 操作码 操作数 指令由操作码和操作数两部分组成
操作码说明计算机要执行哪种操作,如传送、运算、移位、 跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作 数,也有个别指令有3个甚至4个操作数

4 基本概念—80x86指令的基本格式 [ ]内的内容可缺省 书写注意事项: 操作码 [目的操作数][,源操作数]] [;注释] SRC DST
操作码 [目的操作数][,源操作数]] [;注释] SRC DST [ ]内的内容可缺省 书写注意事项: 操作码与操作数至少有一个空格或制表符分隔 操作数之间必须用“,”相分隔, DST在前, SRC在后 每种指令的操作码: 用一个唯一的助记符表示(指令功能的英文缩写) 对应着机器指令的一个二进制编码 指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址

5 基本概念—寻址方式 在指令中为了取得操作数地址所使用的方式 寻找操作数的过程就是操作数的寻址 不同的指令系统都规定一些寻址方式供编程时选用
指令的寻址方式主要由操作数的形式表示出来 操作数采取哪一种寻址方式,会影响机器运行的速 度和效率

6 § 3.1 80x86的寻址方式 一、与数据有关的寻址方式 二、与转移地址有关的寻址方式 立即(数)寻址 寄存器寻址 直接寻址
寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址 比例因子寻址 串操作寻址 端口寻址 二、与转移地址有关的寻址方式

7 操作数类型 操作数 描述 r8 8位通用寄存器:AH、AL、BH、BL、CH、CL、DH、DL r16
16位通用寄存器:AX、BX、CX、DX、SI、DI、SP、BP r32 32位通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP reg 任意的通用寄存器 sreg 16位段寄存器:CS、DS、SS、ES、FS、GS imm 8、16或32位立即数 imm8 8位立即数(字节) imm16 16位立即数(字) imm32 32位立即数(双字) r/m8 8位操作数(可以是8位通用寄存器或内存字节) r/m16 16位操作数(可以是16位通用寄存器或内存字) r/m32 32位操作数(可以是32位通用寄存器或内存双字) mem 8、16或32位内存操作数

8 1. 立即(数)寻址 指令中的操作数直接存放在机器代码中,紧跟在操作码之后 (操作数作为指令的一部分存放在操作码之后的主存单元中)
这种操作数被称为立即数imm 它可以是8位数值imm8(00H~FFH) 也可以是16位数值imm16(0000H~FFFFH) 也可以是32位数值imm32( H~FFFFFFFFH) 立即数寻址方式常用来给R/M赋值 立即数只能用于源操作数 MOV AL,05H ;AL←05H MOV AX,0102H ;AX←0102H MOV EAX, H ;EAX← H

9 立即数寻址的执行

10 2. 寄存器寻址 操作数存放在CPU的内部寄存器reg中,可以是: MOV AX,1234H ;AX←1234H
16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP 8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 32位寄存器: EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 段寄存器: CS、DS、SS、ES,FS,GS MOV AX,1234H ;AX←1234H MOV BX,AX ;BX←AX

11 寄存器寻址的执行

12 存储器操作数的寻址 当操作数存放在内存中时,寻找操作数归结为如何确定存储 单元的地址 逻辑地址 段基值:偏移量 EA=位移量+基址+变址
逻辑地址 段基值:偏移量 主要确定该部分的内容(EA) 由段寄存器经计算给出 位移量:指令中给出8/16/32位数(常数、符号) EA 基地址:有基址寄存器BX或基址指针BP给出 变址: 由变址寄存器(SI或DI)给出 EA=位移量+基址+变址 EA=位移量+基址+(变址*比例因子) 比例因子(1/2/4/8)

13 16/32位寻址时有效地址的组成 默认段选择规则 成分 16位寻址(位) 32位寻址(位) 位移量 0,8,16 0,8,16,32
基址寄存器 BX,BP 任何32位通用寄存器(包括ESP) 变址寄存器 SI,DI 除ESP以外的32位通用寄存器 比例因子 1,2,4,8 默认段选择规则 访问类型 所用段及段寄存器 缺省选择规则 指令 代码段 CS 用于取指 堆栈 堆栈段 SS 所有的进栈和出栈操作; 任何用于ESP、EBP、BP为基址寄存器的访问 局部数据 数据段 DS 除对于堆栈及目的串以外的所有数据访问 目的串 附加段 ES 串处理指令的目的串

14 3. 直接寻址 有效地址只包含位移量 用符号表示的位移量 用常数表示的位移量 操作数的16位偏移量直接包含在指令中,与操作码一起放在代码段
MOV BX,VAR ;表示将用符号VAR表示的字单元的内容→ AX ; 不声明段则默认为数据段,指明段寄存器则可实现段跨越 用常数表示的位移量 MOV AX,DS:[2000H] ;表示将数据段偏移2000H字节的字单元的内容→ AX

15 直接寻址的执行 MOV AX,DS:[2000H]

16 4. 寄存器间接寻址 有效地址仅包含基址/变址一种成分 所使用的寄存器相当于地址指针,当修改其内容后可指向不 同的存储单元
16位寻址可用寄存器:BX、BP、SI、DI 32位寻址可用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP、 ESP 所使用的寄存器相当于地址指针,当修改其内容后可指向不 同的存储单元 书写时用[]括住寄存器名,以区别于寄存器寻址 若以BP、EBP、ESP间址,操作数默认在堆栈段,其他在数据 段;使用段超越前缀改变访问段 MOV AX,[SI] MOV CL,[BX] MOV CX,[BP] MOV EBX,[EAX]

17 寄存器间接寻址的执行 (BX=2000H,DS=3000H)

18 5.寄存器相对寻址方式 直接基址寻址/直接变址寻址 有效地址是寄存器内容与有符号的位移量之和
EA = BX/BP 或 SI/DI +位移量 基址寻址 变址寻址 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变 该方式不仅可以修改指针,还可以修改位移量,对数组操作十分方便 MOV AX,10H[SI] MOV TABLE[DI],AL MOV TABZ[BP],BX MOV EAX,ARRAY[ESI]

19 寄存器相对寻址的执行

20 MOV AL,0024H[SI] EA=24H+(SI) (SI)=0 (AL)=12H (SI)=1 (AL)=34H
操作码 24H 00H 12H 34H 56H 78H 9AH 可看作数据起始单元的偏移量 MOV AL,0024H[SI] 代码段 EA=24H+(SI) (SI)=0 (AL)=12H (SI)=1 (AL)=34H DS (SI)=2 (AL)=56H (SI)=3 (AL)=78H 0024H (SI)=4 (AL)=9AH 数据段 (SI) 数组内某元素距数组 起始单元的偏移量 通过修改SI可遍历整个数组

21 6.基址变址寻址方式 有效地址由基址寄存器的内容加上变址寄存器的 内容构成
使用BP、EBP、ESP基址寄存器默认是SS,其他 为数据段;可用段超越前缀改变 MOV AX,[BX][SI] MOV AX,[BP][DI] MOV AX,DS:[BP][DI] MOV EDX,[EBX][ESI]

22 基址变址寻址的执行

23 7.相对基址变址寻址方式 有效地址是基址寄存器、变址寄存器与位移量之和 16位寻址时,BX/BP选一,SI/DI选一
段为缺省选择,可用段超越前缀改变 MOV AX, 06H[BX+SI] ← → MOV AX, DS:[BX+SI+06H] MOV AL,TAB[BX][DI] ← → MOV AL,DS:TABLE[BX][DI] MOV DWORD[BP][SI],DX ← → MOV SS:DWORD[BP][SI],DX MOV AX,ARRAY[BX][BP] × MOV AX,DA[SI][DI] × MOV EAX,ARRARY[EBX][ECX]

24 31A00 3000:1A00

25 ⊕ MOV AL,ARRAY[BX][SI] DS 数据段 ARRAY SI BX EA [ ]之间表示相加的关系
二维数组起始单元 EA BX、SI分别存放数组的脚标 [ ]之间表示相加的关系 [BX][SI] ← → [BX+SI]

26 8.比例变址寻址、基址比例比例变址寻址、相对基址比例变址寻址方式
比例变址寻址有效地址是:位移量加变址寄存器与比例因子 乘积之和 MOV EAX,COUNT[ESI*4] 基址比例比例变址寻址有效地址是:基址加变址寄存器与比 例因子乘积之和 MOV CX,[EAX][EDX*2] 相对基址比例变址寻址方式有效地址是:位移量加基址加变 址寄存器与比例因子乘积之和 MOV EAX, TABLE[EBP][EDI*4] 作用:方便字、双字等数组的操作

27 二、与转移地址有关的寻址方式 程序代码亦存放在存储器中,如何控制程序的走向(转移位置的地址CS:IP)是本部分所涉及的内容,由于它们与具体的指令相关,他们的介绍放在指令中讲解。

28 § 3.3 80x86的指令系统 指令分类 数据传送指令 算术运算指令 功能 逻辑指令 串操作指令 程序转移指令 处理器控制指令 格式
双操作数指令(DEST,SRC) 单操作数指令(DEST) 无操作数指令(隐含,按约定寻找操作数)

29 一、数据传送指令 1.通用数据传送指令 提供方便灵活的通用传送操作 数据传送是计算机中最基本、最重要的一种操作
传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 1.通用数据传送指令 提供方便灵活的通用传送操作 MOV XCHG PUSH POP MOVSX MOVZX PUSHA/PUSHAD POPA/POPAD

30 1) 传送指令MOV(move) 格式:MOV DST,SRC 功能:将源操作数的内容传送至目的操作数中即 (DST) ← (SRC)
说明: DST可以是8/16位的R(CS、IP除外)/M SRC可以是8/16位的R/M/立即数 DST可以是8/16/32位的R(CS、EIP除外)/M SRC可以是8/16/32位的R/M/立即数 只能出现在源操作数的位置

31 1) 传送指令MOV—立即数传送 MOV reg/mem,imm ;立即数送寄存器或主存 MOV AL,4 ;AL←4,字节传送
MOV AH,‘E’ ; AH←‘E’的ASCII码45H MOV CX,0FFH ;CX←00FFH,字传送 MOV SI,200H ;SI←0200H,字传送 MOV BYTE PTR [SI],0AH ; BYTE PTR说明是字节操作 MOV WORD PTR [SI+2],0BH ; WORD PTR 说明是字操作 注意立即数是字节量还是字量 明确指令是字节操作还是字操作

32 1) 传送指令MOV —寄存器之间数据传送 MOV AX,BX ;AX ← BX ,字传送 MOV AH,AL ;AH ← AL ,字节传送
MOV reg,reg MOV AX,BX ;AX ← BX ,字传送 MOV AH,AL ;AH ← AL ,字节传送 MOV DS,AX ;DS ← AX ,字传送 CS只能出现在SRC的位置

33 1) 传送指令MOV —寄存器与存储器之间数据传送
MOV AL,D_BYTE MOV DL,[SI] ;DL←DS:[SI] MOV DX,Y[BP][SI] ;DX←SS:Y[BP][SI] MOV EAX,[EBX][ECX*4]

34 1) 传送指令MOV —使用该指令应注意的问题
SRC与DST的长度必须一致 DST不能为CS、IP及立即数 SRC与DST不能同时为存储器操作数—不支持两个存储单元间数据的直接传送 SRC与DST不能同时为段寄存器 不能将立即数直接传送到段寄存器 例: DS ← ES 错误: MOV DS,ES 正确实现: MOV AX,ES MOV DS,AX 例: MOV AX,ES MOV DS,AX 错误示例: MOV VAR1,VAR2 正确实现: MOV AL,VAR2 MOV VAR1,AL 错误示例: MOV AX,BL MOV CL,3824H

35 1) 传送指令MOV—数据传送方向示意 立即数 通用寄存器 存 储 器 AX BX CX DX BP SP SI DI 段寄存器
CS DS ES SS 通用寄存器 AX BX CX DX BP SP SI DI 存 储 器

36 2) 零扩展传送指令MOVZX 格式:MOVXZ DST,SRC 功能:将零扩展至源操作数的高位形成双倍长度传送至目的 操作数中即
说明: DST可以是16/32位的R(CS、EIP除外) SRC可以是8/16位的R/M MOVZX DX,AL ;原AL=B0H,则DX=00B0H MOVZX EAX,DATA

37 3) 带符号扩展传送指令MOVSX 格式:MOVSX DST,SRC 功能:将源操作数的符号位扩展至高位形成双倍长度传送至 目的操作数中即
说明: DST可以是16/32位的R(CS、EIP除外) SRC可以是8/16位的R/M MOVSX DX,AL ;原AL=B0H,则DX=FFB0H MOVSX EAX,[EDI]

38 4) 交换指令XCHG(exchange) 指令格式: XCHG DST,SRC 指令功能: (DST) ← → (SRC)
寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 注意:不能在存储器与存储器之间对换

39 4) 交换指令XCHG—寄存器间交换 MOV AX,1234H ;AX=1234H MOV BX,5678H ;BX=5678H
XCHG AX,BX ;AX=5678H,BX=1234H XCHG AH,AL ;AX=7856H MOVZX CX,AL ;CX=0078H MOVSX DX,AH ;DX=0056H XCHG CX,DX ;CX=0056H,DX=0078H

40 4)交换指令XCHG —寄存器与存储器交换 XCHG AX,DS:[2000H] ;字交换 XCHG DS:[2000H],AX
XCHG AL, DS:[2000H] ;字节交换 XCHG DS:[2000H],AL

41 4) 交换指令XCHG—例题分析 例: (BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H,(2F246H)=4154H,在指令 XCHG BX,[BP+SI] 执行后,相关寄存器和存储器的内容是什么? 分析:源操作数的物理地址= (SS) × 16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H 指令的功能:(BX) ← → (2F246H) 指令执行结果:(BX)=4154H,(2F246H)=6F30H

42 5) 堆栈操作指令—进栈指令PUSH 格式: PUSH SRC 功能: 386+ 例: PUSH AX PUSH DS:[2000H]
SP←SP-2, SS:[SP]←(r/m16) 386+ ESP←ESP-2/4, SS:[ESP]←(r/m16)/ (r/m32)/imm32 例: PUSH AX PUSH DS:[2000H]

43 6) 堆栈操作指令—出栈指令POP 386+ 格式: POP DST 功能: SP ← SP+2
(r/m16) ← SS:[SP] SP ← SP+2 386+ (r/m16)/ (r/m32)← SS:[ESP] ESP ← ESP+2/4 例: POP DX POP DS:[2000H]

44 堆栈操作指令—应用举例 PUSH AX ;进入子程序后 PUSH BX PUSH DS ... POP DS ;返回主程序前 POP BX
POP AX

45 7) 所有寄存器进栈指令 —PUSHA/PUSHAD
xxH 00H 66H 7) 所有寄存器进栈指令 —PUSHA/PUSHAD SP 00H 55H 格式: PUSHA 功能:将所有16位寄存器压栈,顺序为: AX、CX、DX、BX、SP、BP、SI、DI ESP←ESP-16 00H 84H 00H 78H 如:AX=11H, BX=22H CX=33H, DX=44H SI =55H, DI =66H SP=80H, BP =84H 00H 22H 00H 44H PUSHA 执行后有: 33H 00H 格式: PUSHAD 功能:将所有32位寄存器压栈,顺序为: EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI ESP←ESP-32 11H 00H 20080H SP

46 8) 所有寄存器出栈指令 —POPA/POPAD
功能:将堆栈中的数据弹给16位寄存器,顺序与压栈指令相反 ESP←ESP+16 格式: POPAD 功能:将堆栈中的数据弹给32位寄存器,顺序与压栈指令相反 ESP←ESP+32

47 累加器专用传送指令 换码指令XLAT(translate) 指令格式: XLAT
指令功能: AL←DS:[BX+AL],将BX指定的缓冲区中、 AL指定的位移处的一个字节数据取出赋给AL 换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码

48 3) 换码指令XLAT—例题 MOV BX,100H MOV AL,03H XLAT 78H (BX) (AL) DS 数据段 12H
9AH MOV BX,100H MOV AL,03H XLAT 78H (AL)=78H

49 3. 地址传送指令 地址传送指令将存储器单元的逻辑地址送至指定的 寄存器 注意不是获取存储器单元的内容 有效地址传送指令 LEA
指针传送指令 LDS和LES 指针传送指令 LFS、LGS、LSS 注意不是获取存储器单元的内容

50 3. 地址传送指令 —有效地址传送指令LEA(load EA)
格式: LEA DST,SRC 存储器操作数 16/32位寄存器 功能:DST←SRC的有效地址EA 将存储器操作数的有效地址传送至指定的16/32位寄存器中

51 3. 地址传送指令 —有效地址传送指令LEA(例)
获得主存单元的有效地址;不是物理地址,也不是该单元的内容 可以实现计算功能 23H 093A0H BUFR 78H 9AH 093AH DS 093C3H LEA BX,BUFR (BX)=0023H 9A78H (BX)=9A78H 错误!

52 3. 地址传送指令 —地址指针 存储单元的逻辑地址: 段基值(16位) 段内偏移量(16位) 地址指针(32位) AD_POINT 偏移量
3. 地址传送指令 —地址指针 段基值 AD_POINT XX 偏移量 存储单元的逻辑地址: 段基值(16位) 段内偏移量(16位) 地址指针(32位) M的逻辑地址在M中需4个连 续的存储单元

53 3. 地址传送指令 —指针传送指令 格式: LDS DST,SRC 功能: (DST)←(SRC)段内偏移量 DS← (SRC+2 )段基值
3. 地址传送指令 —指针传送指令 格式: LDS DST,SRC 功能: (DST)←(SRC)段内偏移量 DS← (SRC+2 )段基值 LDS指令将主存中SRC 指定的字送至16位寄存器DST,并 将SRC的下一字送DS寄存器 格式: LES DST,SRC 功能:(DST)←(SRC)段内偏移量 ES← (SRC+2 )段基值 LDS指令将主存中SRC 指定的字送至16位寄存器DST,并将SRC的下一字送ES寄存器

54 (DS)=4000H (DI)=05AEH (AX)=9634H
BX=080AH B0000H 0B080AH 40000H 34H 96H AEH 05H 00H 40H 405AEH 05AEH 0B080CH 例: (DS)=B000H, (BX)=080AH, (0B080AH)=05AEH, (0B080CH)=4000H, (405AEH)=9634H, 在执行指令 LDS DI,[BX] MOV AX,[DI] 后,(AX)=? (DI)=05AEH 结果: (DS)=4000H (DI)=05AEH (AX)=9634H (DS)=4000H

55 3. 地址传送指令 —地址指针(32) 存储单元的逻辑地址段选择 器(16位) 段内偏移量(32位) 地址指针(48位) AD_POINT
3. 地址传送指令 —地址指针(32) 存储单元的逻辑地址段选择 器(16位) 段内偏移量(32位) AD_POINT XX XX 偏移量 XX 地址指针(48位) M的逻辑地址在M中需6个连续的存储单元 XX XX 段选择 XX

56 3. 地址传送指令—指针传送指令(32) 格式: LDS/LES/LFS/LGS/LSS DST,SRC
功能: (DST)←(SRC)段内偏移量32bit DS/ES/FS/GS/SS← (SRC+4 ) 16bit LDS指令将主存中SRC 指定的双字送至32位寄存器DST, 并将SRC的下一字送DS寄存器 LSS ESP,MEM

57 4. 标志寄存器传送指令 标志寄存器传送指令用来传送标志寄存器FLAGS的 内容,方便进行对各个标志位的直接操作 指令
4. 标志寄存器传送指令 标志寄存器传送指令用来传送标志寄存器FLAGS的 内容,方便进行对各个标志位的直接操作 指令 低8位传送:LAHF和SAHF 16位传送:PUSHF和POPF 32位传送:PUSHFD和POPFD

58 4. 标志寄存器传送指令 —标志低字节进出AH指令
格式: LAHF 功能:(AH)←FLAGS的低字节 LAHF指令将标志寄存器的低字节送寄存器AH SF/ZF/AF/PF/CF状态标志位分别送入AH的第 7/6/4/2/0位,而AH的第5/3/1位任意 格式: SAHF 功能: FLAGS的低字节←(AH) SAHF将AH寄存器内容送FLAGS的低字节 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

59 4.标志寄存器传送指令 —标志寄存器进出堆栈指令
4.标志寄存器传送指令 —标志寄存器进出堆栈指令 格式: PUSHF 功能:SP←SP-2 SS:[SP]←FLAGS PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指 针SP减2 格式: POPF 功能:FLAGS←SS:[SP] SP←SP+2 POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2

60 4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(置位单步标志)
4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(置位单步标志) PUSHF ;保存全部标志到堆栈 POP AX ;从堆栈中取出全部标志 OR AX,0100H ;设置D8=TF=1,AX其它位不变 PUSH AX ;将AX压入堆栈 POPF ;FLAGS←AX ;将堆栈内容取到标志寄存器

61 4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(32)
4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(32) 格式:PUSHFD 功能:SP←SP-4 SS:[ESP]←EFLAGS PUSHFD指令将标志寄存器的内容压入堆栈,同时栈顶 指针ESP减4 格式: POPFD 功能:EFLAGS←SS:[ESP] ESP←ESP+4 POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针ESP加4

62 二、算术运算指令(部分) 四则运算是计算机经常进行的一种操作。算术运算 指令实现二进制(和十进制)数据的四则运算
请注意算术运算类指令对标志的影响

63 1. 加/减法指令 格式: ADD DST,SRC SUB DST,SRC 功能: (DST) ←(DST)+/-(SRC)
受影响标志:CF,PF,AF,ZF,SF,OF 说明: 操作数可以是字节或字 SRC可以是通用R、M、imm DST可以是通用R、M DST和 SRC不能同时为M

64 1. 加法指令—举例 若(AL)=0E5H,执行 ADD AL,0A4H AL及各标志位的情况? 若认为是无符号数,则为 =393= 若认为是有符号数,则为(-27)+(-92)=-119 ADD AX,BX ADD AL,BL SUB CX,20H ADD DL,DA_BYTE SUB DA_WORD,DX ADD EAX,EBX 1 + CF=1,AF=0,PF=0, ZF=0,SF=1,OF=0

65 2. 减法指令—举例 例:执行指令 MOV AL,-73 SUB AL,-87 后,AL及个标志位的情况 -73的补码表示 -87的补码表示 14 AL=0EH CF=0,AF=1,PF=0,ZF=0,SF=0,OF=0

66 2. 带进/借位的加/减法指令 格式: ADC DST,SRC SBB DST,SRC
功能: (DST) ←(DST)+/-(SRC)+/-CF 受影响标志:CF,PF,AF,ZF,SF,OF 说明: 操作数可以是字节或字 SRC可以是通用R、M、imm DST可以是通用R、M DST和 SRC不能同时为M

67 2. 带进/借位的加/减法指令—举例 2 F365 5 E024 8 D389 + 2 F365 5 E024 8 D389 +
例:实现2F365H和 5E024H的加法运算 1 F365 E024 D389 + 2 F365 5 E024 8 D389 + 2 F365 5 E024 8 D389 + 手工计算 AX MOV DX,2 MOV AX,0F365H ADD AX,0E024H ADC DX,5 CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0 0002 0005 0008 + 0001 DX CF=0,AF=0,PF=0,ZF=0,SF=0,OF=0

68 3.加/减1指令 格式: INC DST DEC DST 功能: (DST) ←(DST)+/-1 受影响标志:PF,AF,ZF,SF,OF
说明: DST可以是R/M 功能与ADD/SUB相似,但占用字节少,且不影响标 志位CF 。常用于修改地址指针及循环计数器。

69 4. 求补指令(求负数) 格式: NEG DST 功能: (DST) ←0-(DST) 受影响标志: CF ,PF,AF,ZF,SF,OF
说明: DST可以是R/M 操作对象是有符号的数 当操作数取最小值(-128或-32768)时,执行该指令后,操作 数无变化, OF=1 当操作数为0时,结果为0,但CF=0,其他情况CF=1

70 4. 求补指令(举例) 1 0000 0000 0001 0011 1110 1101 — 例:AL=13H,执行指令 NEG AL
负数求补 AL=-13H

71 5. 比较指令CMP(compare) 格式: CMP DST,SRC 功能: (DST) -(SRC)
受影响标志: CF ,PF,AF,ZF,SF,OF 说明: DST ,SRC可以是R/M,长度必须一致 SRC还可以是imm DST和 SRC不能同时为M 该指令主要用于比较两数的关系

72 5. 比较指令CMP—应用 ZF=1 ;两数相等 两个无符号数比较 CMP AX,BX ;
CF= 两个带符号的数的比较不能用单一的符号判断两个数的关系 指令执行后 SF与OF相同,(DST)>SRC SF与OF不同,(DST)<SRC

73 5. 比较指令CMP—(CMP AL,BL) - AL=-2 BL=127 SF=0 OF=1 相异,AL<BL 1 - AL=-2 BL=-1 SF=1 OF=0 相异,AL<BL

74 5. 比较指令CMP—(CMP AL,BL) - AL=-1 BL=-2 SF=0 OF=0 相同,AL>BL 1 - AL=127 BL=-2 SF=1 OF=1 相同,AL>BL

75 6. 乘法指令 MUL r8/m8 ;无符号字节乘法 ;AX←AL×r8/m8 MUL r16/m16 ;无符号字乘法
;DX.AX←AX×r16/m16 IMUL r8/m8 ;有符号字节乘法 ;AX←AL×r8/m8 IMUL r16/m16 ;有符号字乘法 ;DX.AX←AX×r16/m16

76 6. 乘法指令—功能 乘法指令分无符号和有符号乘法指令 乘法指令的源操作数显式给出,隐含使用另一个操 作数AX和DX
字节相乘:AL与r8/m8相乘,得到16位的结果,存入AX 字相乘:AX与r16/m16相乘,得到32位的结果,其高字 存入DX,低字存入AX 乘法指令利用OF和CF判断乘积的高一半是否具有 有效数值

77 6. 乘法指令—对标志的影响 MUL指令——若乘积的高一半(AH或DX)为0,则 OF=CF=0;否则OF=CF=1
IMUL指令——若乘积的高一半是低一半的符号扩展,则 OF=CF=0;否则均为1

78 6. 乘法指令—(例) MOV AL,0B4H ;AL=B4H=180 MOV BL,11H ;BL=11H=17
MUL BL ;AX=OBF4H=3060,OF=CF=1,AX高8位不为0 MOV AL,0B4H ;AL=B4H=-76 MOV BL,11H ;BL=11H=17 IMUL BL ;AX=FAF4H=-1292,OF=CF=1,AX高8位有效

79 6. 除法指令—功能 除法指令分无符号和有符号除法指令 除法指令的除数显式给出,隐含使用另一个操作数AX和 DX作为被除数
字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH 字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数 存入DX 除法指令对标志没有影响 除法指令会产生结果溢出

80 6. 除法指令 DIV r8/m8 ;无符号字节除法 DIV r16/m16 ;无符号字除法 IDIV r8/m8 ;有符号字节除法
;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数 DIV r16/m16 ;无符号字除法 ;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数 IDIV r8/m8 ;有符号字节除法 ;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数 IDIV r16/m16 ;有符号字除法: ;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数

81 6. 除法指令—除法错中断 当被除数远大于除数时,所得的商就有可能超出它所能表 达的范围。如果存放商的寄存器AL/AX不能表达,便产生 溢出,80x86CPU中就产生编号为0的内部中断——除法 错中断 对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除 时商超过16位,则发生除法溢出 对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内, 或者在字除时商不在-32768~32767范围内,则发生除法溢

82 6. 除法指令—(例) MOV AX,0400H ;AX=400H=1024 MOV BL,0B4H ;BL=B4H=180
DIV BL ;商AL=05H=5,余数AH=7CH=124 MOV AX,0400H ;AX=400H=1024 MOV BL,0B4H ;BL=B4H=-76 IDIV BL ;商AL=F3H=-13,余数AH=24H=36

83 7. 符号扩展指令—符号扩展的概念 符号扩展是指用一个操作数的符号位(即最高位)形成另 一个操作数,后一个操作数的各位是全0(正数)或全1 (负数)。符号扩展不改变数据大小。 对于数据64H(表示数据100),其最高位D7为0,符号扩展后高 8位都是0,成为0064H(仍表示数据100) 对于数据ff00H(表示有符号数-256),其最高位D15为1,符号 扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)

84 7. 符号扩展指令 符号扩展指令常用于获得双倍长的数据 CBW ;AL的符号扩展至AH ;如AL的最高有效位是0,则AH=00
;AL的最高有效位为1,则AH=FFH。AL不变 CWD ;AX的符号扩展至DX ;如AX的最高有效位是0,则DX=00 ;AX的最高有效位为1,则DX=FFFFH。AX不变

85 7. 符号扩展指令—(例:AX/BX) CWD ;DX.AX←AX IDIV BX ;AX←DX.AX÷BX
利用符号扩展指令得到除法指令所需要的倍长于除数的被除数 对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数

86 8. 十进制调整指令 十进制数调整指令对二进制运算的结果进行十进制调整, 以得到十进制的运算结果 分成压缩BCD码和非压缩BCD码调整

87 8. 十进制调整指令 —压缩BCD码加、减调整指令
(ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) DAA ;AL←将AL的加和调整为压缩BCD码 (SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) DAS ;AL←将AL的减差调整为压缩BCD码 使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令 DAA和DAS指令对OF标志无影响,按结果影响其他标志

88 8.十进制调整指令 — 压缩BCD码加、减调整指令(例)
MOV AL,68H ;AL=68H,压缩BCD码表示真值68 MOV BL,28H ;BL=28H,压缩BCD码表示真值28 ADD AL,BL ;二进制加法:AL=68H+28H=90H DAA ;十进制调整:AL=96H ;实现压缩BCD码加法:68+28=96 MOV AL,68H ;AL=68H,压缩BCD码表示真值68 MOV BL,28H ;BL=28H,压缩BCD码表示真值28 SUB AL,BL ;二进制减法:AL=68H-28H=40H DAS ;十进制调整:AL=40H ;实现压缩BCD码加法:68-28=40

89 8.十进制调整指令 —非压缩BCD码加、减调整指令
(ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) AAA ;AL←将AL的加和调整为非压 缩BCD码 ;AH←AH+调整的进位 (SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) AAS ;AL←将AL的减差调整为非压缩 BCD码 ;AH←AH-调整的借位 使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令 AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无影响

90 8. 十进制调整指令 —非压缩BCD码加、减调整指令(例)
MOV AX,0608H ;AX=0608H,非压缩BCD码表示真值68 MOV BL,09H ;BL=09H,非压缩BCD码表示真值9 ADD AL,BL ;二进制加法:AL=08H+09H=11H AAA ;十进制调整:AX=0707H ;实现非压缩BCD码加法:68+9=77 MOV AX,0608H ;AX=0608H,非压缩BCD码表示真值68 MOV BL,09H ;BL=09H,非压缩BCD码表示真值9 SUB AL,BL ;二进制减法:AL=08H-09H=FFH AAS ;十进制调整:AX=0509H ;实现非压缩BCD码减法:68-9=59

91 例:用乘法指令实现32位二进制数的相乘 × + a b c d c d a b ax dx b×d a×d b×c a×c NUM1
DSEG SEGMENT PARA 'DATA‘ NUM1 DW 1220H,48A2H NUM2 DW 2398H,0AE41H PRODU DW 4 DUP(0) DSEG ENDS c d a b ax dx × + b×d a×d b×c a×c NUM2 NUM2+2 c d produ produ+2 produ+4 produ+6

92 三、逻辑指令 (逻辑)位操作类指令以二进制位为基本单位进行数据的 操作;这是一类常用的指令,都应该特别掌握 逻辑运算指令 测试指令 移位指令

93 1. 逻辑运算指令 格式: AND DST,SRC OR DST,SRC XOR DST,SRC NOT DST ∧
功能: (DST) ← (EST) (SRC) (DST) ← (EST) 受影响标志: CF=0, OF=0, PF, ZF,SF,NOT对标志无影响

94 1. 逻辑运算指令—应用 MOV AL,45H ;逻辑与 AL=01H AND AL,31H ;CF=OF=0,SF=0、ZF=0、PF=0
OR AL,31H ;CF=OF=0,SF=0、ZF=0、PF=0 MOV AL,45H ;逻辑异或 AL=74H XOR AL,31H ;CF=OF=0,SF=0、ZF=0、PF=1 MOV AL,45H ;逻辑非 AL=0BAH NOT AL ;标志不变

95 1.逻辑运算指令—应用 AND指令可用于复位某些位(同0相与),不影响其他位:将BL中 D3和D0位清0,其他位不变
AND BL, B OR指令可用于置位某些位(同1相或),不影响其他位:将BL中D3 和D0位置1,其他位不变 OR BL, B XOR指令可用于求反某些位(同1相异或),不影响其他位:将BL中 D3和D0位求反,其他不变 XOR BL, B XOR AX,AX ;AX=0,CF=OF=0,ZF=1 XOR AL,43H ;ZF=0则AL≠ 43H;ZF=1AL=43H则

96 2. 测试指令TEST 格式: TEST DST,SRC 功能: 将两个操作数进行逻辑“与”运算,结果只 反映在标志位上,对操作数无影响
功能: 将两个操作数进行逻辑“与”运算,结果只 反映在标志位上,对操作数无影响 受影响标志: CF=0 , OF=0 , PF, ZF,SF 说明:该指令用于测试操作数的某位是否为 1,被测试 的位与1相“与” TEST AL,01H ;测试D0的值 ZF=0,D0=1 ZF=1,D0=0

97 3. 移位指令 逻辑移位指令 算术移位指令 循环移位指令

98 1)逻辑移位指令 格式: SHL DST,CNT SHR DST,CNT
功能:将DST按 CNT 指定的次数左/右移位,移出的位→ CF,空出 的位补0,结果→ DST 受影响标志: OF ( CNT=1时), CF ,PF,ZF,SF 说明: DST 可以是R/M CNT为1或CL (imm8) 只在CNT=1时。CF与SF相同, OF=0; CF与SF不同, OF=1。 该指令可用于无符号数÷或× 2的操作

99 2) 算术移位指令 格式: SAL DST,CNT SAR DST,CNT 功能:
SAL与SHL完全相同 SAR每右移1位,最低位→ CF,最高位保持不变(用于带符号 数的除法),结果→ DST 受影响标志: OF ( CNT=1时), CF ,PF,ZF,SF 说明: DST 可以是R/M CNT为1或CL (imm8)

100 逻辑移位指令的功能

101 移位指令应用举例 SAR AL,CL ;AL=07H MOV CL,4 MOV AL,0FFH ;AL=FFH
SHL AL,1 ;AL=FEH ;CF=1,SF=1、ZF=0、PF=0,OF=0 SAR AL,1 ;AL=FFH ;CF=0,SF=1、ZF=0、PF=1、OF=0 SHR AL,1 ;AL=7FH ;CF=1,SF=0、ZF=0、PF=0、OF=0 SAR AL,CL ;AL=07H ;CF=1,SF=0、ZF=0、PF=1

102 移位指令应用举例 MOV SI,AX SHL SI,1 ;SI←2×AX ADD SI,AX ;SI←3×AX MOV DX,BX
MOV CL,03H SHL DX,CL ;DX←8×BX SUB DX,BX ;DX←7×BX ADD DX,SI ;DX←7×BX+3×AX

103 功能:小循环:将DST按 CNT 指定的次数左/右移位,移出的位同时送 CF和空出的位
3)循环移位指令 格式: ROL DST,CNT ROR DST,CNT RCL DST,CNT RCR DST,CNT 小循环 大循环 功能:小循环:将DST按 CNT 指定的次数左/右移位,移出的位同时送 CF和空出的位 大循环:将DST按 CNT 指定的次数左/右移位, CF →空出的位,移出的位→ CF 受影响标志: OF ( CNT=1时), CF 说明:用大循环可完成多字节的移位操作

104 不带进位循环移位指令(小循环)

105 带进位循环移位指令(大循环)

106 循环移位指令 —将DX.AX中32位数值左移一位
SHL AX,1 RCL DX,1 DX AX CF

107 循环移位指令—位传送 ;把AL最低位送BL最低位,保持AL不变 ROR AL,1 RCL BL,1 ROL AL,1 AL之D0 AL CF

108 循环移位指令—BCD码合并 ;AH.AL分别存放着非压缩BCD码的两位 ;将它们合并成为一个压缩BCD码存AL
AND AX,0F0FH ;保证高4位为0 MOV CL,4 ROL AH,CL ;也可以用SHL AH,CL ADD AL,AH ;也可以用OR AL,AH

109 四、串操作指令 串操作指令是80x86指令系统中比较独特的一类指令,采 用比较特殊的数据串寻址方式,在操作主存连续区域的数 据时,特别好用
串操作指令的操作数是主存中连续存放的数据串 (String)——即在连续的主存区域中,字节或字(或双 字)的序列 串操作指令的操作对象是以字(W)为单位的字串,或是 以字节(B)为单位的字节串(D).

110 四、串操作指令—串寻址方式 源操作数用寄存器SI寻址,默认在数据段DS中,但允许 段超越:DS:[SI]
目的操作数用寄存器DI寻址,默认在附加段ES中,不允 许段超越:ES:[DI] 每执行一次串操作指令,SI和DI将自动修改: ±1(对于字节串)或±2(对于字串)或±4 执行指令CLD指令后,DF = 0,地址指针增1或2(4) 执行指令STD指令后,DF = 1,地址指针减1或2(4)

111 1. 串传送MOVS(move string) 把字节或字(双字)操作数从主存的源地址传送至目的 地址
MOVSB ;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1 MOVSW ;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2 MOVSD ;双字串传送:ES:[DI]←DS:[SI] ;SI←SI±4,DI←DI±4

112 串传送 MOVSB (正向 DF=0 )

113 串传送 MOVSW(反向 DF=1)

114 1. 串传送MOVS—字节串传送(例) mov si,offset source mov di,offset destination
mov cx,100 ;cx←传送次数 cld ;置DF=0,地址增加 again: movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束

115 2. 串存储STOS(store string)
把AL或AX数据传送至目的地址 STOSB ;字节串存储:ES:[DI]←AL ;DI←DI±1 STOSW ;字串存储:ES:[DI]←AX ;DI←DI±2

116 2. 串存储—串存储(例) mov ax,0 mov di,0 mov cx,8000h ;cx←传送次数 cld ;DF=0,地址增加
again: stosw ;传送一个字 dec cx ;传送次数减1 jnz again ;传送次数cx是否为0

117 3. 串读取LODS(load string) 把指定主存单元的数据传送给AL或AX LODSB ;字节串读取:AL←DS:[SI]
;SI←SI±1 LODSW ;字串读取:AX←DS:[SI] ;SI←SI±2

118 mov si,offset block mov di,offset dplus mov bx,offset dminus mov ax,ds
mov es,ax ;数据都在一个段中,所以设置es=ds mov cx,count ;cx←字节数 cld go_on:lodsb ;从block取出一个数据 test al,80h ;检测符号位,判断是正是负 jnz minus ;符号位为1,是负数,转向minus stosb ;符号位为0,是正数,存入dplus jmp again ;程序转移到again处继续执行 minus:xchg bx,di stosb ;把负数存入dminus xchg bx,di again:loop go_on ;字节数减1

119 4.串比较CMPS(compare string)
将主存中的源操作数减去至目的操作数,以便设置标志 (ZF),进而比较两操作数之间的关系 CMPSB ;字节串比较:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1 CMPSW ;字串比较:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2

120 4.串比较CMPS(例) mov si,offset string1 mov di,offset string2 mov cx,count
cld mov al,0ffh ;标记初始为不同 again:cmpsb ;比较两个字符 jnz output ;有不同字符,转移 dec cx jnz again ;进行下一个字符比较 mov al,0 ;字符串相等,设置00h output:mov result,al ;输出结果标记

121 5.串扫描SCAS(scan string) 将AL/AX减去至目的操作数,以便设置标志(ZF),进而比 较AL/AX与操作数之间的关系
SCASB ;字节串扫描:AL-ES:[DI] ;DI←DI±1 SCASW ;字串扫描:AX-ES:[DI] ;DI←DI±2

122 5.串扫描SCAS—(例) mov di,offset string mov al,20h mov cx,count cld
again:scasb ;搜索 jz found ;为0(ZF=1),发现空格 dec cx ;不是空格 jnz again ;搜索下一个字符 ... ;不含空格,则继续执行 found: ...

123 重复前缀指令(repeat) 串操作指令执行一次,仅对数据串中的一个字节或字量进行 操作。但是串操作指令前,都可以加一个重复前缀,实现串 操作的重复执行。重复次数隐含在CX寄存器中 重复前缀分2类,3条指令: 配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀 配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀

124 REP重复前缀指令 REP ;每执行一次串指令,CX减1 ;直到CX=0,重复执行结束
例2中,程序段的最后3条指令,可以分别替换为: REP MOVSB 和 REP STOSW

125 REP重复前缀指令 —字节串传送(例) mov si,offset source mov di,offset destination
mov cx,100 ;cx←传送次数 cld ;置DF=0,地址增加 again: movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束 rep movsb

126 REPZ/REPNZ重复前缀指令 REPZ ;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX=0或ZF=0,重复执行结束
REPNZ ;每执行一次串指令,CX减1 ;并判断ZF是否为1, ;只要CX=0或ZF=1,重复执行结束 当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续串操作

127 REPZ/REPNZ重复前缀指令 —串比较CMPS(例)
mov si,offset string1 mov di,offset string2 mov cx,count cld mov al,0ffh ;标记初始为不同 again:cmpsb ;比较两个字符 jnz output ;有不同字符,转移 dec cx jnz again ;进行下一个字符比较 mov al,0 ;字符串相等,设置00h output:mov result,al ;输出结果标记 repz cmpsb jnz output

128 REPZ/REPNZ重复前缀指令 —串扫描(例)
mov di,offset string mov al,20h mov cx,count cld again:scasb ;搜索 jz found ;为0(ZF=1),发现空格 dec cx ;不是空格 jnz again ;搜索下一个字符 ... ;不含空格,则继续执行 found: ... repnz scasb jz found

129 例:在STRBUF字符串中寻找STRING中指定的二字符出现的个数
DSEG SEGMENT PARA 'Data' STRBUF DB 'ASASAASASSASSAASASAS' COUNT EQU $-STRBUF STRING DB 'AS' MESSG DB "THE NUMBER OF 'AS' IS : " NUM DB ? DB 0AH,0DH,'$‘ DSEG ENDS

130 例:在STRBUF字符串中寻找STRING中指定的二字符出现的个数
采用逐个比较的方法 因目的串为2个字符,故使用CMPSW 应注意的问题: 若某次比较不同时,SISI+2,但有可能出现‘AAS’的情况,应做SISI-1的处理 执行CMPSW亦做DI DI+2,而目的串应始终指向STR,故DI DI-2 比较相同时,循环计数器-2

131 ZF=1 CX=0 SI 源串首地址STRBUF DI 目的串首地址STRING CX 源串长度-1 方向标志DF 0
计数器BL 0 CMPSW ZF=1 BL BL+1 CX CX-1 DI  DI-2 CX=0 (NUM) BL SISI-1 Y N LOP NEXT1 NEXT

132 LEA SI,STRBUF LEA DI,STRING MOV CX,COUNT-1 CLD MOV BL,0 LOP: CMPSW JNZ NEXT1 INC BL DEC CX JMP NEXT NEXT1: DEC SI NEXT: DEC DI DEC DI CMP CX,0 ;防止CX已为0,仍使其继续进行-1操作的情况 JZ OUTPUT LOOP LOP OUTPUT: ADD BL,30H MOV NUM,BL MOV AH,9 LEA DX,MESSG INT 21H

133 五、控制转移指令

134 六、处理器控制指令 标志位操作指令 其他处理器控制指令

135 1. 标志位操作指令 不影响其他标志位 CLC ; CF ← 0 STC ; CF ← 1 CMC ; CF ← CF CF
DF CLD ; DF ← 0 STD ; DF ← 1 IF CLI ; IF ← 0 STI ; IF ← 1 不影响其他标志位

136 其他处理器控制指令 —空操作 格式: NOP 功能:完成一次空操作,除使IP ← IP+1外不做任 何操作。占用CPU3个时钟周期,在程序中可做少 量延时调整。

137 其他处理器控制指令 —停机指令 格式: HLT 功能:使CPU暂停工作,处于等待状态,等待外部中断到来 以结束停机状态,继续下面指令的执行。
其他处理器控制指令 —停机指令 格式: HLT 功能:使CPU暂停工作,处于等待状态,等待外部中断到来 以结束停机状态,继续下面指令的执行。 该指令对标志位无影响

138 其他处理器控制指令 —等待指令 格式: WAIT 功能:使CPU处于等待状态,等待协处理器完成当前的工作。

139 其他处理器控制指令 —换码(处理器交权)指令
其他处理器控制指令 —换码(处理器交权)指令 格式: ESC 6位imm,R/M 功能:浮点协处理器8087指令是与8086的整数指令组合在 一起的,当8086发现是一条浮点指令时,就利用ESC指令 将浮点指令交给8087执行 实际编写程序时,一般采用易于理解的浮点指令助记符格式 ESC 6,[SI] ;实数除法指令:FDIV dword ptr [SI] ESC 20H,AL ;整数加法指令:FADD ST(0),ST

140 其他处理器控制指令 —总线封锁前缀LOCK
功能:与其他指令联合以维持总线的封锁信号直到 与其联合的控制指令执行完成。 用于保证指令的完整执行。

141 § 3.4 80x86的机器语言指令概况 介绍指令编码是为了说明CPU指令系统的机器码是 如何构成的 双操作数指令编码格式 2-6字节组成
双操作数指令编码格式 2-6字节组成 单操作数指令编码格式 与AX、AL有关的指令编码格式 其它指令编码格式

142 一、双操作数指令编码格式 MOV ADD SUB AND data_low data_high D_high D_low d w
op code d w MOD REG R/M 210 543 76 7 2 1 0 操作特征 寻址特征 位移量 立即数

143 1、操作特征部分 操作码字段:说明指令规定的操作种类和操作数 的来源(是否使用AX\AL或imm)
方向字段:表示操作数由寻址特征的哪部分表示 1 DEST 由REG字段确定,SRC由MOD和R/M确定 0 DEST 由MOD和R/M 字段确定,SRC由REG确定 d= R或M w字段: 1 字操作 0 字节操作 w=

144 2、寻址特征部分 表示两个操作数所使用的寻址方式 REG D5D4D3 共3位,8种组合具体确定哪个R REG w=1 w=0 000 AX
AL 001 CX CL 010 DX DL 011 BX BL 100 SP AH 101 BP CH 110 SI DH 111 DI BH

145 2、寻址特征部分 MOD(寻址方式)字段: D7D6共2位 R/M字段: D2D1D0共3位 直接 R间址 基址、变址 基址加变址

146 MOD R/M EA的计算公式 11 00 01 10 w=0 W=1 000 ( BX+SI) DS ( BX+SI) +D8 ( BX+SI ) +D16 AL AX 001 ( BX+DI) ( BX+DI)+D8 ( BX+DI)+D16 CL CX 010 ( BP+SI ) SS ( BP+SI ) +D8 ( BP+SI )+D16 DL DX 011 ( BP+DI ) ( BP+DI ) +D8 ( BP+DI ) +D16 BL BX 100 ( SI ) (SI) +D8 (SI) +D16 AH SP 101 (DI) (DI) +D8 (DI) +D16 CH BP 110 (BP) (BP) +D8 (BP) + D16 DH SI 111 (BX) (BX) +D8 (BX) + D16 BH DI

147 3、位移量部分 由寻址特征决定了是否包含该部分 MOD=11/00, 不包含该部分 MOD=01, 第3字节 MOD=10, 第3、4字节

148 4、立即数部分 如有立即数则位于指令的最后两字节 如有段超越时,在指令编码前加1字节

149 二、指令的执行时间 取指 取操作数 执行指令 传送结果 各阶段所需时间的总和

150 指令 寻址方式 时钟周期 加法ADD R-R 3 传送MOV 2 整数乘法IMUL R16 128-154 整数除法IDIV 165-184
移位 R ,1 转移JMP 直接 15 条件转移 不转移 4 转移 16 不仅不同指令的执行时间差别很大,而且同一种指令使用不同的寻址方式执行时间的差别也很大。


Download ppt "第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统"

Similar presentations


Ads by Google