Presentation is loading. Please wait.

Presentation is loading. Please wait.

第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统.

Similar presentations


Presentation on theme: "第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统."— Presentation transcript:

1 第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统

2 3.1 寻址方式 3.1.1 指令的书写格式 指令有两种书写格式: * 机器指令:由一串二进制数描述; * 符号指令:用英文字母缩写词描述。
3.1 寻址方式 指令的书写格式 指令有两种书写格式: * 机器指令:由一串二进制数描述; * 符号指令:用英文字母缩写词描述。 符号指令的书写格式如下: 标号: 操作助记符 [目的操作数][,源操作数];注释

3 几点说明: 标号—表示某一条指令所在存储单元的首址。 标号应由字母打头,后跟字母、数字及特殊字符均可,但不能用关键字。 标号的用法: 1、 标号一般放在子程序(子过程)的第一条指令的开头; 2、标号一般放在转移指令要转去的目的地的 第一条指令的开头。 3、标号一般放在其他符号定义的前面。

4 操作数 —— 有源操作数和目的操作数,他们之 间用“,” 分隔。 操作数也可有可无。
MOV; ADD; SUB; END。 指令助记符 (操作助记符): 操作数 —— 有源操作数和目的操作数,他们之 间用“,” 分隔。 操作数也可有可无。

5 一般在指令中包含有操作码和操作数,怎样找到指令中的操作数和操作数所在的地址,这就是寻址方式。
数据寻址方式 一般在指令中包含有操作码和操作数,怎样找到指令中的操作数和操作数所在的地址,这就是寻址方式。 在微机中的操作数有三种存放方式: (1)立即数——包含在本条指令中,即: 存放在代码段中; (2) 操作数存放在CPU的某个寄存器中; (3) 操作数存放在存储器的数据段或堆栈段或附加数据段中。

6 所以,总的来说,数据寻址方式分为三种: 立即寻址 寄存器寻址 存储器寻址

7 一、立即寻址 如: MOV EAX,80000000H MOV BX,6688H MOV AX,1234H 立即数只能作为源操作数
操作数直接包含在代码段的指令中。 如: MOV EAX, H MOV BX,6688H MOV AX,1234H 立即数只能作为源操作数 立即寻址主要用来给通用寄存器或存储器 赋值 不允许给段寄存器直接赋值

8 例3.1 立即寻址

9 立即寻址过程示意

10 立即寻址动态示意

11 16位寄存器:AX、BX、CX、DX、SP、BP、SI、 DI、CS、DS、SS、ES、FS、GS 8 位寄存器:AH、AL、BH、BL、
二、寄存器寻址 操作数在寄存器中。 32位寄存器:EAX、EBX、ECX、EDX、 ESP、EBP、 ESI、EDI 16位寄存器:AX、BX、CX、DX、SP、BP、SI、 DI、CS、DS、SS、ES、FS、GS 8 位寄存器:AH、AL、BH、BL、 CH、CL、DH、DL 如: MOV AX,BX MOV EDI,ESI MOV AL,CL

12 例3.2 寄存器寻址

13 EA的计算方法根据采用的寻址方式不同而不 同。
三、存储器寻址 操作数在存储器中,其地址由指令以某种 方式指出。 (一)16位指令模式下: 物理地址=段基址× 10H+ 有效地址EA (二)32位指令模式下: 物理地址=段基址+ 有效地址EA EA的计算方法根据采用的寻址方式不同而不 同。

14 段基址×10H+基址+变址+偏移量 偏移量:8位或16位 则以DS寄存器内容为段基址; 如果有效地址在BX,SI或DI中,
(一)16位指令模式下的存储器寻址 16位指令模式寻址结构由4部分组成: 段基址×10H+基址+变址+偏移量 基址:BX、BP , 变址:SI、DI , 偏移量:8位或16位 如果有效地址在BX,SI或DI中, 则以DS寄存器内容为段基址; 如果有效地址在BP中,则以SS段寄存器 的内容为段基址。

15 如果使用段超越(CS:ES:DS:SS:),
前缀操作数可以放在冒号前指定的段。 例如:MOV ES:[DI],AL MOV ES:2000H, AL 其中ES为前缀字节,产生目标码时,它将放在MOV指令的前面, 即: ES: MOV[DI],AL 亦即: MOV ES:[DI],AL

16 操作数所在的有效地址EA直接由指令指出。 例2 MOV BL,BLOCK 例3 MOV BX,DATA1
16位指令模式寻址方式: 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址 1、直接寻址 操作数在存储器单元中。 操作数所在的有效地址EA直接由指令指出。 例1 MOV AX,[3000H] 例2 MOV BL,BLOCK 例3 MOV BX,DATA1

17 例3.3 直接寻址

18 直接寻址过程示意

19 直接寻址动态示意

20 操作数的有效地址在BX、BP或SI、DI中,EA可表示为 例1 MOV AX,[BX] 例2 MOV DL,[SI]
2、寄存器间接寻址 操作数的有效地址在BX、BP或SI、DI中,EA可表示为 例1 MOV AX,[BX] 例2 MOV DL,[SI]

21 例3.4 寄存器间接寻址

22 寄存器间接寻址过程示意

23 寄存器间接寻址动态示意

24 操作数在存储单元中,其有效地址EA可表示为
3、寄存器相对寻址 操作数在存储单元中,其有效地址EA可表示为 例1 : MOV AL,[BX+4000H] 亦可写成: MOV AL,4000H[BX] 例2 : MOV AX,[BP+2000H]

25 例3.6 寄存器相对寻址

26 寄存器相对寻址过程示意

27 寄存器相对寻址动态示意

28 操作数在存储单元中,其有效地址EA可表示为
4、基址变址寻址 操作数在存储单元中,其有效地址EA可表示为 例1 MOV AX,[BX+SI] 或写成: MOV AX,[BX][SI] 例2 MOV AX,[BX+DI] 例3 MOV AX,[BP+SI] 例4 MOV AX,[BP+DI]

29 例3.7 基址变址寻址

30 基址变址寻址过程示意

31 基址变址寻址动态示意

32 操作数在存储单元中,其有效地址EA可表示为
5、相对基址变址寻址 操作数在存储单元中,其有效地址EA可表示为 例1: MOV AX,[BX+SI+1500H] 或写成 : MOV AX,1500[BX][SI] 例2 : MOV AX,[BP+DI+1000H]

33 例3.8 相对基址变址寻址

34 相对基址变址寻址过程示意

35 相对基址变址寻址动态示意

36 EBP时,默认段寄存器SS存放段选择符,否则, 默认DS存放段选择符。也可使用段超越前缀来 指定。 比例因子为1,2,4,8。偏移量为8位
(二) 32位指令模式下的存储器寻址 32位指令模式寻址结构由5部分组成: 段址+基址+变址﹡比例因子+偏移量 其中基址寄存器或变址寄存器可以是除ESP 以外的任何32位通用寄存器。当基址寄存器为 EBP时,默认段寄存器SS存放段选择符,否则, 默认DS存放段选择符。也可使用段超越前缀来 指定。 比例因子为1,2,4,8。偏移量为8位 或32位。

37 当偏移量为32位时,段内可寻址范围为: -231~+231-1字节空间。 32位寻址方式如下图: × + 比例因子 1,2,4,8 描述符
选择符 × CS SS DS ES FS GS 物理基址 段限 访问权限 变址寄存器 + 线性 地址

38 1、直接寻址有两种书写格式 (1)、指令中直接写出操作数所在存储单元的32位有效地址(EA),注意:段超越前缀不能省略,否则,会出现寻址错误。 如:MOV EAX,DS:[ H] (2)、用变量名代表存储单元的有效地址 如:把数据段中以BUF命名的双字单元的内容送到EAX。 MOV EAX,DS:BUF MOV EAX,BUF

39 2、寄存器间接寻址,操作数的有效地址由EA(EAX、EBX、ECX、EDX、ESI、EDI、EBP)指定。
如:MOV EBX,UBF MOV EAX,[EBX] 3、相对基址寻址,操作数的有效地址由EA(EAX、EBX、ECX、EDX、ESI、EDI、EBP)+ 偏移量(8、32)指定。 如:MOV EAX,NUM ;NBM有效地址 MOV EDX,[EAX+80H]

40 4、变址寻址,有两种格式 1、有比例因子的变址寻址 如:MOV EBX,[ESI×4+80H] 2、无比例因子的变址寻址 MOV EBX,[ESI+80H] 5、基址加变址寻址,有两种格式 (1)、有比例因子的基址加变址寻址 如:MOV EAX,[EBP+ESI×4+80H]

41 (2)、无比例因子的基址加变址寻址 如:MOV EAX,[EBP+ESI+80H]

42 3.1.2 程序地址寻址方式 带符号的相对偏移量,程序目标地址为当 前IP值加上相对偏移量作为偏移地址。 相对寻址为段内寻址,指令中给出
程序地址寻址方式 一、相对寻址 相对寻址为段内寻址,指令中给出 带符号的相对偏移量,程序目标地址为当 前IP值加上相对偏移量作为偏移地址。 类 型 指 令 相对偏移量 转移范围 SHORT JMP 1 -128~127 NEAR(16位) JMP/CALL 2 -32768~32767 NEAR(32位) 4 - ~

43 地址 机器码 助记符 例如: 1D24:0100 8BF7 MOV DI,SI 1D24:0102 EB02 JMP SHORT NEXT
地址 机器码 助记符 1D24: BF MOV DI,SI 1D24: EB JMP SHORT NEXT 1D24: ACA MOV CL,DL 1D24: AC NEXT: MOV AL,BL

44 二、 直接寻址 直接寻址是指指令中直接给出转移指令的目标地址。在段间转移中,指令中给出目标段地址或代码段的段描述符。
例如: ·COD CODE ;代码段定义 地址 机器码 助记符 1D24: BF MOV DI,SI 1D24: EA0A00251D JMP FAR PTR NEXT ·CODE CODE ;代码段定义 1D25:000A 8ACA NEXT:MOV CL,DL

45 BUF——双字类型。在BUF所指的存储单元中存放着CODE2段中标号NEXT的段基址和偏移地址(1D25:0008)。
三、间接寻址 间接寻址 分段内和段间间接寻址,指令中以间接方式给出转移指令的目标地址,通常存放在数据段。采用(E)BP寻址,指令目标地址放在堆栈段。使用段超越前缀,也可以存放在其他段。 下面的例子为段间间接转移 指令。 BX中存放的是符号地址BUF的偏移地址 BUF——双字类型。在BUF所指的存储单元中存放着CODE2段中标号NEXT的段基址和偏移地址(1D25:0008)。

46 ·CODE CODE1 ·CODE CODE2 1D26:0000 0800251D BUF DD NEXT
地址 操作数 ·DATA 1D26: D BUF DD NEXT ·CODE CODE1 地址 机器码 1D24: BB MOV BX,OFFSET DATA1 1D24: FF2F JNP FAR PTR [BX] ; ·CODE CODE2 1D25: ACA NEXT:MOV CL,DL EXIT

47 CS:1D24 1D24:0010 BB 00 FF 2F 8A CA 08 25 1D MOV BX,OFFSET DATA1 IP:0010 DX:0000 JMP FAR PTR [BX] DS:1D26 1D25:0008 MOV CL,DL 1D26:0000 NEXT偏移地址 IP:0008 数据段 CS:1D25 NEXT段地址

48 堆栈地址寻址方式 用途:暂存数据,自动保护中断断点、调用过程 断点等,堆栈的存取方式是: 采用先进后出规则。 使用PUSH 指令将数据压入堆栈, 使用POP指令数据弹出堆栈。 字数据进栈步骤: 1、(E)SP-1→(E)SP 2、 高8位→堆栈 3、(E)SP-1→(E)SP 4、低8位→堆栈

49 字数据出栈步骤: 1、栈顶内容→目标寄存器或目标单元的低8位 2、(E)SP+1→(E)SP 3、栈顶内容→目标寄存器或目标单元的高8位 4、(E)SP+1→(E)SP

50 堆栈操作示意

51 思考题 (1)MOV AL,[1234H] (2)MOV EDX,[BX] (3)MOV CL,[BX+100H]
1、 设DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX= H,EBX= H,假设按16位实模式操作,确定下列每条指令访问内存的物理地址,并且指出源操作数及目的操作数的寻址方式。 (1)MOV AL,[1234H] (2)MOV EDX,[BX] (3)MOV CL,[BX+100H] (4)MOV [SI],EBX (5)MOV AH,BUF[BX+SI] (6)MOV EAX,[BP+1234H]

52 3.2 80X86指令格式 指令基本格式: 标号可有可无; 助记符必有,如:ADD ,MOV,IN,OUT。 操作数: 源操作数 可有可无。
[标号:] 助记符 目的操作数,源操作数;注释 标号可有可无; 助记符必有,如:ADD ,MOV,IN,OUT。 操作数: 源操作数 可有可无。 目的操作数

53 2、存储器操作数:需要通过寄存器间接寻址, 来到操作数所在存储单元的 地址。
立即数 8位:AH,AL,BH,BL,CH,CL,DH,DL 1、 通 用 寄存器: 16位:AX,BX,CX,DX,SI,DI,SP,BP 32位:EAX,EBX,ECX,EDX,ESI,EDI, ESP,EBP 2、存储器操作数:需要通过寄存器间接寻址, 来到操作数所在存储单元的 地址。

54 16位间接寻址的寄存器有:BX,BP,SI,DI;
32位间接寻址的寄存器有:EAX,EBX,ECX, EDX,ESI,EDI, EBP。 3、存储器操作数缺省数据类型: 8位指令操作为:字节类型; 16位指令操作为:字类型; 32位指令操作为:双字型,

55 在使用中如要改变地址表达式的类型,可使用PTR伪指令来定义。
如: 字节型 BYTE PTR [Reg] 字 型 WORD PTR [ Reg] 双字型 DWORD PTR [Reg] 如: INC WORD PTR [BX] 4、 段寄存器操作数(Seg),为16位的段寄存器: CS,DS,ES,SS,FS,GS。

56 5、立即数(imm):只能作为源操作数,其数据类型由目的操作数来决定。如果采用十六进制表示立即数,当大于9时,A~F的数必须在前面加“0”,后面加“H”。
对指令的分析应注意以下4点: (1)、指令的功能; (2)、适用于指令的寻址方式; (3)、指令对标志位的影响; (4)、指令长度和执行时间。

57 3.3 80X86指令系统 按功能分类: 数据传送指令 算术运算指令 逻辑运算指令 控制转移类指令 串操作指令 输入/输出指令
处理器控制指令 中断指令与DOS功能调用

58 数据传送指令 数据传送指令包括通用数据传送、地址传送指令、标志寄存器传送指令、符号扩展指令和扩展传送指令等。 通用数据传送指令 堆栈操作指令 地址传送指令 标志寄存器传送指令 查表指令 符号扩展指令

59 一、通用数据传送指令 1、传送指令格式: MOV Dest, Source 数据传送的路径方向于图示: 立即数 存储器 通用 寄存器 CS 、DS、 ES、SS

60 ①、MOV REG ,REG;寄存器到寄存器
②、 MOV REG ,IMM;立即数到寄存器 ③、 MOV MEM,IMM;立即数到存储器 ④、 MOV MEM,REG;寄存器到存储器 ⑤、 MOV REG ,MEM;存储器到寄存器 ⑥、 MOV SEGREG,REG;( CS除外) ⑦、 MOV REG, SEGREG;( 含CS) ⑧、 MOV SEGREG,MEM; (CS除外) ⑨、 MOV MEM, SEGREG;( 含CS)

61 如:MOV AL,CL MOV BX,[SI] MOV EAX,EBX MOV AX,0D56BH MOV EAX,[EBX+ESI]

62 2、交换指令 交换操作数的数据类型:字节型、字型、双字型。允许通用寄存器之间,通用寄存器与存储器之间交换数据。 格式: XCHG DEST,SRC 如:XCHG EAX,EBX;32位交换 XCHG AX,[SI];存储器与寄存器交换 XCHG AL,DL;8位交换 两操作数中不允许出现立即数 两操作数不允许同时为存储器操作数 两操作数数据类型必须一致

63 功能:取出 DS:[BX+ AL] 中的1个字节送给 AL ,或者取出DS:[EBX+AL]中的1个 字节送给AL。
3、字节交换指令 格式: BSWAP 32位寄存器 功能:将 位31 ~ 位24 与 位7 ~ 位0 交换, 位23 ~ 位 16 与位15 ~ 位8交换 4、 查表指令 格式: XLAT 表头变量名 功能:取出 DS:[BX+ AL] 中的1个字节送给 AL ,或者取出DS:[EBX+AL]中的1个 字节送给AL。

64 例如:字形编码:0——F,对应的表头为: MOV DS, 数据段基址 MOV BX, OFFSET TAB MOV AL, NUM
TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH, DB H,7FH,6FH,77H,7CH,39H,5EH, DB H,71H NUM DB X X ;0 ~ 15 中的任一数所在表中的地址 MOV DS, 数据段基址 MOV BX, OFFSET TAB MOV AL, NUM XLAT TAB

65 3、扩展传送指令 MOVSX DEST,SRC MOVZX DEST,SRC 如 : MOV BL,80H
MOVSX AX,BL ; AX=FF80H MOVZX AX,BL ;AX=0080H * 目的操作数为通用寄存器(16位或32位) * 源操作数长度必须小于目的操作数长度,为通用寄存器或存储器操作数(8位或16位)

66 使用MOV指令应注意: 立即数不允许直接送段寄存器,且立即数不能做目的操作数 源操作数和目的操作数不允许同时为存储器操作数
源操作数和目的操作数不允许同时为段寄存器 两操作数的数据类型要一致 传送操作不影响标志位 不允许对CS、(E)IP传送数据

67 二、堆栈操作指令 堆栈是人为定义的一块内存空间,用来暂存 数据的。堆栈能自动保护中断断点和现场以及调
用子过程的断点和现场等。对数据的存取按照 “先进后出”的规则进行。 堆栈的栈底在高端地址单元,栈顶为低端地 址。 当数据进栈后,栈顶向低端地址下浮; 当数据出栈后,栈顶向高端地址上浮。

68 一个16位或32位数据进栈的规律是: 高位字节压入高地址单元,低位字节压入低地址单元。 一个16位或32位数据出栈的规律是: 低位字节弹到目标操作数低位,高位字节弹到目标操作数高位。 栈顶位置由SP/ESP指出。

69 1、压栈指令 : PUSH SRC 如: PUSH AL PUSH AX PUSH EAX PUSH DS PUSH [SI] PUSH DWORD PTR [SI] PUSH H PUSH 80H

70 2、出栈指令: POP DEST 如: POP 80H POP 1234H POP DWORD PTR [DI] POP [DI] POP DS POP [EAX] POP AX POP AL

71 (3)、16位标志寄存器进栈/出栈指令 (4)、32位标志寄存器进栈/出栈 (5)、8个16位通用寄存器进栈/出栈指令
PUSHF ;先PS-1→SP,16位标志压入SS:[SP] POPF ;先弹出16位标志到FLAGS,SP+2 →SP (4)、32位标志寄存器进栈/出栈 PUSHFD;先ESP -4→ESP,32位标志压入SS:[ESP] POPFD; 先弹出4字节标志到EFALGS,ESP+4 →ESP (5)、8个16位通用寄存器进栈/出栈指令 FUSHA ;先SP - 16 →SP, 然后把AX,BX,CX, DX,SP,BP,SI,DI的内容依次压栈, 进栈的SP值是调整前的值。

72 (6)、8个32位通用寄存器进栈出栈指令 PUSHAD ; 先ESP—32→ESP,把EAX,EBX, ECX,EDX,ESP,EBP,ESI,EDI 依次压入堆栈, 进栈的ESP值是调整 前的值。 POPAD ;先从堆栈弹出32字节( EDI ,ESI , EBP ,ESP ,EDX, ECX, EBX, EAX)。 然后 ,ESP+ 32→ESP。

73 三、地址传送指令 格式: LEA DEST,SRC *DEST为16位或32位通用寄存器 *SRC为16位或32位存储器操作数
例1:LEA BX,[SI+1005H] 若SI=1000H 则BX=? 例2:LEA DI,BLOCK MOV DI,BLOCK 有何区别?

74 四、标志寄存器传送指令 格式1:LAHF SAHF 格式2:PUSHF POPF 格式3: PUSHFD POPFD
*SAHF、POPF、POPFD影响标志位

75 五、查表指令 格式: XLAT 指令规定:表格存于数据段中 表首偏移地址→BX 表内偏移量→AL 查找结果→AL 所找单元的物理地址:
(DS)×10H+(BX)+(AL)

76 例:试编程将内存中以BLOCK为起始地址的编码表中顺序号为3的编码送AL寄存器。
查表指令应用举例 例:试编程将内存中以BLOCK为起始地址的编码表中顺序号为3的编码送AL寄存器。 LEA BX,BLOCK MOV AL, 3 XLAT 结果:AL内容为4FH

77 六、符号扩展指令 针对带符号数,按带符号数扩展。 1、CBW 功能:AL(8位)→AX(16位) 2、CWD
功能:AX(16位)→DX:AX(32位) 3、CWDE 功能:AX(16位)→EAX(32位) 4、CDQ 功能:EAX(32位)→EDX:EAX(64位)

78 算术运算指令 加法指令 减法指令 加1减1指令 比较指令 乘法指令 除法指令 BCD算术运算指令

79 算术运算类指令特点 影响标志位 操作数不允许为段寄存器 不允许两个操作数同为存储器操作数 若无特别规定,操作数类型必须一致
目的操作数不允许为立即数 当操作数类型不明确时必须使用PTR伪指令

80 一、加法指令 格式(1) ADD DEST,SRC 功能:源操作数+目的操作数→目的操作数 格式(2) ADC DEST,SRC
功能:源操作数+目的操作数+CF→目的操作数 例:32F2H+A020H=? MOV AX,32F2H 或 MOV AX,32F2H MOV BX,0A020H MOV BX,0A020H ADD AX,BX ADD AL,BL ADC AH,BH

81 二、减法指令 格式(1) SUB DEST,SRC 功能:目的操作数-源操作数→目的操作数 格式(2) SBB DEST,SRC
功能:目的操作数-源操作数-CF→目的操作数 *SUB、SBB指令与ADD、ADC一样,影响标志位OF、SF、ZF、AF,PF,CF

82 三、加1减1指令 加1指令 INC DEST 功能:目的操作数+1→目的操作数 减1指令 DEC DEST 功能:目的操作数-1→目的操作数
*不影响CF,影响OF、SF、ZF、AF、PF 例:INC BX INC BYTE PTR [BX] DEC EAX DEC WORD PTR[SI]

83 四、比较指令 格式 CMP DEST,SRC 功能:目的操作数-源操作数 (1)若目、源为无符号数
CF=0 则目≧源 (若ZF=1,则目=源) CF=1 则目﹤源 (2)若目、源为带符号数 ①若目、源为同号数(OF=0) 若均为正,SF=0 则目≧源(若ZF=1,则目=源) SF=1 则目﹤源 若均为负 ,SF=0 则目≧源(若ZF=1,则目=源)

84 ②若目、源为异号数(OF=0或1) 若目为正,源为负 则目﹥源 若此时 SF=0 则OF=0 若此时 SF=1 则OF=1 若目为负,源为正 则目﹤源 若此时 SF=1 则OF=0 若此时 SF=0 则OF=1 综合起来,若目、源为带符号数 OF⊕SF=0 则目≧源 OF⊕SF=1 则目﹤源

85 五、交换相加指令 六、求补指令 格式 XADD DEST,SRC 功能:目的操作数+源操作数→目的操作数 且原目的操作数→源操作数
影响标志位OF、SF、ZF、AF、PF、CF 六、求补指令 格式 NEG DEST 功能:求目的操作数的相反数的补码

86 七、乘法指令 格式 MUL SRC (针对无符号数) IMUL SRC (针对带符号数) 隐含规定:
另一乘数因子在累加器中(AL/ AX / EAX) 结果为乘积,乘积隐含在(AX/DX:AX/EDX:EAX) ↑ ↑ ↑ 字节乘 字乘 双字乘 *若乘积高位为0,则CF=0,OF=0 若乘积高位含有效数据,则CF=1,OF=1 对其它标志位无定义

87 例:计算存于下列内存中的两个无符号数的乘积 1234H×2345H=?结果放RESULT单元
LEA BX,BLOCK MOV AX,[BX] MUL WORD PTR [BX+4] MOV RESULT,AX MOV RESULT+2,DX 结果为 H CF=1,OF=1

88 八、除法指令 格式 DIV SRC (针对无符号数) IDIV SRC (针对带符号数) 隐含规定:
被除数隐含在 ( AX/DX:AX/ EDX:EAX) 商隐含在 ( AL/ AX / EAX) 余数隐含在 ( AH/ DX / EDX) ↑ ↑ ↑ 字节除 字除 双字除 *当除数为0或商溢出时会产生中断 *被除数必须是除数的双倍长度,否则,需要进行高位扩展 无符号数高位扩展为全0,带符号数按符号扩展指令扩展

89 九、组合型BCD算术运算指令 组合BCD码也称压缩格式的BCD码,用一个字节存储2位BCD码。
该类指令使用场合: 当参与运算的十进制数以其组合BCD码形式存放,加减时,计算机会当作二进制数来运算,其结果一定不是理想要得的组合型BCD码结果,这时,必须用组合型BCD算术运算指令加以调整,即将二进制结果调整为BCD码表示形式。 加法调整指令一般紧跟在ADD或ADC之后,减法调整指令一般紧跟在SUB或SBB之后。

90 1、组合型BCD加法调整指令 格式 DAA 功能:AL(二进制和)→组合BCD码 例:26+68=?
分析:用组合BCD码存放时,两个数应分别为26H和68H,理想结果应该为94H。编程如下: MOV AL,26H MOV BL,68H ADD AL,BL ;AL=8EH DAA ;AL=94H

91 2、组合型BCD减法调整指令 格式 DAS 功能:AL(二进制差)→组合BCD码 例:65-56=? MOV AL,65H
MOV BL,56H SUB AL,BL ;AL=0FH DAS ;AL=09H

92 十、非组合型BCD算术运算指令 非 组合BCD码也称非压缩格式的BCD码,用一个字节存储1位BCD码,高4位无意义。
3635H即 B表示的数是65 由于0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码,所以,ASCII码是一种非组合型BCD码。 非组合型BCD调整指令有加、减、乘、除四种调整指令。

93 1、非组合型BCD加法调整指令 格式 AAA 功能:AL(二进制和)→非组合BCD码 例:5+9=? 分析:用非组合BCD码存放时,两个数应分别为05H和09H,理想结果应该为0104H。编程如下: MOV AL,05H MOV BL,09H ADD AL,BL ;AL=0EH AAA ;AX=0104H

94 功能:AL(二进制乘积)→非组合BCD码 4、非组合型BCD除法调整指令 格式 AAD 功能:AX(两位非组合BCD码)→二进制数
格式 AAS 功能:AL(二进制差)→非组合BCD码 3、非组合型BCD乘法调整指令 格式 AAM 功能:AL(二进制乘积)→非组合BCD码 4、非组合型BCD除法调整指令 格式 AAD 功能:AX(两位非组合BCD码)→二进制数 *AAD指令必须放在除法指令之前进行。 其他调整指令都是先运算后调整。

95 思考题 判断下列指令是否正确,若有错误,请指出原因,并改正。
(1)MOV BL,OFFSET BLOCK (2)LEA DI,[BX+SI] (3)PUSH AL (4)POP CS (5)MOV ES,DS (6)MOV AX,[SI+DI] (7)MOV [BX+BP],AX (8)ADD AX,F000H (9)MOV [BX],[SI] (10)MOV AH,DX (11)INC [BX] (12)XCHG AX,2000H (13)MOV AX,[BX+DX] (14)ADD [BX],BX (15)MOV AX,DI+SI (16)MOV EAX,[ECX*4+80H]

96 3.3.3 逻辑运算指令 包括:逻辑指令、移位指令、位操作指令 该类指令特点: 影响标志位 操作数不允许为段寄存器
逻辑运算指令 包括:逻辑指令、移位指令、位操作指令 该类指令特点: 影响标志位 操作数不允许为段寄存器 不允许两个操作数同为存储器操作数 若无特别规定,操作数类型必须一致 目的操作数不允许为立即数 当操作数类型不明确时必须使用PTR伪指令

97 一、逻辑指令 AND AL,00001111B 1、逻辑与指令 格式 AND DEST,SRC 功能:目的操作数∧源操作数→目的操作数
*常用来使目的操作数的某些位被屏蔽(即清0) 例:MOV AL, B 若要使AL中高4位清0,低4位不变,怎么办? AND AL, B

98 2、逻辑或指令 OR AL,11000000B 格式 OR DEST,SRC 功能:目的操作数∨源操作数→目的操作数
*常用来使目的操作数的某些位置1 例:MOV AL, B 若要使AL中最高2位置1,低6位不变,怎么办? OR AL, B

99 3、逻辑异或指令 XOR AL,10000001B 格式 XOR DEST,SRC 功能:目的操作数⊕源操作数→目的操作数
*①常用来使目的操作数的某些位变反 例:MOV AL, B 若要使AL中D7、D0位变反,其它位不变 *②对寄存器操作数清0 例 XOR DS,DS *③测试一操作数与另一操作数是否相等 例 XOR AL,BL 若ZF=1,则AL=BL XOR AL, B

100 TEST AL,10000000B 若ZF=0,则D7=1 4、逻辑非指令 格式 NOT DEST 功能:目的操作数按位取反→目的操作数
5、测试指令 格式 TEST DEST,SRC 功能:目的操作数∧源操作数 *常用来测试目的操作数的某位的状态(是0还是1) 或者用来测试目的操作数的某些位是否同时为0 例:若要测试AL中D7位为0还是为1,怎么办? TEST AL, B 若ZF=1,则D7=0 若ZF=0,则D7=1

101 逻辑指令对标志位的影响 NOT 指令不影响标志位
AND、OR、XOR、TEST 指令影响标志位SF、ZF、PF,并且使CF=0,OF=0,对AF未定义

102 二、移位指令 1、移位分类 算术移位(A) 左移(L) 移位指令有:SAL、SAR、SHL、SHR ROL、ROR、RCL、RCR
非循环(S) 左移(L) 逻辑移位(H) 右移(R) 小循环移位(O)左移(L) 循环 (R) 右移(R) 大循环移位(C)左移(L) 移位指令有:SAL、SAR、SHL、SHR ROL、ROR、RCL、RCR

103 2、移位指令格式 DEST:表示目的操作数,(寄存器或存储器)OPRD:表示移位的次数,可以是立即数,也可 以由CL间接指定移位次数。
SAL DEST,OPRD SAR DEST,OPRD SHL DEST,OPRD SHR DEST,OPRD ROL DEST,OPRD ROR DEST,OPRD RCL DEST,OPRD RCR DEST,OPRD

104 3、移位示意图1(非循环移位) (a)SAL/SHL; (b)SAR; (c)SHR

105 4、移位示意图2(循环移位) (a)ROL; (b) ROR; (c)RCL; (d)RCR

106 5、对标志位的影响 SAL SHL 影响OF、SF、ZF、PF、CF SHR SAR ROL ROR 影响CF、OF RCL RCR

107 XOR AH,AH SAL AX,1 MOV BX,AX MOV CL,2 ;AH=0 ;AX=2X SAL AX,CL ;BX=2X
设一个字节数据X存放在AL 寄存器中,试分析下列程序段的功能。 XOR AH,AH SAL AX,1 MOV BX,AX MOV CL,2 SAL AX,CL ADD AX,BX ;AH=0 ;AX=2X ;BX=2X ;AX=4×(2X)=8X ;AX=8X+2X=10X 功能:10X→AX

108 三、位操作指令 1、位测试和设置指令 BT DEST,SRC (指定位送CF) BTC DEST,SRC (指定位送CF,该位取反)
BTR DEST,SRC (指定位送CF,该位清0) BTS DEST,SRC (指定位送CF,该位置1) 如 MOV AX,1234H ;AX= B MOV CX,5 BT AX,CX ;CF=1,AX=1234H BTC AX,CX ;CF=1,AX=1214H BTS AX,CX ;CF=0,AX=1234H BTR AX,CX ;CF=1,AX=1214H

109 2、位扫描指令 BSF DEST,SRC BSR DEST,SRC 如 MOV AX,1234H ;AX=0001001000110100B
功能:从低位开始扫描SRC,若所有位为0,则ZF=0,否 则ZF=1,且将第一个出现1的位号存入DEST中。 BSR DEST,SRC 功能:从高位开始扫描SRC,若所有位为0,则ZF=0,否 则ZF=1,且将第一个出现1的位号存入DEST中。 如 MOV AX,1234H ;AX= B BSF BX,AX ;ZF=1,BX=0002H BSR DX,CX ;CF=1,AX=000CH

110 3、位标志指令 CLC (CF=0) STC (CF=1) CLD (DF=0) STD (DF=1) CLI (IF=0) STI (IF=1) 4、条件设置字节指令 格式:SETCOND DEST 功能:测试条件(COND)若为真,则将DEST置01H,否则置00H。见P87的表3.3

111 控制转移类指令 该类指令不影响标志位。 无条件转移指令 条件转移指令 循环控制指令

112 一、无条件转移指令 TARGET:目标标号 REG:通用寄存器 1、段内直接转移 JMP TARGET 2、段内间接转移 JMP REG
JMP NEAR PTR [REG] 3、段间直接转移 JMP FAR PTR TARGET 4、段间间接转移 JMP FAR PTR [REG]

113 二、条件转移指令 JO TARGET ;OF=1,即溢出转 1、单标志位条件转移指令 JNO TARGET ;OF=0,不溢出转移
JS TARGET ;SF=1,结果为负转移 JNS TARGET ;SF=0,结果为正转移 JC TARGET ;CF=1,有进位转移 JNC TARGET ;CF=0,无进位则转移 JP TARGET ;PF=1,为偶转移 JNP TARGET ; PF=0,为奇转移 JE/JZ TARGET ;ZF=1,等于或为零转移 JNE/JNZ TARGET ;ZF=0,等于或非零转移

114 例:在不改变AL值的同时,检测AL 中1的个数,且存放在BL中。
.MODEL TINY .CODE .STARTUP MOV BL,0 MOV DL,8 AGAIN: ROL AL,1 JNC NEXT INC BL NEXT: DEC DL JNZ AGAIN .EXIT END

115 2、无符号数比较条件转移指令 助记符: J→转移 A→高于 B→低于 E→等于 N→不 指令: JA/JNBE TARGET ;高于/不低于等于转移 JAE/JNB TARGET ;高于等于/不低于转移 JB/JNAE TARGET ;低于/不高于等于转移 JBE/JNA TARGET ;低于等于/不高于转移

116 3、带符号数比较条件转移指令 J→转移 G→大于 L→小于 E→等于 N→不 JG/JNLE TARGET ;大于/不小于等于转移 JGE/JNL TARGET ;大于等于/不小于转移 JL/JNGE TARGET ;小于/不大于等于转移 JLE/JNG TARGET ;小于等于/不大于转移 4、测试CX条件转移指令 JCXZ TARGET ;CX=0 转移 JECXZ TARGET ;ECX=0 转移

117 使用条件转移指令应注意: *条件转移指令一般跟在CMP指令或TEST指令之后,根据其影响的标志位来决定是否产生转移。 *当条件满足时,转移到目标标号去执行,否则,顺着程序往下执行。

118 例3.65 假设AL中带符号数X为某值,试编程将求出的符号函数值f(x)存放在AH中。
.MODEL TINY .CODE .STARTUP CMP AL,0 JGE BIG MOV AL,0FFH JMP DONE BIG: JE DONE MOV AL,1 DONE: MOV AH,AL .EXIT END

119 三、循环控制指令 格式:LOOPCC TARGET
功能:(E)CX—1→ (E)CX,不影响标志位,且测试条件‘CC’成立,则转移到TARGET处执行. LOOP ; CX—1→ CX,若CX≠0则循环 LOOPW ;同上 LOOPD ; ECX—1→ ECX,若ECX≠0则循环 LOOPE/LOOPZ ; CX—1→ CX,若CX≠0且ZF=1则循环 LOOPEW/LOOPZW ;同上 LOOPED/LOOPZD ; ECX—1→ ECX,若ECX≠0且ZF=1则循环 LOOPNE/LOOPNZ ; CX—1→ CX,若CX≠0且ZF=0则循环 LOOPNEW/LOOPNZW ;同上 LOOPNED/LOOPNZD ; ECX—1→ ECX,若ECX≠0且ZF=0则循环

120 例3.68 找出以ARRAY为首地址的100个字数组中的第一个非0项,送AX寄存器中.
.MODEL SMALL .DATA ARRAY DW 0, 0, 0, 0, 1010H, … ;(100个字) .CODE .STARTUP MOV CX, 64H LEA BX, ARRAY MOV SI, 0FFFEH ZERO: INC SI INC SI CMP WORD PTR [BX+SI], 0 LOOPZ ZERO JCXZ A1 MOV AX, [BX+SI] A1: NOP .EXIT END

121 3.3.5 串操作指令 几个概念: 串 串元素 串操作 有关隐含约定: ①寻址: 以DS:(E)SI寻址源串, 以ES:(E)DI寻址目的串
串操作指令 几个概念: 串 串元素 串操作 有关隐含约定: ①寻址: 以DS:(E)SI寻址源串, 以ES:(E)DI寻址目的串 每次串操作后, (E)SI和(E)DI自动指向下一串元素 ②地址移动方向: 当DF=0时, (E)SI和(E)DI的修改为增量 当DF=1时, (E)SI和(E)DI的修改为减量 ③ (E)SI和(E)DI初始赋值 若DF=0, 赋首偏移地址 若DF=1, 赋末偏移地址

122 一、重复前缀指令 REP REPE/Z REPNE/REPNZ 二、方向标志指令 CLD ; (DF=0) STD ; (DF=1)
说明:在串操作指令之前若加上REP,则执行一次串操作后不仅自动修改(E)SI和(E)DI ,而且执行(E)CX—1→( E)CX ,若(E)CX≠0,再次重复串操作,直到(E)CX=0为止。 REPE/Z 说明: (E)CX—1→( E)CX,若(E)CX≠0且ZF=1,则重复 REPNE/REPNZ 说明: (E)CX—1→( E)CX,若(E)CX≠0且ZF=0,则重复 二、方向标志指令 CLD ; (DF=0) STD ; (DF=1)

123 [REP] MOVSB/MOVSW/MOVSD
三、串传送指令 [REP] MOVSB/MOVSW/MOVSD 功能:将DS:(E)SI的内容复制到ES:(E)DI中 例3.69 将以SRC开头的100个字节传送到以DEST开头的单元中. .MODEL SMALL .DATA MOV CX,100 SRC DB 1,2,3, …;(100个字节) LEA SI, SRC DEST DB 100 DUP(?) LEA DI, DEST .CODE CLD .STARTUP REP MOVSB MOV EXIT MOV ES,AX END

124 [REPE/Z] [REPNE/NZ]CMPSB/CMPSW/CMPSD
四、串比较指令 [REPE/Z] [REPNE/NZ]CMPSB/CMPSW/CMPSD 功能:将DS:(E)SI的内容-ES:(E)DI的内容 例 MODEL SMALL .DATA LEA DI, DEST SRC DB ‘A B C D E F G H’ CLD DEST DB ‘A B C E F F F E’ REPE CMPSB SUT DB ? JZ EQUL .CODE MOV BH,0 .STARTUP JMP DONE MOV EQUL:MOV BH, 0FFH MOV ES,AX DONE:MOV SUT,BH MOV CX, EXIT LEA SI, SRC END

125 [REPE/Z] [REPNE/NZ]SCASB/SCASW/SCASD
五、串扫描指令 [REPE/Z] [REPNE/NZ]SCASB/SCASW/SCASD 功能:将AL或AX或EAX的内容-ES:(E)DI的内容 例3.70 .MODEL SMALL MOV AL,’C’ .DATA CLD DEST DB ‘A B C D E F ’ REPNE SCASB ADDR DW ? JZ EQUL .CODE MOV DI,0 .STARTUP JMP DONE MOV EQUL:DEC DI MOV ES,AX DONE:MOV ADDR,DI MOV CX, EXIT LEA DI, DEST END

126 LODSB/LODSW/LODSD 六、串装入指令指令 功能:将DS:(E)SI所指的串元素装入AL或AX或EAX中 七、串存储指令指令
[REP]STOSB/STOSW/STOSD 功能:将AL或AX或EAX中的内容存入ES:(E)DI所指的目的串单元中

127 3.3.6 输入/输出指令 一、输入/输出指令 几个概念: I/O端口 输入 输出 有关约定: ①操作数
输入/输出指令 一、输入/输出指令 几个概念: I/O端口 输入 输出 有关约定: ①操作数 两操作数分别是端口地址内容和累加器(AL或AX或EAX)内容。 ②寻址: 直接寻址(8位端口地址,0~255) 间接寻址(16位端口地址,由DX指定,寻址64K) ③ 端口地址数据长度 每个端口数据长度均为8位

128 1、输入指令 IN DEST,SRC 其中,DEST可以是AL或AX或EAX SRC可以是8位端口地址或DX 如:IN AL,80H
IN AX,80H IN EAX,80H MOV DX,6000H IN AL,DX IN AX,DX IN EAX,DX

129 2、输出指令 OUT DEST,SRC 其中,DEST可以是8位端口地址或DX SRC可以是AL或AX或EAX 如:OUT 80H, AL
OUT 80H,AX OUT 80H, EAX MOV DX,6000H OUT DX,AL OUT DX,AX OUT DX,EAX

130 二、串输入/输出指令 外设端口与存储器单元之间传送数据 1、串输入指令 [REP] INSB/INSW/INSD
功能:将DX指定的端口地址的内容→ES:(E)DI。每输入一次,(E)DI自动修改。加前缀可重复传送。 如: … MOV MOV ES,AX MOV CX,100 CLD LEA DI,BLOCK MOV DX,6000H REP INSB

131 2、串输出指令 [REP] OUTSB/OUTSW/OUTSD 功能:将DS:(E)SI → DX指定的端口地址。每输入一次,(E)SI自动修改。加前缀可重复传送。 如: … MOV CX,100 CLD LEA SI,BLOCK MOV DX,6000H REP OUTSB

132 处理器控制指令 1、空操作 NOP 2、处理器等待指令 WAIT 3、处理器暂停指令 HLT

133 3.3.8 中断指令与DOS功能调用 一、中断指令 1、软中断指令 INT n 其中,n为中断类型码,是一个8位的立即数 2、中断返回指令
IRET IRETD

134 二、DOS功能调用 总入口:INT 21H DOS功能调用步骤: (1)入口参数→指定的寄存器 (2)功能号→AH (3)INT 21H
常用功能子程序 功能号 键盘输入单字符 01H 键盘输入字符串 0AH 输出单字符 02H 输出字符串 09H 返回操作系统 4CH DOS功能调用步骤: (1)入口参数→指定的寄存器 (2)功能号→AH (3)INT 21H (4)取出口参数

135 1、键盘输入单字符 例: MOV AH,01H INT 21H 键入的字符以ASCII码形式存于AL中。 2、输出单字符 例: MOV DL,’A’ MOV AH,02H INT 21H 入口参数事先要存入DL中。 3、返回操作系统 MOV AH,4CH

136 3、键盘输入字符串 例 .MODEL SMALL .DATA BUF DB 20, ?, 20 DUP (?) .CODE .STARTUP
MOV DX,OFFSET BUF MOV AH, 0AH INT 21H .EXIT END 键入的字符串以ASCII码形式存于BUF第3个字节开始的内存单元中。第一个字节存字符串最大字节数,第二字节由系统送入实际键入的字节数。

137 4、输出字符串 例 .MODEL SMALL .DATA BUF DB ‘Hi,good luck!’,’$’ .CODE .STARTUP
LEA DX, BUF MOV AH, 09H INT 21H .EXIT END 要输出的字符串必须以’$’作为结束标志。

138 例3.66 编程实现把BX中的二进制数用十六进制形式显示出来。
.MODEL TINY .CODE .STARTUP MOV CH,4 AGAIN: MOV CL,4 ROL BX,CL NEXT:MOV DL,AL MOV AL,BL MOV AH,2 AND AL,0FH INT 21H OR AL,30H DEC CH CMP AL,3AH JNZ AGAIN JB NEXT EXIT ADD AL,07H END


Download ppt "第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统."

Similar presentations


Ads by Google