Presentation is loading. Please wait.

Presentation is loading. Please wait.

教师:王晓甜 xtwang@mail.xidian.edu.cn 8086CPU 指令系统 教师:王晓甜 xtwang@mail.xidian.edu.cn.

Similar presentations


Presentation on theme: "教师:王晓甜 xtwang@mail.xidian.edu.cn 8086CPU 指令系统 教师:王晓甜 xtwang@mail.xidian.edu.cn."— Presentation transcript:

1 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

2 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的六类指令 5. 总结

3 沟通与交流,让别人领会你的意图,知道该为你做什么事的工具
1. 汇编语言基本概念 什么是 语言 ? 沟通与交流,让别人领会你的意图,知道该为你做什么事的工具 各国语言 有时需要翻译 机器语言 有时需要翻译

4 1. 汇编语言基本概念 什么是 机器语言 ? 人向机器发送号令,让机器能读懂的语言 机器能读懂什么语言 ?
1. 汇编语言基本概念 什么是 机器语言 ? 人向机器发送号令,让机器能读懂的语言 机器能读懂什么语言 ? ……. 例如: B B ; 告诉CPU将AL H。

5 汇编语言 机器语言程序 优点:程序送入计算机后,CPU可以直接执行。 缺点:不易书写,不易检查,编写程序十分困难。 10110000B
采用机器语言编写的程序,即二进制代码程序。 优点:程序送入计算机后,CPU可以直接执行。 缺点:不易书写,不易检查,编写程序十分困难。 汇编语言 B B 采用一组字母、数字和符号来代替一条二进制代码指令,这种表示指令的符号称为助记符,这种用一组符号来代替一条指令编写程序时采用的语言,称为汇编语言。 MOV AL, 12H

6 对使用者来说,学习接近机器语言的汇编 ,需要掌握和熟知的方面更多,但更能把握整个程序的全部进程
1. 汇编语言基本概念 汇编语言与机器语言属于低级语言,它们与高级语言有较大的区别,汇编语言中的语句与机器的型号密切相关 。 在高级语言中,完成某个加法功能,我们可采用语句 X=A+B ,只要给变量A和B赋一确定值,此加法就可以实现了。在汇编语言中则不同,程序必须指出A、B存放在何处,相加后的结果又存放在何处。 高级语言告诉机器做什么,汇编语言告诉机器怎么做! 对使用者来说,学习接近机器语言的汇编 ,需要掌握和熟知的方面更多,但更能把握整个程序的全部进程

7 汇编 1. 汇编语言基本概念 优点:要比一串二进制代码清晰多了,书写 容易,记忆也方便。 缺点:CPU不能直接执行。用汇编语言编写的
1. 汇编语言基本概念 优点:要比一串二进制代码清晰多了,书写 容易,记忆也方便。 缺点:CPU不能直接执行。用汇编语言编写的 汇编语言源程序必须经过汇编,将其翻 译成机器语言格式, CPU才能执行。 汇编 翻译官:把助记符翻译成机器语言 把汇编语言源程序翻译成机器语言程序的过程称为汇编。

8 汇编 汇编程序 1. 汇编语言基本概念 把汇编语言源程序翻译成机器语言程序的过程称为汇编。
1. 汇编语言基本概念 把汇编语言源程序翻译成机器语言程序的过程称为汇编。 汇编 汇编程序 能把汇编语言源程序翻译成机器语言程序的系统程序(语言加工程序)。8086宏汇编程序为MASM.EXE。

9 1. 汇编语言基本概念 如: 汇编 05 02 00 反汇编 汇编程序为MASM.EXE 在DEBUG.EXE下进行 机器语言程序 源程序
1. 汇编语言基本概念 如: 汇编程序为MASM.EXE 机器语言程序 源程序 MOV AL , 12H B0 12 汇编 ADD AX , 0002H 反汇编 在DEBUG.EXE下进行

10 1. 汇编语言基本概念 7.从汇编语言源程序到可执行程序所经过的处理过程 用全屏幕编辑软件编辑汇 编语言源程序 文件名.ASM
1. 汇编语言基本概念 7.从汇编语言源程序到可执行程序所经过的处理过程 用全屏幕编辑软件编辑汇 编语言源程序 文件名.ASM 用连接程序LINK.EXE对 文件名.OBJ 进行连接 用汇编程序MASM.EXE对源程序 文件名.ASM 进行汇编 有错误吗? 有语法错误吗? 在磁盘上形成了可执行文件 文件名.EXE 在磁盘上形成目标程序文件 文件名.OBJ

11 2. 汇编语言指令分类 汇编语言程序中语句的种类 在汇编语言程序设计中,程序中的语句有 指令语句 伪指令语句 宏指令语句

12 2.汇编语言指令分类 1.指令语句 汇编后能产生机器语言代码,是CPU能执行的语句。 功能性语句

13 2.伪指令语句 2.汇编语言指令分类 码,是CPU不能执行的语句。它 只是告诉汇编程序(MASM.EXE) 应如何汇编。 引导性语句
汇编后不能产生机器语言代 码,是CPU不能执行的语句。它 只是告诉汇编程序(MASM.EXE) 应如何汇编。 引导性语句

14 2.汇编语言指令分类 3.宏指令语句 它是8086指令系统中没有的指令,是用户自己根据宏指令定义的方法定义的一条能完成某一特定功能的新的指令。 自定义语句

15 2.汇编语言指令分类 三.汇编语言中语句的组成 汇编语言源程序是由一条条语句 标识符 组成的。语句则由 四部分组成。 操作助记符 操作数
组成的。语句则由 四部分组成。 标识符 操作助记符 操作数 注释 其基本格式如下:

16 2.汇编语言指令分类

17 2.汇编语言指令分类 指令: 控制计算机完成某种操作的命令 指令系统: 处理器所能识别的所有指令的集合 指令中应包含的信息: 指令的兼容性:
同一系列机的指令都是兼容的。 指令中应包含的信息: 运算数据的来源 运算结果的去向 执行的操作

18 2.汇编语言指令分类 指令格式 操作码 [操作数],[操作数] 目标操作数 源操作数 执行何种操作 参加操作的数据 或数据存放的地址

19 指令格式 2.汇编语言指令分类 操作码 操作数 CLI 将PSW中的IF 清零 PUSH AX 将寄存器AX中的内容入栈
说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 CLI 将PSW中的IF 清零 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数 PUSH AX 将寄存器AX中的内容入栈 MOV AL,10H 将10H赋值给AL

20 指令格式 指令中的操作数: 可以是一个具体的数值(立即数) 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址 分号 空格 逗号
2.汇编语言指令分类 指令格式 MOV AL,10H 操作码 操作数1,操作数 ;注释 指令中的操作数: 可以是一个具体的数值(立即数) 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址 MOV AL, 80H ;将十六进制数80H送入AL 源操作数:80H;目的操作数:80H INC CX;将CX的内容加一,再放回CX 源操作数:(CX);目的操作数: (CX)-1 CLD;将标志寄存器DF标志位清零 源操作数:DF标志位原来的数据;目的操作数:0 分号 空格 逗号 目的作数(DST) 源操作数(SRC) 目的操作数不仅知名被操作对象, 还默认为是存放操作结果的地方

21 指令格式 语句名 2.汇编语言指令分类 标识符: 一条语句或是一段存储空间的名字,没有特殊的意义,都是用户在编程的时候自定义开发的
L1 : MOV AX, CX . JUMP L1 语句名,在循环、跳转时常用 JUMP L1 LOOP L1 语句名

22 指令格式 2.汇编语言指令分类 标识符: 一条语句或是一段存储空间的名字,没有特殊的意义,都是用户在编程的时候自定义开发的
DATA DB 20H, 30H, 11H, 0AH 20H 在数据段定义了一段数据空间,起始地址位 DATA,这段空间有4个字节的单元长度 DATA MOV AL, DATA 30H DATA+1 MOV AL, DATA+2 11H DATA+2 代表地址 0AH DATA+3

23 指令中的操作数 2.汇编语言指令分类 MOV AL,10H ADD DH,DATA 表征参加操作的数据本身 立即数 寄存器 存储器
表征数据存放的地址 MOV AL,10H ADD DH,DATA 寄存器寻址 立即数寻址 寄存器寻址 存储器寻址

24 2.汇编语言指令分类 操作数安排注意事项 立即数不能做目的,也就是不能出现在第一个操作数的位置
寄存器与寄存器,存储单元与存储单元,寄存器与存储单元之间可以相互操作和传送数据,但一定要注意单元长度与寄存器长度之间的匹配

25 Little quiz:判断下列语句对错,若对,指出各个操作数的寻址方式,以及指令操作的结果
2.汇编语言指令分类 Little quiz:判断下列语句对错,若对,指出各个操作数的寻址方式,以及指令操作的结果 MOV BX,AX ADD BX,AX MOV BX,1034H ADD BX,DATA+1 MOV 10H,AL ADD BX,45H MOV BX,AL ADD 45H,BX MOV DATA,DATA+1 存储器之间不能直接传送 ADD DATA,DATA+1

26 2.字符串常数 3.表达式 1.数值常数 2.汇编语言指令分类 四.汇编语言中的常数与表达式
在汇编语言程序中,语句中的操作数项既可以是常数或表达式(立即数),也可以是指明操作数所在处的一种说明。如果操作数是常数或表达式,则有以下几种形式。 2.字符串常数 3.表达式 1.数值常数 二进制数 十进制数 八进制数 十六进制数 字符串常数是由单引号“ ′…… ′”括起来的一串字符或者单个字符。 语句中的操作数项也可以是表达式。表达式由操作数和操作符组成。

27 1.数值常数(立即数) 若为数值常数,则按其基数的不同,可 2.汇编语言指令分类 二进制数 十进制数 八进制数 十六进制数
MOV AL , B MOV AL , 12 MOV AL , 14Q MOV AL , 0CH

28 2.字符串常数 2.汇编语言指令分类 字符串常数是由单引号“ ′…… ′”括起 来的一串字符或者单个字符。 ;变BUF以下连续的(4个字
如:MOV DL , ′A ′ ; DL H BUF DB ′12Aa ′;将′12Aa′字符串定义给 ;变BUF以下连续的(4个字 ;节)存储器单元。

29 3.表达式 2.汇编语言指令分类 算术操作符:+、-、*、/、MOD 逻辑操作符:ADD、OR、XOR、NOT
表达式由操作数和操作符组成。操作符有: 算术操作符:+、-、*、/、MOD 逻辑操作符:ADD、OR、XOR、NOT 关系操作符:EQ(相等)、NE(不等)、LT(小于)、 GT(大于)、LE(小于或等于)、GE(大于或等于) 属性操作符:SEG、OFFSET、TYPE、LENGTH、SIZE 属性修改操作符:PTR

30 2.汇编语言指令分类 ①算术操作符 MOV AL , 5+2*3 ; 等效于 MOV AL , 11
MOV AL , 11/2 ; 等效于 MOV AL , 05H;取商 MOV AL , 11MOD 2 ; 等效于MOV AL , 01H;取余 汇编时运算 出结果

31 2.汇编语言指令分类 表达式是 立即数寻址 ②逻辑操作符 AND AL , 0CCH OR 0F0H AND AL , 0FCH
MOV AL , 0CCH AND 0F0H MOV AL , 0C0H 等效于 AND AL , 0CCH OR 0F0H AND AL , 0FCH 等效于 CPU执行时完成的操作 汇编程序汇编时完成的操作

32 2.汇编语言指令分类 若关系成立,则为真,取值全1; 若关系不成立,则为假,取值全0。 MOV AL , 0FFH ③关系操作符 如:
MOV AL , 04H LT 05H ;关系成立为真 等效于 MOV AL , 0FFH

33 2.汇编语言指令分类

34 2.汇编语言指令分类 标号、变量及伪指令 前面已经讲过,在汇编语言程序设计中,为了方便记忆,将直接访问的存储器单元的实际地址符号化,即给要访问存储器单元起一个标识符名,而标识符有标号名、变量名等。

35 1.标号 标号、变量及伪指令 2.汇编语言指令分类 针对指令语句 ● JMP LAB1 LAB1: MOV AX ,0
用以指示某条指令语句的地址。其定义方法就是在指令语 句的操作助记符前加上标号名,以冒号结尾。它可以作为程序转移指令的操作数。

36 2.汇编语言指令分类

37 2.变量 2.汇编语言指令分类 针对存储器 DATA DB 20H, 30H, 11H, 0AH 用以指示存放数据的存储器单元的符号地址。
MOV AL, DATA 30H DATA+1 MOV AL, DATA+2 11H DATA+2 0AH DATA+3 DATA DB 20H, 30H, 11H, 0AH

38 2.变量定义伪指令 2.汇编语言指令分类 DATA DB 20H, 30H, 11H, 0AH 变量的定义是通过伪指令定义的
伪指令:汇编后不能产生机器语言代码,是CPU不能执行的语句。它 只是告诉汇编程序(MASM.EXE) 应如何汇编。 1001:1002H 0AH 1001:1003H 伪指令的功能是在变量名所对应的地址开始的内存依次放入表达式中的各项值 对编程带来巨大困难 起名字带替

39 2.汇编语言指令分类 DATA DB 20H, 30H, 11H, 0AH 变量名 决定变量数据类型的关键字: 标识符 DB(字节) 1
DW(字)2 DD(双字)4 DQ(长字)8 DT(十字)10 变量名 后面不能加冒号 变量中按顺序存储的数据

40 变量定义伪指令主要应用在数据段,是用来给变量名所对应的存储器单元分配数据或预留空间。变量定义伪指令有以下五种:
2.汇编语言指令分类 [变量名] DB 表达式 ;定义字节型变量 变量定义伪指令主要应用在数据段,是用来给变量名所对应的存储器单元分配数据或预留空间。变量定义伪指令有以下五种: [变量名] DW 表达式 ;定义字型变量 [变量名] DD 表达式 ;定义双字型变量 [变量名] DQ 表达式 ;定义长字型变量 [变量名] DT 表达式 ;定义一个10字节的变量

41 思考: 2.汇编语言指令分类 低地址放低字节,高地址放高字节 DATA DB 20H, 30H, 11H, 0AH
DATA1 DW 20H, 30H, 11H, 0AH 画出存储单元中,两个变量的存储形式 低地址放低字节,高地址放高字节 20H 30H 11H 0AH DATA 00H DATA1 DATA+1 DATA1+1

42 2.汇编语言指令分类 ●1个或多个常数或表达式。当为多个时,其间用逗号分割。 DATA DB 20H, 30H, 11H, 0AH
变量定义伪指令语句中的表达式有以下几种情况: ●1个或多个常数或表达式。当为多个时,其间用逗号分割。 DATA DB 20H, 30H, 11H, 0AH ●带引号的字符串。 DATA1 DB ‘0123’ DATA2 DW ‘AB’, ‘C’, ‘D’ ●一个问号(?)。(用来将此单元保留,存放结果) DATA3 DW ? 一个字的 预留单位,内容未知 ●重复方式。其格式为: 重复次数 DUP (表达式) DATA4 DB 3 DUP(?) 3个字节的 预留单位,内容未知

43 2.汇编语言指令分类 关于字符串 若字符串定义为 DB 字节变量时 整个字符串可以在同一个引号内给出 每个字节内存入一个字符的ASCII 码
DATA1 DB ‘0123’ 若字符串定义为 DB 字节变量时 整个字符串可以在同一个引号内给出 每个字节内存入一个字符的ASCII 码 1500H:0000H ‘0’ DATA1 30H 1500H:0001H ‘1’ 31H ‘2’ 32H ‘3’ 33H

44 2.汇编语言指令分类 关于字符串 若字符串定义为 DW 字节变量时 DATA1 DW ‘AB’, ‘C’, ‘D’ 每个数据不能超过两个字符
若为两个字符,则高位放高字节,低位放低字节 若为一个字符,则该字符的ASCII码放在低字节,高字节为00H ‘B’ DATA1 1500H:0000H 42H 1500H:0001H ‘A’ 41H 1500H:0002H ‘C’ 32H 00H 00H ‘D’ 33H 00H 00H

45 变量定义举例 2.汇编语言指令分类 若(DS)=1500H,且在数据段0000H偏移地址开始有以下变量定义。 1500H:0000H
DAT1 DB 12,-12,12H DAT2 DB 2*3,3+2 DAT3 DW 02H,567AH DAT4 DD 89H DAT5 DB ′THIS′ DAT6 DW ′AB′, ′C′ DAT7 DB 3 DUP (00H) DAT8 DW 3 DUP (?) DAT9 DW DAT6 DAT10 DD DAT8 DAT11 DB ?

46 2.汇编语言指令分类 DAT1 DB 12,-12,12H DAT2 DB 2*3,3+2 OCH DAT3 DW 02H,567AH
1500H:0000H OCH DAT1 DAT3 DW 02H,567AH OF4H 12H 0003H 06H DAT2 05H 0005H 02H DAT3 00H 7AH 56H

47 2.汇编语言指令分类 89H 00H 00H 00H `T` `H` `I` `S` 1500H:0009H DAT4
DAT4 DD 89H 00H DAT5 DB ′THIS′ 00H 000DH `T` DAT5 `H` `I` `S`

48 2.汇编语言指令分类 ‘B’ ‘A’ ‘C’ 00H ‘D’ 00H 1500H:0011H DAT6
DAT6 DW ′AB′, ′C′,’D’ ‘D’ 00H

49 2.汇编语言指令分类 00H DAT7 DB 3 DUP (00H) 00H DAT8 DW 3 DUP (?) 00H ? ? ? ? ?
001AH ? DAT8 ? ? ? ? ?

50 2.汇编语言指令分类 11H DAT9 DW DAT6 00H DAT10 DD DAT8 1AH DAT11 DB ? 00H 00H
变量地址 15H 0026H ? DAT11

51 2.汇编语言指令分类 变量的属性 一个变量一但定义了,就具有了一下五个属性: 段地址(SEG) 段内偏移地址(OFFSET)
类型(TYPE) 长度(LENGTH) 大小(SIZE) 变量所在段的段地址 为变量对应单元的偏移地址 为每个变量所占的字节数 第一个DUP前的系数,表示变量重复的次数 变量所占用的所有字节数,它等于变量的长度与类型(字节数)之积 。 SIZE=LENGTH×TYPE

52 2.汇编语言指令分类 变量属性分析举例 SEG OFFSET TYPE LENGTH SIZE DAT1 DB 12,-12,12H
0005H 2 1 2 DAT3 DW 02H,567AH DAT4 DD 89H 0009H 4 1 4 DAT5 DB ′THIS′ 000DH 1 1 1 DAT6 DW ′AB′, ′C′ 0011H 2 1 2 DAT7 DB 3 DUP (00H) 0017H 1 3 3 DAT8 DW 3 DUP (?) 001AH 2 3 6 DAT9 DW DAT6 0020H 2 1 2 0022H 4 1 4 DAT10 DD DAT8 0026H 1 1 1 DAT11 DB ?

53 例:对于前面变量定义例子中各变量的定义, 我们有:
2.汇编语言指令分类 例:对于前面变量定义例子中各变量的定义, 我们有: DAT3 DW 02H,567AH MOV AX , SEG DAT1 ; (AX)=1500H MOV AX , SEG DAT10 ; (AX)=1500H MOV AX , OFFSET DAT3 ; (AX)=0005H MOV AL , TYPE DAT3 ; (AL)=02H MOV AH , SIZE DAT3 ; (AH)=02H 以上指令中, SRC均为立即数寻址

54 2.汇编语言指令分类 属性修改操作符 PTR:可以暂时改变已经定义过的变量或者标量的类型。 使用格式: 类型 PTR 表达式
类型:变量的类型BYTE/WORD/DWORD 标号的类型:NEAR(进程)/FAR(远程) MOV DB PTR DATA3, AL DAT3 DW 02H,567AH

55 2.汇编语言指令分类 2.变量定义及伪指令 用户编写程序指令 STACK SEGMENT STACK ‘STACK’
DW H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGEMNT DATA DB 01H, 02H, ‘ABCD’ DATA …… DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, ES:DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV SS, AX LEA SP, TOP CODE ENDS END START 用户编写程序指令

56 Thank You !

57 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

58 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的六类指令 5. 总结

59 3.数据的寻址方式 计算机的指令包含操作码和操作数,操作码指明指令的操作性质,操作数指明操作的对象。 例: MOV AX,BX
操作码 操作数 由于编程上的需要,指令中通常并不直接给出操作数,而是给出存放操作数的地址;有时操作数的存放地址也不直接给出,而是给出计算操作数地址的方法。我们称这种指令中如何提供操作数或操作数地址的方式为寻址方式

60 3.数据的寻址方式 寻址方式就是指令中确定操作数的在哪里的方法 8086CPU指令系统的寻址方式分为两类:
数据的寻址方式:寻找指令操作所需数据的方法; 转移地址的寻址方式:寻找转移指令所需的程序地址。 寻址方式就是指令中确定操作数的在哪里的方法

61 3.数据的寻址方式 数据的寻址方式就是告诉CPU存/取数据的地方。 数据的寻址方式(共8种):
立即数寻址(Immediate Addressing ) 寄存器寻址(Register Addressing ) 存储器寻址(Memory Addressing )(5种): 直接寻址、寄存器间接寻址、寄存器相对寻址、 基址变址寻址、基址变址且相对寻址 隐含寻址(Hidden Addressing )

62 一、立即数寻址 3.数据的寻址方式 指令中的源操作数是立即数,即源操作数是参加操作的数据本身 例:MOV AX,1200H
Immediate Addressing 指令中的源操作数是立即数,即源操作数是参加操作的数据本身 例:MOV AX,1200H 立即寻址主要用来给REG或M赋初值。 注意:只能用于源操作数字段,不能用于目的操作数字段。 如:MOV 12H , AL (语法错误) MOV 00H 代码段 12H AH AL

63 使用寄存器寻址一定要注意数据长短匹配一致,
3.数据的寻址方式 二、寄存器寻址 Register Addressing 参加操作的操作数在CPU的通用寄存器中。 例:MOV AX,BX AX BX 使用寄存器寻址一定要注意数据长短匹配一致, 即数据类型保持一致 CS 不能作为目的操作数

64 3.数据址的寻址方式 叁、存储器寻址 直接寻址 这类寻址方式,操作数在存储器中,而存储器单元的地址由以下五种寻址方式的任何一种均可以找到。但在指令中给出的只是要寻找的操作数所在单元的段内偏移地址,而操作数所在单元的段地址除非指令中用段前缀特别指明,否则是默认的DS。

65 叁、存储器寻址 3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) 例1:MOV AX, [1200H]
指令中直接给出了要寻找操作数所在单元的16位偏移地址。 直接寻址方式下,操作数的段地址默认为数据段 例1:MOV AX, [1200H] 若DS为3000H,则: 结果: AX: 1122H

66 叁、存储器寻址 3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) 若 ES= 1500H,
直接寻址方式下,操作数的段地址默认为数据段,但允许段重设,即由指令定义段。 例:MOV AX,ES:[1200H] 若 ES= 1500H, 则向AX传送的数据来自存储器 1500H:1200H = 1500H * H = 15000H H = 16200H

67 3.数据的寻址方式 3.1 直接寻址(Direct Addressing )
例:MOV AX,ES:[1200H] 需要人自己记忆, 复杂,困难,应用不便 所以在实际的汇编语言程序设计中,常常采用给存放数据的单元,定义一个符号地址名,即变量名/变量。 这样,在程序设计中就可以用这个变量名代替原来的存储器单元的实际地址。

68 …… + 3.数据的寻址方式 3.1 直接寻址(Direct Addressing ) DS 1 5 0 0 0 H 0 0 0 4 H
例4:若(DS)=1500H,TABLE为在DS段定义的一个字变量,且偏移地址为0004H。则CPU执行 MOV AX ,TABLE 指令完成的操作如下: DS H + H PA= H …… A H A L 15004H TABLE 数据段 15005H 存储器

69 3.数据的寻址方式 例5:若VAR1为字变量, VAR2和VAR3为字节变量,判断下列指令的书写格式是否正确,正确的说出SRC和DST的寻址方式,不正确说出错误原因。 MOV AX , VAR1 √ SRC为直接寻址 DST为寄存器寻址 MOV AX , VAR2 ╳ 类型不一致 MOV VAR2, VAR3 ╳ 两存储器单元之间不 能直接传送数据 MOV [0200H] ,12H ╳ 类型不明确

70 3.数据的寻址方式 例6:将例5中语法不正确的语句改对。 MOV AX , VAR2 ╳ 类型不一致 改:MOV AL , VAR2
MOV VAR2, VAR3 ╳ 两存储器单元之间不 改: MOV AL ,VAR3 能直接传送数据 MOV VAR2 ,AL MOV [0200H] ,12H ╳ 类型不明确 改:MOV BYTE PTR [0200H] ,12H 或者:MOV WORD PTR [0200H] ,12H 注:PTR为临时属性修改符。

71 叁、存储器寻址 EA= 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing
这种寻址方式,要寻找的操作数在某存储器单元中,该存储器单元地址的段内16位偏移地址在指令中以BX、SI、DI、BP某一个寄存器给出。其段地址默认在DS段。 BX 默认在数据段 SI 只能用这几个寄存器 否则会无法通过编译 EA= DI 默认在堆栈段 BP

72 叁、存储器寻址 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing
例1:MOV AX , [BX] 其SRC为寄存器间接寻址; DST为寄存器寻址; 指令完成的功能为:AX (DS:(BX)) 若:DS=3000H , BX=1050H 则:SRC所在单元的物理地址为: PA=(DS) × 16+(BX) =30000H+1050H =31050H

73 叁、存储器寻址 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing
例2:MOV ES:[SI] , AL 指令完成的功能为: (ES:(SI)) (AL) 若:ES=4000H , SI=1234H,(AL)=23H 则:DST所在单元的物理地址为: PA=(ES)×16+(SI) =40000H+1234H =41234H ∴指令执行后(41234H)=23H.

74 叁、存储器寻址 3.数据的寻址方式 3.2 寄存器间接寻址Register Indirect Addressing
例3:判断下列指令的书写格式是否正确,正确的说出SRC和DST的寻址方式,不正确说出错误原因,并改正。 ① MOV [BX], [SI] ╳ 两存储器单元之间不 能直接传送数据;类型也 不明确。 改正:MOV AL , [SI] MOV [BX] , AL

75 3.数据的寻址方式 DST为寄存器间接寻址 ② MOV [DI] ,12H ╳ 类型不明确
改正:MOV WORD PTR [DI] , 12H ③ MOV [SI] ,CX √ DST为寄存器间接寻址 SRC为寄存器寻址

76 叁、存储器寻址 + EA= + 3.数据的寻址方式 3.3寄存器相对寻址Register Relative Addressing BX
MOV AX , [BX] H 寄存器内的地址 相对位移量 DISP + BP SI BX DI 8位DISP 16位DISP EA= +

77 EA= + 3.数据的寻址方式 BX 8位DISP BP SI 16位DISP DI
在DISP为常数时,操作数所在单元的段地址以寄存器为准,若寄存器为BX、SI、DI,操作数默认在DS段中。若寄存器为BP,操作数默认在SS段中。 在DISP为变量时,操作数所在单元的段地址以变量为准,变量在哪个段定义的,就取该段的段地址。 MOV AX ,TABLE [BP] (AX) (DS: OFFSET TABLE+(BP))

78 叁、存储器寻址 3.数据的寻址方式 3.3寄存器相对寻址Register Relative Addressing [BX+05H]
例1:MOV AX , [BX]+05H 其中,SRC也可以写成: 若:DS=2000H , BX=0008H, 存放操作 数单元的物理地址为: [BX+05H] 05H[BX] 05H+[BX] PA=(DS)×16+(BX)+05H =20000H+0008H+05H =2000DH

79 叁、存储器寻址 3.数据的寻址方式 3.3寄存器相对寻址Register Relative Addressing
例1:MOV AX , [BP],若DS=1050H , BP=0050H, 存放操作数的存储单元的物理地址为: PA=(SS)×16+(BP)+00H =10500H+0050H+00H =10550H 例2:若(DS)=1500H, TABLE为在DS段定义的一个字变量,且偏移地址为0004H,(BP)=0003H。 MOV AX ,TABLE [BP] 指令完成的操作为:(AX) (DS: OFFSET TABLE+(BP)) 例3:若题目如上,执行指令 MOV AX, TABLE[BP-2] 指令完成的操作为:(AX) (DS: OFFSET TABLE+(BP)-2)

80 叁、存储器寻址 EA= + 3.数据的寻址方式 3.4基址变址寻址Based Indexed Addressing
要寻找的操作数在某存储器单元之中,该单元 有效地址的一部分在 中,另一部分在 中。 BP BX SI DI EA= + BP BX SI DI MOV AX , [BX][SI] MOV AX , [BP][SI] 该单元的段地址以基址寄存器为准,若基址寄存器为BX,则段地址默认在DS中,若基址寄存器为BP,则段地址默认在SS中。

81 叁、存储器寻址 3.数据的寻址方式 3.4基址变址寻址Based Indexed Addressing
例1:MOV AX , [BX][SI] (AX) (DS:(BX+SI)) 例2:MOV AX , [BP][SI] (AX) (SS:(BP+SI)) 例3:MOV [BP][DI] , AL (SS:(BP+DI)) (AL) 假设:BX=0000H, SI=0005H BP=0003H, DI=0005H DS:0003H 01H SS:0003H 11H DS:0004H 23H 31H SS:0004H DS:0005H 76H 65H SS:0005H DS:0006H 0AAH 0FFH SS:0006H 55H DS:0007H 00H SS:0007H DS:0008H ‘A’ 77H SS:0008H DS:0009H ‘B’ SS:0009H 81H DS:000AH ‘C’ SS:000AH 97H

82 叁、存储器寻址 EA= + 3.数据的寻址方式 3.5基址变址且相对寻址 Based Indexed Relative Addressing
它是基址变址寻址的扩充,操作数仍在存储器中,存储器单元的有效地址为: BP BX EA= 8位DISP 16位DISP + SI DI MOV AX , [BX][DI]04 MOV DS:[BP][DI]+04H , AL 同样,如果用BX作为基地址,操作数默认在DS段中;如果用BP作为基地址,则在SS段中。 在DISP为变量时,操作数所在单元的段地址以变量为准,变量在哪个段定义的,就取该段的段地址。

83 叁、存储器寻址 3.数据的寻址方式 3.5基址变址且相对寻址 Based Indexed Relative Addressing
例1: MOV AX , [BX][DI]04 (AX) (DS:(BX+DI+04H)) 例2:MOV AX , [BP][DI]04 (AX) (SS:(BX+DI+04H)) 例3:MOV DS:[BP][DI]+04H , AL (DS:(BX+DI+04H)) (AL) 假设:BX=0000H, SI=0005H BP=0003H, DI=0002H DS:0003H 01H SS:0003H 11H DS:0004H 23H 31H SS:0004H DS:0005H 76H 65H SS:0005H DS:0006H 0AAH 0FFH SS:0006H 55H DS:0007H 00H SS:0007H DS:0008H ‘A’ 77H SS:0008H DS:0009H ‘B’ SS:0009H 81H DS:000AH ‘C’ SS:000AH 97H

84 四、隐含寻址 Hidden Addressing
3.数据的寻址方式 四、隐含寻址 Hidden Addressing 有些指令的指令码中不包含指明操作数地址的部分,而其操作码本身隐含的指明了操作数地址。 如:乘除法指令、字符串操作类指令等。 例: MUL BL 指令的执行:AL×BL AX 例: CLI 指令的执行:将IF 清零

85 3.数据的寻址方式 例2:判断下列指令的书写格式是否正确,正确的说出SRC和DST的寻址方式,不正确说出错误原因。
MOV AX, [BX][SI] √ SRC为基址变址寻址 DST为寄存器寻址 MOV AX, BL ╳ 类型不一致 MOV [BP], [DI+01H] ╳ 两存储器单元之间 不能直接传送数据 MOV [BX][DI]+02H ,12H ╳ 类型不明确

86 具体下一条执行哪条指令是由CS:IP决定,则我们可以通过改变CS:IP的内容实现程序指令的跳转
3. 转移地址的寻址方式 前面讲的是各种数据的寻址方式, 实际上,每一条程序指令存储在存储器的某一存储单元空间中(代码段), 也需要寻址 指令是按照编程的书写,顺序存放在代码段 程序的执行顺序由 CS:IP 决定。 CPU执行一条指令,IP 内容自动增1、 使之指向下一条指令 当前执行指令 下一条指令 CS :IP IP常被称为指令指针REG 具体下一条执行哪条指令是由CS:IP决定,则我们可以通过改变CS:IP的内容实现程序指令的跳转 转移地址的寻址

87 3. 转移地址的寻址方式 寻找的操作数指定的地址,赋给IP或CS:IP, 从而实现程序的转移。 如果程序转移后只有IP发生了改变,则称 为段内转移或者称为近程转移(也称为NEAR 型转移)。 如果程序转移后CS、IP均发生了改变,则 称为段间转移或者称为远程转移(也称为FAR

88 3. 转移地址的寻址方式 先介绍无条件转移指令JMP : JMP OPR 程序转移到由OPR指定的位置执行。
8086指令系统中的转移指令有两大类: 无条件转移指令:有JMP、CALL、RET、IRET 条件转移指令:如JZ、JC、JCXZ、LOOP等。 先介绍无条件转移指令JMP : JMP OPR 程序转移到由OPR指定的位置执行。

89 3. 转移地址的寻址方式 转移地址的寻址方式有下列4种: 段内寻址表示转移在本段内完成,段间寻址表示转移 在不同段之间完成。

90 段内转移地址的寻址方式(只有IP发生改变)
3. 转移地址的寻址方式 段内转移地址的寻址方式(只有IP发生改变) 1.段内直接寻址 (Direct addressing within same segment) (也叫段内相对寻址) 段内直接寻址是指直接在指令中给出转移目的地址(16位偏移地址),转移在同一个段内完成。指令中用JMP <标号>表示,当然这里的标号与该指令处在同一个段。例如: JMP LABEL ;程序转移到标号LABEL处执行

91 3. 转移地址的寻址方式 -32768 16位DISP L1: ● 操作码 +32767 转移目的地的IP=当前(IP)+16位DISP
XXH ??H ??H JMP L1 ;JMP NEAR PTR L1 当前IP 操作码 间隔的字节数称为相对 位移量DISP +32767 转移目的地的IP=当前(IP)+16位DISP

92 2.段内间接寻址(Indirect addressing within same segment)
3. 转移地址的寻址方式 2.段内间接寻址(Indirect addressing within same segment) 段内间接寻址是指转移目的地址(16位偏移地址)保存在寄存器或存储单元,转移也在同一个段内完成,在指令中指出所使用的寄存器或存储单元的偏移地址,当采用存储单元保存转移地址时,可以采用以上介绍的5种存储器寻址方式。例如: JMP BX ;程序转移的目的地址为BX的内容 JMP VAR1 ;程序转移的目的地址为字型变量 VAR1的内容 JMP VAR1[SI] ; 目的地址保存在存储器,其有效 地址为(SI)+OFFSET VAR1

93 3. 转移地址的寻址方式 例:若(DS)=2000H,(BX)=0100H,(SI)=0002H,
(20100H)=1200H,(20102H)=1250H, 则CPU执行: JMP BX 指令后,(IP)=0100H JMP WORD PTR [BX]指令后,(IP)=1200H JMP WORD PTR [BX][SI]指令后,(IP)=1250H

94 段间转移地址的寻址方式(CS、IP均发生改变)
3. 转移地址的寻址方式 段间转移地址的寻址方式(CS、IP均发生改变) ——只适合于无条件转移指令 1. 段间直接寻址Direct addressing between different segments 段间直接寻址是指直接在指令中给出转移目的地址(16位偏移地址和16位段地址),转移在不同段之间完成。指令中用JMP <标号>表示,当然这里的标号与该指令处在不同的段。例如: JMP LABEL ;程序转移到标号LABEL处执行 (LABEL 不在本段中)

95 3. 转移地址的寻址方式 SEG LABEL LABEL:● OFFSET LABEL ????:****H 代码段
XXH **H **H ??H ??H JMP FAR PTR LABEL 1 OFFSET LABEL 操作码 ; ????:****H 代码段 2

96 2. 段间间接寻址Indirect addressing between different segments
3. 转移地址的寻址方式 2. 段间间接寻址Indirect addressing between different segments 段间间接寻址是指转移目的地址(32位地址)保存在存储单元中,转移在不同的段之间完成,在指令中指出存储单元的偏移地址,可以采用以上介绍的5种存储器寻址方式。存储单元必须是双字型变量,第一个字用于存放目的地址的段内偏移地址,第二个字用于存放目的地址的段地址。例如: JMP VAR3 ;程序转移的目的地址为双字型变量 VAR3的内容 JMP VAR1[SI] ; 目的地址保存在存储器,其有效 地址为(SI)+OFFSET VAR3

97 3. 转移地址的寻址方式 低字节 …… 高字节 存放转移地址的首址 转移OFFSET IP 转移SEG地址 CS 存储器

98 如 :JMP DWORD PTR [BX][DI]
3. 转移地址的寻址方式 如 :JMP DWORD PTR [BX][DI] 若(DS)=3000H,(BX)=1000H,(DI)=2000H,则: 33000H 05H 00H IP DS: BX: DI: H + 20H 00H CS 80H …… CS: IP: H + 82000H …… 目的地址

99 3. 转移地址的寻址方式 综上所述,转移地址的4种寻址方式也可以从指令形式加以区分,即:

100 3. 总结 数据的寻址方式(共8种): 立即寻址(Immediate Addressing ) MOV AL , 20H
寄存器寻址(Register Addressing ) MOV BX, AX 存储器寻址(Memory Addressing )(5种): 直接寻址 MOV AL, [1200H] 寄存器间接寻址 MOV AL, [BX] 寄存器相对寻址 MOV AL, [BX]+03H 基址变址寻址 MOV AL, [BX][SI] 基址变址且相对寻址 MOV AL, [BX][SI]04H 隐含寻址(Hidden Addressing ) STI CLI

101 3. 转移地址的寻址方式 指令的寻址方式 段内直接寻址 JMP LABEL (LABLE在本段) 段内间接寻址 JMP BX
JMP VAR1 JMP VAR1[SI] 段间直接寻址 JMP LABEL (LABLE不在本段) 段间间接寻址 JMP VAR3; VAR3位双字变量 JMP VAR1[SI] ; 目的地址保存在存储器,其有效 地址为(SI)+OFFSET VAR3

102 Thank You !

103 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

104 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

105 4.8086的指令系统 指令系统 是指CPU能完成的所有指令的集合,它是在CPU设计时就确定了的。所以,对不同的CPU,其指令系统中所包含的具体指令将是各不相同的。但8088/8086 CPU的指令系统是完全一样的。

106 4.8086的指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令

107 4.8086的指令系统 数据传送指令 数据传送类指令可以完成数据在寄存器、存储单元之间的传递。这一类的指令有:MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF和POPF,其共同点有: 除指令SAHF、 POPF之外,其它指令不影响PSW(微处理器状态字)中的各标志位; 当指令中有两个操作数时,第一个操作数为目的操作数,第二个为源操作数; 目的操作数的寻址方式一定不能为立即数和段寄存器CS。

108 1.通用传送指令(MOV) 4.8086的指令系统 格式: MOV DST, SRC ;(DST)←(SRC)

109 4.8086的指令系统 立即数、代码段寄存器CS只能做源,不能作目的操作数; IP不能作源也不能作目的操作数;
两个存储单元之间不能直接进行数据传送,两个段REG也不能直接互传; 两个操作数的类型必须保持一致; 至少有一个操作数能确定数据长度; 若目的操作数是段寄存器,则源操作数不能是立即数。

110 4.8086的指令系统 ①立即数→通用寄存器或存储单元 例1: MOV AX,1234H ;将1234H传送到AX中 AX ????
例2: MOV var1,1234H ;将1234H传送到变量var1中 ?? DS:var1 1234H 34H 12H

111 4.8086的指令系统 例3: MOV var1,DX DS:var1 DX 55AAH ;将DX的内容传送到变量var1中
② 通用寄存器 存储单元 例3: MOV var1,DX ;将DX的内容传送到变量var1中 例4: MOV DX,var2 ;将变量var2 的内容传送到DX中 ?? DS:var1 DX 55AAH AAH 55H

112 4.8086的指令系统 DS:var2 DX 1234H 例3: MOV var1,DX ;将DX的内容传送到变量var1中
② 通用寄存器 存储单元 例3: MOV var1,DX ;将DX的内容传送到变量var1中 例4: MOV DX,var2 ;将变量var2 的内容传送到DX中 ?? DS:var2 DX 1234H 34H 12H

113 例5 MOV AX,BX ;将BX的内容传送到AX中 4.8086的指令系统 ④ 通用寄存器←→通用寄存器 AX ???? BX 78AD

114 4.8086的指令系统 ⑤ 通用寄存器←→段寄存器 例6 MOV DS,AX DS ???? AX 1234 1234 BX ????
MOV BX,ES DS ???? AX 1234 1234 BX ???? ES AA55 AA55 ⑤ 通用寄存器←段寄存器 例7 MOV DX,CS CS不能作目的 DX ???? CS 1234 1234

115 例8 MOV DS,var1 例9 MOV var2,ES 4.8086的指令系统 ⑥ 段寄存器←→存储单元 DS ???? 1234

116 例8 MOV DS,var1 CS不能作目的 例9 MOV var2,ES 4.8086的指令系统 ⑥ 段寄存器←→存储单元 ES 55AA
?? DS:var2 ES 55AA AAH 55H

117 再次强调 4.8086的指令系统 应该特别注意MOV指令不能直达的路径: 立即数 ×→ 段寄存器 存储单元 ×→ 存储单元
立即数 ×→ 段寄存器 存储单元 ×→ 存储单元 段寄存器 ×→ 段寄存器 任意单位 ×→ CS, IP IP ×→ 任意单位 要实现这些功能需要中转步骤或其他途径

118 4.8086的指令系统 ① 立即数→段寄存器 一般可以通过 立即数→通用寄存器→段寄存器 来完成,例如: MOV AX,3A01H
MOV DS,AX ;(DS) ←3A01H ② 存储单元→存储单元 一般可以通过 存储单元→通用寄存器→存储单元 来完成,例如: MOV AX,VAR1 MOV [DI+10],AX ;((DI)+10)← VAR1

119 4.8086的指令系统 ③ 段寄存器→段寄存器 一般可以通过 段寄存器→通用寄存器→段寄存器 来完成,例如: MOV AX,CS
MOV DS,AX ;(DS) ←(CS) 应该注意:CS不能作为目的寄存器。 (4)IP,CS的改变 通过转移指令来实现

120 MOV SI,[BX] ;(SI) ((BX))
4.8086的指令系统 EG,下面指令书写是否正确,分析寻址方式和实现功能 MOV AX,BX ;将BX中的一个字传 送到AX中 MOV AL,DL ;将DL中的一个字节 传送到AL中 MOV AX,02 ;将立即数02传送到 ;AX中 MOV SI,[BX] ;(SI) ((BX))

121 4.8086的指令系统 ;((BX)+(DI)+1) (DH) MOV AL,4[DI] ;将(DI)+4作为偏移地址,
MOV AX,[BX+2] ;将寄存器BX中的内容加 ;2后的值作为偏移地址, ;将该单元中的一个字节 ;送入AL中,下一单元中 ;的一个字节送AH中 MOV [BX][DI],DX ;((BX)+(DI)) (DL) ;((BX)+(DI)+1) (DH)

122 4.8086的指令系统 DATA1 AL MOV AX , DATA1 AH ; AX (DATA1) ∴指令执行后,(AX)=1234H
EG,程序中采用伪指令定义了一组变量,分析下列语句 设在数据段(DS段)有下面的变量定义: DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: 34H 12H 78H 56H DATA1 AL MOV AX , DATA1 AH ; AX (DATA1) ∴指令执行后,(AX)=1234H

123 4.8086的指令系统 ∴指令执行后,(DATA3)=1122H 设在数据段(DS段)有下面的变量定义:
DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV BX,1122H MOV DATA3,BX ; (DATA3) (BX) ∴指令执行后,(DATA3)=1122H

124 4.8086的指令系统 设在数据段(DS段)有下面的变量定义: DATA1 DW 1234H , 5678H
DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV DI,2 MOV AL,DATA2[DI] ;AL (DS:OFFSET DATA2+(DI)) ∴指令执行后,(AL)=40H

125 ∴指令执行后,(DS:OFFSET DATA3+(SI))=0AABBH DATA3 +1 +2 DL DH
4.8086的指令系统 设在数据段(DS段)有下面的变量定义: DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV SI,2 MOV DX,0AABBH MOV DATA3[SI],DX ;(DS:OFFSET DATA3+(SI)) (DX) ∴指令执行后,(DS:OFFSET DATA3+(SI))=0AABBH DATA3 +1 +2 DL 0BBH DH 0AAH

126 ;AL (DS : OFFSET DATA2+(BP)) ∴指令执行后,(AL)=40H
4.8086的指令系统 设在数据段(DS段)有下面的变量定义: DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV BP , 2 MOV AL , DATA2[BP] ;AL (DS : OFFSET DATA2+(BP)) ∴指令执行后,(AL)=40H

127 4.8086的指令系统 ;CX LENGTH DATA3 ∴指令执行后,(CX)=10 (0AH) 设在数据段(DS段)有下面的变量定义:
DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV CX , LENGTH DATA3 ;CX LENGTH DATA3 ∴指令执行后,(CX)=10 (0AH)

128 4.8086的指令系统 ;(BX) SIZE DATA3 ∴指令执行后,(BX)=20 (14H) 设在数据段(DS段)有下面的变量定义:
DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV BX , SIZE DATA3 ;(BX) SIZE DATA3 ∴指令执行后,(BX)=20 (14H)

129 4.8086的指令系统 ;(SI) OFFSET DATA2 ∴指令执行后,(SI)=0004H 设在数据段(DS段)有下面的变量定义:
DATA1 DW 1234H , 5678H DATA2 DB 20H , 30H , 40H DATA3 DW 10 DUP(?) 则传送指令可以有: MOV SI , OFFSET DATA2 ;(SI) OFFSET DATA2 ∴指令执行后,(SI)=0004H

130 4.8086的指令系统 对于双操作数指令,两个操作数的类型必须匹配: 两者都指定了类型,则必须一致,否则指令出错(类型不一致); 两者之一指定了类型,一般指令无错; 两者都无类型,则指令出错(类型不定)。

131 4.8086的指令系统 对于操作数的类型,还应该注意: 立即数是无类型的; 不含变量名的直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、基址变址且相对寻址的操作数也是无类型的; 利用PTR操作符可指定或暂时改变存储单元的类型。

132 4.8086的指令系统 应该搞清楚什么样的操作数为立即数。 从形式上看,立即数有: 由常数等组成的表达式 所有由属性操作符得到的标号或变量的属性。

133 4.8086的指令系统 总结 : 两操作数字长必须相同 ; 两操作数不允许同时为存储器操作数; 两操作数不允许同时为段寄存器;
在源操作数是立即数时,目标操作数不能是段寄存器; IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。

134 例如,下面指令书写是错误的。 (DATA1为字变量) MOV 10H,AL ㄨ DST不能为立即数寻址 4.8086的指令系统
MOV AL,CX ㄨ 类型不一致 MOV [BX][SI],78H ㄨ 类型不明确 MOV DS,SEG DATA1 ㄨ 立即数不能给段寄存器传送数据 MOV [BX],12H*2 ㄨ 类型不明确

135 MOV [DI]+02H,DATA1 ㄨ 两单元之间不 MOV CS,AX ㄨ CS不能做DST
4.8086的指令系统 MOV DATA1,AH ㄨ 类型不一致 MOV [DI]+02H,DATA1 ㄨ 两单元之间不 能直接传送数据 MOV CS,AX ㄨ CS不能做DST MOV DS,0100H ㄨ 当DS作DST时,SRC 不能为立即数

136 2.取有效地址指令(LEA)Load Effective Address
4.8086的指令系统 2.取有效地址指令(LEA)Load Effective Address 格式:LEA BX , DATA1 功能:指令的功能是将源操作数MEM (存储单元)的偏移地址 传送到寄存器REG(只能用寄存器)。 这是一条特殊指令,它传送的不 是操作数本身,而是操作数的有 效地址。 注:DST REG为通用REG,一般用BX、BP、SI、DI。

137 4.8086的指令系统 例如: LEA DI, VAR1 ;(DI) ←VAR1的偏移地址 等效于: MOV DI , OFFSET VAR1 LEA BX,VAR1+15 ;(BX) ←VAR1的偏移地址+15 MOV BX , OFFSET VAR1+25

138 格式: 3.取地址指针指令(LDS,LES) 4.8086的指令系统 Load Data/Extra Segment Register
LDS REG16,MEM ;(DS)←(MEM+2), (REG16)←(MEM) LES REG16,MEM ;(ES)←(MEM+2), (REG16)←(MEM) 隐含寻址

139 4.8086的指令系统 功能: 取地址指针指令LDS 可以将双字变量MEM内容中的高16位送入DS,低16位送入指定的REG16中; 而取地址指针指令LES 可以将双字变量MEM内容中的高16位送入ES,低16位送入指定的REG16中。 MEM REG DS

140 4.8086的指令系统 例如定义变量: TABLE DB 10H, 20H,…… POINT1 DD H POINT2 DD TABLE 则可以有指令 LDS DI,POINT1 ;(DS) ← 0200H,(DI) ← 1000H LES SI,POINT2 ; (ES)← TABLE的段地址, ; (SI)← TABLE的偏移地址

141 4.标志传送指令(LAHF,SAHF) 4.8086的指令系统 Load AH register from flags
Store AH register in flags 格式: LAHF ;(AH) ← PSW寄存器的低8位 SAHF ;PSW寄存器的低8位 ← (AH)

142 4.8086的指令系统 说明: 指令LAHF(Load AH register from flags)可以将PSW寄存器中的低8位传送到寄存器AH中,而指令SAHF(Store AH register in flags)可以将AH中的内容传送到PSW寄存器中的低8位中。源操作数和目的操作数的寻址方式均为隐含寻址方式。

143 5.数据交换指令(XCHG) 4.8086的指令系统 格式:XCHG DST , SRC ;DST ←→ SRC
功能:该指令是完成寄存器与寄存器或寄存器与存储单元之间内容交换的。该指令要求两个操作数之一必须是寄存器,允许两个操作数都是寄存器,但不允许是段寄存器。 注:段REG和立即数不能参加交换。

144 4.8086的指令系统 例1 合法指令有: XCHG AX, BX ;(AX) ←→(BX) XCHG CX, [DI] ;(CX) ←→((DI)) XCHG DX, VAR1 ;(DX) ←→(VAR1)

145 例2.下面指令书写格式是错误的。 XCHG AX,1234H ㄨ立即数不能参加交换 XCHG BX,ES ㄨES段寄存不能参加交换
4.8086的指令系统 例2.下面指令书写格式是错误的。 XCHG AX,1234H ㄨ立即数不能参加交换 XCHG BX,ES ㄨES段寄存不能参加交换 XCHG AL,CX ㄨ类型不一致 XCHG DAT1,DAT2 ㄨ两存储器单元不能直接交换

146 XCHG CH , CL 指令执行后,(CX)=8B9AH
4.8086的指令系统 例3.若(CX)=9A8BH,试将CX的高 8位与低8位互相交换。 XCHG CH , CL 指令执行后,(CX)=8B9AH

147 6.字节交换指令(XLAT)Translate byte (转换码指令,或查表指令)
4.8086的指令系统 6.字节交换指令(XLAT)Translate byte (转换码指令,或查表指令) 格式:XLAT ;(AL) ←((BX)+(AL)) 寻址方式:隐含寻址, 功能:将AL中的索引值所在单元的字节数据返回给AL

148 6. XLAT 4.8086的指令系统 格式:XLAT ;(AL) ←((BX)+(AL))
说明: XLAT指令也称查表指令,使用该指令之前,应在数据段中定义一个字节型表,并将表起始地址的偏移量放入BX,表的索引值放入AL,索引值从0开始,最大为255;指令执行后,在AL中即可得到对应于该索引 格式:XLAT ;(AL) ←((BX)+(AL))

149 4.8086的指令系统 指令XLAT非常适合于两个代码之间的转换,例如现要将Code1转换成Code2,如表3.3所示,则分三步完成从Code1转换成Code2: 在TABLE变量中按Code1的顺序存储Code2的内容,如图3.4所示; 将BX指向变量TABLE的首地址,即LEA BX,TABLE ; 在AL中给出Code1的值后,执行XLAT指令,这时AL的内容即为相应的Code2值。

150 4.8086的指令系统

151 4.8086的指令系统 例如, 当AL=0时,则执行XLAT 指令后得到 AL=15; 当AL=1时,则执行XLAT 指令后得到 AL=8。

152 4.8086的指令系统 7.堆栈操作指令 ①堆栈 堆栈是以后进先出(LIFO)的原则存取信息的一种存储机构。在微型计算机中,堆栈通常是存储器的一部分。为了保证堆栈区的存储器能按后进先出的规则存取信息,该存储区的存取地址由一个专门的地址寄存器来管理,这个地址寄存器称为堆栈指示器或称堆栈指针SP。

153 在8088/8086系统中,堆栈段的段地址由SS提供,堆栈操作的偏移地址由SP提供。
4.8086的指令系统 在8088/8086系统中,堆栈段的段地址由SS提供,堆栈操作的偏移地址由SP提供。 压入堆栈操作:将信息送入堆栈的过程; 弹出堆栈操作:从堆栈中取出信息的过程。

154 4.8086的指令系统 1.压入堆栈指令(PUSH) 格式: PUSH SRC ;将SRC压入堆栈,
即(SP)←(SP)-2,(SP)←(SRC) PUSHF ;将PSW压入堆栈, 即(SP) ←(SP)-2,(SP)←(PSW) 说明: 压入堆栈指令PUSH(Push word onto stack)将先修正堆栈指针SP的内容,然后再将SRC或PSW的内容送入堆栈。SRC必须是字型的,它可以是通用寄存器和段寄存器,也可以是某种寻址方式所指定的存储单元,但不能是立即数。

155 4.8086的指令系统 例如: PUSH AX ;将(AX)压入堆栈 PUSH DS ;将(DS)压入堆栈 PUSH [SI] ;将((SI))压入堆栈 PUSHF ;将(PSW)压入堆栈

156 4.8086的指令系统 2.弹出堆栈指令(POP) 格式: POP DST ;从堆栈弹出DST,
即(DST)←(SP),(SP) ←(SP)+2 POPF ;从堆栈弹出PSW, 即(PSW)←(SP),(SP) ←(SP)+2 说明: 弹出堆栈指令POP(Pop word off stack)可以取出堆栈的内容送入DST所指定的寄存器、存储单元或PSW,然后修正SP的内容。DST也必须是字型的,它可以是通用寄存器、段寄存器(CS除外),也可以是存储单元,但不能是立即数。

157 4.8086的指令系统 例如: POP BX ;从堆栈弹出一个字,送给(BX) POP ES ;从堆栈弹出一个字,送给(ES)
POP [SI] ;从堆栈弹出一个字,送给((SI)) POPF ;从堆栈弹出一个字,送给(PSW)

158 例3:下列指令书写格式语法是错的。 PUSH AL 〤 堆栈只能按字操作 PUSH 5678H 〤不能为立即数寻址
4.8086的指令系统 例3:下列指令书写格式语法是错的。 PUSH AL 〤 堆栈只能按字操作 PUSH H 〤不能为立即数寻址 POP CS 〤 CS不能作DST

159 4.8086的指令系统

160 4.8086的指令系统 (四)应用举例 利用堆栈操作指令可以方便地完成某些复杂操作,例如当需要交换DS和ES的内容时,可以采用: PUSH DS PUSH ES POP DS POP ES

161 4.8086的指令系统 另外,在子程序设计时,需要从子程序返回时尽量保持通用寄存器不变,例如为保持AX、 BX、 CX、 DX的内容不变,则在子程序入口处排入指令: PUSH AX PUSH BX PUSH CX PUSH DX 然后在子程序返回指令之前,排入指令: POP DX POP CX POP BX POP AX

162 4.8086的指令系统 例3.1 设(SP)=00A0H,执行下列指令 PUSH AX PUSH VAR1 后,(SP)= 。 解:每向堆栈压入一个字,SP的内容减2,因此指令执行后(SP)= 009CH 。

163 4.8086的指令系统

164 4.8086的指令系统 应该注意:在程序设计时,PUSH、POP必须配对使用,尤其是在分支中应该确保PUSH与POP成对出现,以保证堆栈操作的正常次序,这也是子程序能够正常返回的前提条件。

165 Thank You !

166 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

167 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

168 回顾 MOV DST, SRC LEA REG, MEM LDS REG, MEM LES REG, MEM LAHF SAHF
XCHG DST, SRC XLAT PUSH POP PUSHF POPF

169 的指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令

170 的指令系统 算术运算指令 算术运算指令可以完成两个操作数的各种算术运算:加、减、乘、除及其BCD数运算的调整运算。属于这一类的指令有:ADD、ADC、SUB、SBB、NEG、CMP、INC、DEC、MUL、IMUL、DIV、IDIV、CBW、CWD、AAA、DAA、AAS、DAS、AAM、AAD。它们又可以分成6个子类:

171 4. 8086的指令系统 ● 只要ALU涉及到运算,就不能使用段REG;
OF DF IF TF SF ZF AF PF CF

172 的指令系统    CF(Carry Flag)进位标志。如果加法时最高位产生进位或减法时最高位产生进位或借位,则CF=1,否则CF=0。 AF(Auxiliary Carry Flag)辅助进位标志。如果在加法时D3位有进位或减法时D3位有借位,则AF=1,否则AF=0。 ZF(Zero Flag)零标志位。如果运算结果各位都为零,则ZF=1,否则ZF=0。 SF(Sign Flag)符号标志。运算结果为负时,SF=1,否则SF=0. OF(Overflow Flag)溢出标志。运算中结果超出8位或者16位有符号数所能表示的数值范围,产生溢出,OF=1,否则OF=0。 PF(Parity Flag)奇偶标志。如果操作结果的低8位中含有偶数个1,PF=1,否则PF=0。

173 4. 8086的指令系统 一、加减法指令 (一)加法指令(ADD、ADC) (Add byte or word/ with carry )
格式: ADD DST, SRC ;(DST) ←(SRC)+(DST) ADC DST, SRC ;(DST) ←(SRC)+(DST)+(CF) SRC可以取立即数、通用寄存器和存储单元, DST可以取通用寄存器和存储单元, 但SRC和DST不能同时取存储单元。

174 4. 8086的指令系统 例如,设变量VAR1为字型变量,VAR2为字节变量,则有
ADD AX, 56A0H ;(AX) ←(AX)+56A0H ADC VAR1, 127FH ;(VAR1)←(VAR1)+127FH+(CF) ADC AX, BX ;(AX) ←(AX)+(BX) +(CF) ADD AX, VAR ;(AX) ←(AX)+(VAR1) ADD BX, VAR1[DI] ;(BX) ←(BX)+((VAR1)+(DI)) ADD BL, VAR ;(BL) ←(BL)+(VAR2) ADD BYTE PTR VAR1, AL ;(VAR1的低位字节)←(VAR1的低位)+(AL)

175 ADD和ADC指令会正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。
的指令系统 ADD和ADC指令会正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。 例如,设(AX)=125AH,则执行ADD AX,78C6H后, (AX)=8B20H, CF=0,AF=1,OF=1, SF=1,ZF=0,PF=0。 AX B B B

176 ADD,ADC 只能进行字节或字数据的相加
若遇更长的数据则要分开来加 的指令系统 例3.2 设在DVAR开始的连续8字节中分别存放着两个双字变量A和B(每个数为32位),求C=A+B,并将结果C放到DVARC开始的内存中。 解:设这两个数分别为A= H、B= H,则在数据段中有变量定义语句: DVAR DD H DD H DVARC DD ?

177 A C A B B C 4. 8086的指令系统 00127654H 00049821H 00177475H 计算机 可以这样算吗 ?
DVAR 54H 76H 12H 00H 21H 98H 04H DVAR DD H DD H DVARC DD ? A ADD 无法对DD数据进行加法运算 C A B B H H H ? ? 计算机 可以这样算吗 ? C ? ?

178 解决方案:应该先利用ADD指令完成低位字的加法运算 再利用ADC指令完成高位字的带进位加法运算
的指令系统 解决方案:应该先利用ADD指令完成低位字的加法运算 再利用ADC指令完成高位字的带进位加法运算 LEA DI, DVAR MOV AX, 4[DI] ; 取低位字到(AX) ADD AX, [DI] ; 低位字相加 MOV DVARC, AX ;保存结果的低位字 MOV AX, 6[DI] ; 取高位字到(AX) ADC AX, 2[DI] ; 高位字相加(带进位) MOV DVARC+2, AX ; 保存结果的高位字 DVAR 54H 76H 12H 00H 21H 98H 04H A B

179 (二)减法指令(SUB、SBB) 普通减法指令SUB 考虑借位的减法指令SBB 减1指令DEC 比较指令CMP 求负指令NEG 减法指令对操作数的要求与对应的加法指令相同

180 的指令系统 (二)减法指令(SUB、SBB) Subtract byte or word /with borrow 格式: SUB DST, SRC;(DST) ← (DST)-(SRC) SBB DST, SRC ;(DST) ← (DST)- (SRC)-(CF) DEC DST;(DST) ← (DST)-1 指令中DST、SRC的说明与ADD指令相同。

181 4. 8086的指令系统 例如,设VAR1为字型变量,VAR2为字节变量,则有 SUB AL, 2CH ;(AL)← (AL)-2CH
SBB AX, BX ;(AX)← (AX)-(BX)-(CF) SUB AX, VAR1 ;(AX)← (AX)-(VAR1) SUB VAR1, 2184H;(VAR1)← (VAR1)-2184H SBB DL, VAR2[SI];(DL)←(DL)-((VAR2)+(SI))-(CF)

182 的指令系统 减法指令SUB和SBB指令会正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。 例如: MOV AX,1734H SUB AX,5566H 执行后有(AX)=0C1CEH CF=1,AF=1,OF=0,SF=1,ZF=0,PF=0

183 4. 8086的指令系统 MOV BL,2 NEXT1 :MOV CX,0FFFFH NEXT2: DEC CX
JNZ NEXT ; ZF=0转NEXT2 DEC BL JNZ NEXT ; ZF=0转NEXT1 HLT ; 暂停执行

184 的指令系统 例3.3 设DVAR1和DVAR2保存有双字数,求DVAR1-DVAR2,并将结果保存在双字变量DVARR中。 解:设在数据段中有变量定义语句: DVAR1 DD H DVAR2 DD H DVARR DD ?

185 的指令系统 为完成双字相减运算,应该先利用SUB指令完成低位字的减法运算,再利用SBB指令完成高位字的带进位减法运算。这样在代码段中可以编写下列程序,完成题目指定的说明: MOV AX, DVAR1 ;取被减数的低位字到(AX) SUB AX, DVAR2 ;低位字相减 MOV DVARR, AX ;保存结果的低位字 MOV AX, DVAR1+2 ;取被减数的高位字到(AX) SBB AX, DVAR2+2 ;高位字相减(带借位相减) MOV DVARR+2, AX ;保存结果的高位字

186 的指令系统 (三)取负指令(NEG) Negate byte or word 格式: NEG DST ;(DST) ←0-(DST) 说明: 取负指令NEG为一类特殊的减法运算,其被减数为0,相减结果存放在DST中。DST可以取通用寄存器和存储单元。求负数的补码表示可以直接利用NEG指令完成。 NEG指令将正常影响PSW中的6个状态标志位.

187 的指令系统 例如,设VAR1为字型变量,则有下列指令: NEG BX ;(BX)←0-(BX) NEG VAR1 ;(VAR1)←0-(VAR1) NEG BYTE PTR 2[BX] ;((BX)+2)←0-((BX)+2)

188 二、比较指令CMP Compare byte or word 格式: CMP DST, SRC ;(DST)-(SRC),
的指令系统 二、比较指令CMP Compare byte or word 格式: CMP DST, SRC ;(DST)-(SRC), 并设置PSW中的状态标志位 说明: CMP指令与减法指令类似,完成DST的内容减去SRC的内容,设置PSW中的状态标志位(简称FLAG),但其结果不保存到DST。指令中的SRC、DST的说明与ADD指令相同。 用途: 用于比较两个数的大小,可作为条件转移指令转移的条件 指令对操作数的要求及对标志位的影响与SUB指令相 同

189 4. 8086的指令系统 例如,设VAR1为字型变量,VAR2为字节变量,则有 CMP CX, 2000 ;(CX)-2000,并置FLAG
CMP BX, DX ;(BX)-(DX),并置FLAG CMP AL, VAR2 ;(AL)-(VAR2),并置FLAG CMP VAR1[SI],AX ;((VAR1)+(SI))-(AX),并置FLAG

190 CMP指令将正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。
的指令系统 CMP指令将正常影响PSW中的6个状态标志位:CF、AF、OF、SF、ZF和PF。 两个无符号数的比较: CMP AX,BX 若 AX > BX 若 AX < BX 两个带符号数的比较 CMP AX,BX 两个数的大小由OF和SF共同决定 OF和SF状态相同 AX > BX OF和SF状态不同 AX < BX CF=0 CF=1 在不发生溢出情况 OF=0下 ,此时差是正确的,则SF=1被减数<减数,SF=0 被减数≥减数。 在发生溢出情况 OF=1下 ,此时差是错误的,则SF=0被减数<减数,SF=1 被减数≥减数。 综上所述:OF⊕SF=1被减数<减数, OF⊕SF=0被减数≥减数

191 的指令系统 例3.4 两个无符号数(AL)=49H、(BL)=28H进行大小比较。 解:指令段为: MOV AL, 49H MOV BL, 28H CMP AL, BL 执行后,CF=0,说明49H>28H。 如果采用CMP BL,AL语句,则CF=1,说明28H<49H。

192 解:当采用8位补码表示时,这两个有符号数分别为98H和8FH。程序段为: MOV AL, -104 MOV BL, -113
的指令系统 例3.5 两个有符号数-104、-113进行大小比较。 解:当采用8位补码表示时,这两个有符号数分别为98H和8FH。程序段为: MOV AL, -104 MOV BL, -113 CMP AL, BL 执行后,OF=0,SF=0,说明-104>-113。如果采用CMP BL,AL语句,则OF=0,SF=1,这说明 -113<-104。

193 的指令系统 例3.6 两个有符号数57、-113进行大小比较。 解:当采用8位补码表示时,这两个有符号数分别为39H和8FH。程序段为: MOV AL, 57 MOV BL, -113 CMP AL, BL 执行后,OF=1,SF=1,说明57>-113。如果采用CMP BL,AL语句,则OF=1,SF=0,这说明-113<57。

194 4. 8086的指令系统 三、增量减量指令 格式: INC DST ; (DST) ← (DST)+1
DEC DST ; (DST) ← (DST)-1 说明: INC(Increment byte or word by 1)为增量指令,每次对DST的内容增加1;DEC(Decrement byte or word by 1)为减量指令,每次对DST的内容减去1。 DST可以取通用寄存器和存储单元。 INC和DEC指令可以正常影响PSW中的5个标志位:AF、OF、SF、ZF和PF,但它们不会影响CF位。

195 的指令系统 例如,设VAR1为字型变量,则有 DEC AX ;(AX) ← (AX) -1 INC DL ;(DL) ← (DL)+1 INC VAR1 ;(VAR1) ← (VAR1)+1 DEC WORD PTR [BX] ;((BX)) ←((BX))-1

196 4. 8086的指令系统 LEA BX,MAX HLT XCHG [SI],AL ? GOON:DEC CL LEA SI,BUF
MOV CL,20 MOV AL,[SI] NEXT:INC SI CMP AL,[SI] JNC GOON ;CF=0转移 XCHG [SI],AL GOON:DEC CL JNZ NEXT MOV [BX],AL HLT 程序功能

197 的指令系统 程序功能 BUF XXH XXH 在20个数中找最大的数,并将其存放在MAX单元中。 XXH MAX

198 回顾上节内容 一、加法指令 ADD DST, SRC ADC DST, SRC INC DST 二、减法指令 SUB DST, SRC
SBB DST, SRC DEC DST NEG DST CMP DST, SRC

199 4. 8086的指令系统 算术运算指令 加法指令(ADD、ADC、INC) 减法指令 (SUB、SBB、DEC、NEG、CMP)
乘法指令(MUL、IMUL) 除法指令(DIV、IDIV、CBW、CWD) 十进制调整指令(DAA、DAS、AAA、AAS、AAM、AAD)

200 的指令系统 四、乘法和除法指令 (一)乘法运算 两个无符号二进制数的乘法运算与十进制数的乘法类似,可以采用列竖式的方法计算,只是在相加运算时,按逢二进一的规则。而两个有符号二进制数进行乘法运算时,先将负数采用变补的方法变换成正数,进行两个正数相乘,然后统一考虑符号。

201 4. 8086的指令系统 (二)乘法指令 格式: MUL SRC ;无符号数相乘 IMUL SRC ;有符号数相乘 说明:
(Multiply byte or word unsigned) (Integer multiply byte or word) (二)乘法指令 格式: MUL SRC ;无符号数相乘 IMUL SRC ;有符号数相乘 说明: MUL为无符号数乘法指令,IMUL为有符号数乘法指令,指令的目的操作数隐含在AX(或AL)中,SRC可以取通用寄存器和存储单元,它必须有类型,而且只能是字节和字,它们决定了乘法操作的类型。

202   4. 8086的指令系统 AH AL DX AX MUL SRC IMUL SRC AL 操作数 8位乘法 AX 操作数 16位乘法
①当SRC为字节时,MUL和IMUL为字节运算,这时表示将AL中的数与(SRC)相乘,其结果放入(AX)中; ②当SRC为字时,MUL和IMUL为字运算,这时表示将AX中的数与(SRC)相乘,其结果的高16位保存在(DX),低16位保存在(AX)。 AL 操作数 AH AL (8位) (16位) 8位乘法 AX 操作数 DX AX (16位) (32位) 16位乘法

203 的指令系统 MUL和IMUL指令只对PSW的CF、OF位有影响,其规则为: 当采用MUL或IMUL运算时,字运算结果的DX为0时,CF=0,OF=0,表示两个字相乘其结果也为一个字;字节运算结果的AH为0时,CF=0,OF=0,表示两个字节相乘其结果也为一个字节;否则CF=1,OF=1。 CF=0 OF=0表示: 字节←字节×字节 字 ← 字 × 字

204 的指令系统 无长度属性

205 的指令系统 例3.7 乘法的字节运算。要计算两个无符号数2CH、42H的乘积,结果保存在AX中。 解:程序段如下: MOV AL, 2CH MOV BL, 42H MUL BL 结果(AX)=0B58H,CF=1,OF=1。

206 的指令系统 例3.8 乘法的字运算。要计算两个有符号数1000、-12345的乘积。 解:程序段如下: MOV AX, 1000 MOV BX, IMUL BX 执行得到结果(DX)=FF43H, (AX)=A158H,CF=1,OF=1

207 4. 8086的指令系统 (四)除法指令 格式: DIV SRC ;无符号数的除法 IDIV SRC ;有符号数的除法 说明:
DIV为无符号数除法指令,IDIV为有符号数除法指令,指令的目的操作数隐含在DX:AX(或AX)中,SRC可以取通用寄存器和存储单元,它必须有类型,而且只能是字节和字,它们决定了除法操作的类型。

208 AL (AX)/(SRC) AH 字节除法 4. 8086的指令系统 除法操作类型 :
①当SRC为字节时,DIV和IDIV为字节运算,这时表示将AX中的16位二进制数除以8位二进制数(SRC),其结果的商保存在(AL)中,余数保存在(AH)中; (AX)/(SRC) AL 字节除法 余数 AH

209 AX (DX:AX)/(SRC) DX 字除法 4. 8086的指令系统 除法操作类型 :
②当SRC为字时,DIV和IDIV为字运算,这时表示将DX与AX联合构成的32位二进制数除以16位二进制数(SRC),其结果的商保存在(AX)中,余数保存在(DX)中。 (DX:AX)/(SRC) AX 字除法 DX 余数

210 的指令系统 (三)除法运算 两个无符号二进制数的除法运算与十进制数的除法类似。而两个有符号二进制数进行除法运算时,先将负数采用变补的方法变换成正数,进行两个正数相除,然后统一考虑符号,这可以分成四种情况: 被除数为正,除数为正,则商为正,余数为正; 被除数为正,除数为负,则商为负,余数为正; 被除数为负,除数为正,则商为负,余数为负; 被除数为负,除数为负,则商为正,余数为负。 被除数、除数、商及余数均为带符号数,商的符号符合一般代数运算的符号规则,余数的符号与被除数相同。

211 DIV和IDIV指令不影响PSW中的标志位.
的指令系统 DIV和IDIV指令不影响PSW中的标志位. 但除法不允许出现除数为0或商溢出,若发生除数为0或商溢出则其结果没有意义,并引起中断(关于中断的概念以后再作介绍)。

212 4. 8086的指令系统 例1.下列指令是合法的。 DIV BL IDIV CX DIV WORD PTR [BX][SI]
下列指令是非法的。 DIV 12 〤 SRC(除数)不能为立即数寻址 DIV [SI]+02H 〤 SRC类型不明确 IDIV AX,BL 〤 DST(被除数)应为隐含寻址

213 的指令系统 例3.10 字÷字节的除法运算。设要完成除法运算12345÷156。 解:被除数12345可以用一个字表示,除数156可以用一个字节表示,因此可以直接采用除法的字节运算。程序段为: MOV AX, 12345 MOV BL, 156 DIV BL 执行结果商(AL)=4FH 余数(AH)=15H

214 4. 8086的指令系统 例3.11 双字÷字的除法运算。设要完成除法运算28901240H÷(-6528H)。
解:这是有符号数的除法运算,被除数应该用一个双字表示,除数可以用一个字表示,程序段为: MOV AX, 1240H MOV DX, 2890H MOV BX, -6528H IDIV BX 执行结果商(AX)=9959H, 余数(DX)=2528H。

215 4. 8086的指令系统 例3.12 双字÷字节的除法运算。设要完成无符号除法运算00011240H÷0A0H。
解:这是无符号数的除法运算,被除数应该用一个双字表示,除数本身可以用一个字节表示,但除法运算只能采用双字÷字,因此除数应该变换成字。对无符号数来说,这种由字节变换成字的过程,非常简单,只需要将高位字节填0。程序段为: MOV AX, 1240H MOV DX, 0001H MOV BL, 0A0H MOV BH, 0 DIV BX 执行结果商(AX)=01B6H,余数(DX)=0080H。

216 的指令系统 五、符号扩展指令 格式: CBW ;将AL中的符号扩展到AH中, 形成一个字AX CWD ;将AX中的符号扩展到DX中, 形成双字(DX:AX) CBW(Convert byte to word) CWD(Convert word to doubleword)

217 的指令系统 CBW(Convert byte to word)为字节到字的符号扩展指令,表示将AL中的有符号数扩展到AH,即根据AL中的符号位D7来扩展: 当D7=0时,AH=00H 当D7=1时,AH=FFH 这样可以保证有符号数AL与有符号数AX所表示的值相同。

218 的指令系统 CWD(Convert word to doubleword)为字到双字的符号扩展指令,表示将AX中的有符号数扩展到DX,即根据AX中的符号位D15来扩展: 当D15=0时,DX=0000H 当D15=1时,DX=FFFFH 这样可以保证有符号数AX与有符号数DX:AX所表示的值相同。

219 的指令系统

220 的指令系统 应用场合: 在算术运算中,有时会遇到两个长度不等的数进行加、减运算,此时,应将长度短的数的位数扩展,以使两数的长度一致,只有这样,才能保证参加运算的两个操作数的类型是一致的。

221 4. 8086的指令系统 例3.9 字节×字运算。要计算两个有符号数15H、FB78H的乘积。
MOV AL, 15H CBW MOV BX, 0FB78H IMUL BX 执行得到结果(DX)=FFFFH,(AX)=A0D8H,CF=0,OF=0,这表示相乘结果只需要用一个字表示。

222 例2.写出计算Y=a*b+c-18的程序 4. 8086的指令系统 ;在数据段定义变量如下:
DAT1 DB 34H ;34H为变量a的一个设定值 DAT2 DB 56H ;56H为变量b的一个设定值 DAT3 DB 0E7H ;0E7H为变量c的一个设定值 DATY DW ? ;DATY单元存放结果

223 Y=a*b+c-18 4. 8086的指令系统 ;在代码段编写程序 MOV AL,DAT1 ;取a MOV BL,DAT2 ;取b
IMUL BL ;(AL)*(BL) (AX) MOV BX,AX ;(AX) (BX) MOV AL,DAT ;取c CBW ;扩展AL AX ADD AX,BX ;(AX)+(BX) (AX) SUB AX,18 MOV DATY,AX Y=a*b+c-18

224 的指令系统 六、BCD数运算调整指令 BCD码(数)是用四位二进制码来表示一位十进制数。利用BCD码可进行加、减、乘、除运算,但为了得到正确的结果,必须进行修正。 BCD码表示可分为两类: 分离BCD码:8位的寄存器中只包含一位BCD码(D0~D3); 组合BCD码:8位的寄存器中包含了两位BCD码。 在这两种情况下,修正的方法是不同的,其调整指令也不同。

225 4. 8086的指令系统 BCD数调整指令共有6条,如下所示: 助记符格式 功 能 说 明 AAA 加法分离BCD调整 AAS
功 能 说 明 AAA 加法分离BCD调整 AAS 减法分离BCD调整 DAA 加法组合BCD调整 DAS 减法组合BCD调整 AAM 乘法分离BCD调整 AAD 除法分离BCD调整

226 的指令系统 1. 加法调整指令 格式: AAA ;加法分离BCD码调整 DAA ;加法组合BCD码调整 AAA(ASCII adjust for addition) DAA(Decimal adjust for addition)

227 的指令系统 AAA(ASCII adjust for addition)为分离BCD码加法运算后的调整指令,表示对相加结果AL的低4位进行加6修正。根据运算结果及修正结果的AF有无进位,进行下列操作: AF有进位,则AH=1,CF=1,AF=1; AF无进位,则AH=0,CF=0,AF=0。 并清掉AL中的高4位。

228 的指令系统 DAA(Decimal adjust for addition)为组合BCD码加法运算后的调整指令,表示对相加结果AL的低4位和高4位分别进行加6修正。DAA指令对PSW中的AF、CF、SF、ZF、PF都有影响,其效果等同于ADD指令。

229 4. 8086的指令系统 例3.13 计算十进制数的加法运算,设要计算4+8。
例3.13 计算十进制数的加法运算,设要计算4+8。 解:当通过键盘输入这两个十进制数时,我们得到的是其ASCII码,如果将其看作为分离BCD码,则高4位为无效部分,因此不需要将高4位清除。 MOV AL, ‘4’ MOV BL, ‘8’ ADD AL, BL AAA AAA指令调整之前,(AL)=6CH,执行AAA指令后,其结果为(AX)=0102H,CF=1,AF=1; 这说明“4+8=12”。

230 4. 8086的指令系统 例3.14 计算十进制数的加法运算,设要计算34+28。
例3.14 计算十进制数的加法运算,设要计算34+28。 解:采用组合BCD表示数34,这时应将“34H”送入某寄存器。程序段如下: MOV AL, 34H MOV BL, 28H ADD AL, BL DAA DAA指令调整之前,(AL)=5CH,执行DAA指令后,其结果为(AL)=62H,CF=0,AF=1,SF=0,PF=0,ZF=0,这说明“34+28=62”。

231 4. 8086的指令系统 例3.15 计算十进制数的加法运算,设要计算56+73。 解:程序段如下: MOV AL, 56H
例3.15 计算十进制数的加法运算,设要计算56+73。 解:程序段如下: MOV AL, 56H MOV BL, 73H ADD AL, BL DAA DAA指令调整之前,(AL)=C9H,执行DAA指令后,其结果为(AL)=29H,CF=1,AF=0,SF=0,PF=0,ZF=0,这说明“56+73=129”(注意,CF的值为百位数)。

232 的指令系统 2. 减法调整指令 格式: AAS ;减法分离BCD码调整 DAS ;减法组合BCD码调整 说明: AAS(ASCII adjust for subtraction) DAS(Decimal adjust for subtraction)

233 的指令系统 AAS(ASCII adjust for subtraction)为分离BCD码减法运算后的调整指令,表示对相减结果AL的低4位进行减6修正。根据运算结果及修正结果的AF有无借位,进行下列操作: AF有借位,则CF=1,AF=1; AF无借位,则CF=0,AF=0。 并清掉AL中的高4位。

234 的指令系统 DAS(Decimal adjust for subtraction)为组合BCD码减法运算后的调整指令,表示对相减结果AL的低4位和高4位分别进行减6修正。DAS指令对PSW中的AF、CF、SF、ZF、PF都有影响,其效果等同于SUB指令。

235 4. 8086的指令系统 例3.16 计算十进制数的减法运算,设要计算5-9。 解:程序段如下: MOV AL, 05H
例3.16 计算十进制数的减法运算,设要计算5-9。 解:程序段如下: MOV AL, 05H MOV BL, 09H SUB AL, BL AAS AAS指令调整之前,(AL)=0CH,AF=1,执行AAS指令后,其结果为(AL)=06H,CF=1,AF=1;这说明调整结果为负数,因此结果为-4。

236 4. 8086的指令系统 例3.17 计算十进制数的减法运算,设要计算31-87。 解:程序段如下: MOV AL, 31H
例3.17 计算十进制数的减法运算,设要计算31-87。 解:程序段如下: MOV AL, 31H MOV BL, 87H SUB AL, BL DAS DAS指令调整之前,(AL)=0AAH,AF=1,CF=1,执行DAS指令后,其结果为(AL)=44H,CF=1,AF=1;这说明调整结果为负数,因此结果为 -56(注意,这里读取结果的方法与AAS不同)。

237 Thank You !

238 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

239 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

240 的指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令

241 4. 8086的指令系统 5条逻辑运算类指令书写格式与完成的功能如下表所示。 助记符格式 功 能 说 明 与 AND DST,SRC
功 能 说 明 与 AND DST,SRC (DST) ( DST) ∧ ( SRC) 或 OR DST,SRC (DST) ( DST) ∨ ( SRC) 异或 XOR DST,SRC (DST) ( DST) ⊕ ( SRC) 测试 TEST DST,SRC (DST) ∧ (SRC)置各标志位 非 NOT DST (DST)中各位取反

242 指令执行后对标志位的影响情况: 指令的运算都是按位进行的。
的指令系统 指令的运算都是按位进行的。 指令执行后对标志位的影响情况: 除NOT指令对标志位不产生影响外,其余指令将使CF、OF置0,并以正常规则设置SF、ZF和PF的状态。

243 4. 8086的指令系统 与 AND 或 OR 非 NOT 异或 XOR 测试 TEST 8086的逻辑的操作对象是字节或字,按位运算。
同为1则结果为1,否则结果为0 或 OR 同为0则结果为0,否则结果为1 非 NOT 取反,1变0,0变1 异或 XOR 相同结果为0,不同结果为1 测试 TEST 和“AND”的功能完全相同,但不改变任何操作数,只改变PSW 8086的逻辑的操作对象是字节或字,按位运算。 CF=OF=0,ZF、SF、PF根据结果改变,AF无定义。

244 4. 8086的指令系统 1. 逻辑与指令(AND) AND DST, SRC 但DST和SRC不能同时为存储单元。 PSW
;(DST)←(DST)∧(SRC) PSW CF、OF置0, 设置SF、ZF和PF的状态 通用寄存器 存储单元 通用寄存器 存储单元 立即数 但DST和SRC不能同时为存储单元。

245 AND AX,BX ;(AX)←(AX)∧(BX) AND AL, 156 AND VAR1, 78AAH AND CX, [SI]
的指令系统 例3.20 求两个操作数的逻辑与。 解:设VAR1为字型变量,则有: AND AX,BX ;(AX)←(AX)∧(BX) AND AL, 156 ;(AL)←(AL)∧ B (156= B) AND VAR1, 78AAH ;(VAR1)←(VAR1)∧78AAH AND CX, [SI] ;(CX)←(CX)∧((SI))

246 4. 8086的指令系统 2. 逻辑测试指令(TEST) TEST DST, SRC 但DST和SRC不能同时为存储单元。
PSW CF、OF置0, 设置SF、ZF和PF的状态 通用寄存器 存储单元 通用寄存器 存储单元 立即数 但DST和SRC不能同时为存储单元。 操作对 DST 和SRC不产生任何影响

247 的指令系统 例3.21 求两个操作数的逻辑测试。 解:设VAR1为字型变量,则有: TEST AL, 156 ; (AL)∧ B (156= B) TEST VAR1, 78AAH ; (VAR1)∧78AAH TEST AX,BX ; (AX)∧(BX) TEST CX, [SI] ; (CX)∧((SI))

248 4. 8086的指令系统 3. 逻辑或指令(OR) OR DST, SRC 但DST和SRC不能同时为存储单元。 PSW CF、OF置0,
; (DST)←(DST) ∨(SRC) PSW CF、OF置0, 设置SF、ZF和PF的状态 通用寄存器 存储单元 通用寄存器 存储单元 立即数 但DST和SRC不能同时为存储单元。

249 的指令系统 例3.22 求两个操作数的逻辑或。 解:设VAR2为字节型变量,则有: OR AL, B ;(AL)←(AL) ∨ B OR VAR2, 0FH ;(VAR2)←(VAR2) ∨0FH OR AX,BX ;(AX)←(AX) ∨(BX) OR BX, [DI] ;(BX)←(BX) ∨((DI))

250 4. 8086的指令系统 4. 逻辑异或指令(XOR) XOR DST, SRC 但DST和SRC不能同时为存储单元。 PSW
; (DST)← (DST) ⊕(SRC) PSW CF、OF置0, 设置SF、ZF和PF的状态 通用寄存器 存储单元 通用寄存器 存储单元 立即数 但DST和SRC不能同时为存储单元。

251 的指令系统 例3.23 求两个操作数的逻辑异或。 解:设VAR2为字节型变量,则有: XOR AL, B ;(AL)←(AL) B XOR VAR2, 0FH ;(VAR2)←(VAR2) 0FH XOR AX,BX ;(AX)←(AX) (BX) XOR BX, [DI] ;(BX)←(BX) ((DI))

252 4. 8086的指令系统 5. 逻辑非指令(NOT) NOT DST PSW 不做任何改变 ; (DST)← ~ (DST) 通用寄存器
存储单元

253 的指令系统 例3.24 求操作数的逻辑非。 解:设VAR1为字型变量,则有: NOT AL NOT VAR1

254 4. 8086的指令系统 逻辑运算的用途 利用逻辑运算指令可通过适当选用源操作数的代码,使目的操作数的某些位进行清零、置位及取反操作
利用逻辑运算指令可改变PSW的相应位,给跳转指令提供依据

255 4. 8086的指令系统 OR CL, 03H ;将CL的位0,1置1,其余位不变 AND AL, 0F5H ;将AL的位1,位3清零
XOR AH, 0FH ;将AH的低4位取反,高4位不变 TEST AL, 02H ;测试AL的位1是否为0, JZ ZER1 ; 若为0则转移到ZER1 XOR AX, AX ;AX清0 AND AL, 5FH ;将AL中字母的ASCII码变换成 “大写”字母的ASCII码 OR AL, 20H ;将AL中字母的ASCII码变换成 “小写”字母的ASCII码

256 4. 8086的指令系统 在8086指令系统中,移位类指令有: 逻辑右移SHR 算术右移SAR 逻辑/算术左移SHL/SAL 循环右移ROR
循环左移ROL 带进位循环右移RCR 带进位循环左移RCL

257 4. 8086的指令系统 移位类指令具有相同的指令格式 SHR DST, CNT
共同特点:正常影响PSW的SF、PF、ZF、CF和OF标志位,其中CF表示指令所移出的一位,OF=1表示移位前后符号位发生了变化。 移位类指令具有相同的指令格式 SHR DST, CNT 通用寄存器 存储单元 01H 或 CL

258 1.移位指令 ①逻辑移位 4. 8086的指令系统 移位空出来的位补零 移出来的位放入CF 右移1位操作相当于将DST除以2;
左移 SHL DST, CNT 右移 SHR DST, CNT CF D D1 D0 D D1 D0 CF 右移1位操作相当于将DST除以2; 左移1位操作相当于将DST乘以2。

259 例. SHR AX, 1 ;将AX的内容右移1位,最 ;高位补0 SHL AL, CL;将AL的内容左移CL中指 ;定的次数,且每次移位
的指令系统 例. SHR AX, 1 ;将AX的内容右移1位,最 ;高位补0 SHL AL, CL;将AL的内容左移CL中指 ;定的次数,且每次移位 ;最低位补0

260 的指令系统 SHR AL, 1 ; (AL)= B CF 1 1 CF=0 SHL AL, CL; (CL)=3, (AL) = B CF 1 000 1 CF=1

261 SHL DAT1[SI],CL;将内存某单元的 ;内容左移CL中所
的指令系统 SHL DAT1[SI],CL;将内存某单元的 ;内容左移CL中所 ;中指定的次数 SHR BL, 2 〤当移位次数>1时,必 须用CL提供移位次数

262 OR 0000 **** BL 0000 **** AL **** 0000 BL SHL
例2、将两个非组合BCD数(高阶存BL,低阶存于AL中),转换成一个组合的BCD数,存于AL中。 0000 **** BL 0000 **** AL **** 0000 BL SHL OR 程序段:MOV CL,4 SHL BL,CL OR AL,BL HLT

263 ②算术移位 4. 8086的指令系统 移出来的位放入CF 左移 SAL DST, CNT 右移 SAR DST, CNT 空位由符号位补充
CF 与SHL完全相同 空位由符号位补充

264 2.循环移位指令 ①不带CF的循环移位 4. 8086的指令系统 左移 ROL DST, CNT 右移 ROR DST, CNT CF

265 的指令系统 ②带CF的循环移位 左移 RCL DST, CNT 右移 RCR DST, CNT CF DST CF DST

266 例1.若(BL)=01110010B,(CL)=3, CF=1,则CPU执行: RCR BL, CL 指令后,
的指令系统 例1.若(BL)= B,(CL)=3, CF=1,则CPU执行: RCR BL, CL 指令后, (BL)= B=0AEH

267 的指令系统

268 的指令系统 例2.编程序实现5*10运算。 (不能用MUL指令) 算法: 5*10 =5*(2+8) =5*2+5*8

269 MOV AL, 05H SHL AL, 1 ;(AL)=5*2 MOV BL, AL ;(BL)=5*2 MOV CL, 2
的指令系统 MOV AL, 05H SHL AL, 1 ;(AL)=5*2 MOV BL, AL ;(BL)=5*2 MOV CL, 2 SHL AL, CL ;(AL)=5*8 ADD AL, BL ;(AL)=5*10

270 的指令系统 例3.28 将一个字(AX)的内容除2,并进行四舍五入操作。 解:对(AX)右移1位等效于(AX)÷2,四舍五入操作可以表述成:当原(AX)最低位(即移出的1位)为1时,在结果中加1。因此可以编写出程序段: SHR AX, 1 ADC AX, 0

271 的指令系统 另外,四舍五入操作还可以表述成: 其中方括号表示取整运算,这样可以在移位之前的最低位加上1,然后进行右移1位的操作。因此可以编写出程序段: INC AX SHR AX, 1

272 4. 8086的指令系统 例3.29 将一个两位的组合BCD数转换成ASCII码,并存放在指定单元中BUF,假设该BCD数已经存放在AL中
MOV SI, 0 MOV BL, AL AND AL, 0FH ADD AL, 30H MOV BUF[SI], AL MOV CL, 04 SHR BL, CL ADD BL, 30H INC SI MOV BUF[SI], BL

273 例5、将32位数据(DX,AX)中的内容右移2位。
的指令系统 例4、将32位数据(DX,AX)中的内容左移1位。 例5、将32位数据(DX,AX)中的内容右移2位。

274 标志位操作指令 4. 8086的指令系统 助记符格式 功能说明 CLC 0 CF STC 1 CF CMC CF CF CLD 0 DF
STD DF 助记符格式 功能说明 CLI IF STI IF

275 Thank You !

276 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

277 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

278 的指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令

279 的指令系统 寻找的操作数作地址用,给IP或给CS:IP, 从而实现程序的转移。 如果程序转移后只有IP发生了改变,则称 为段内转移或者称为近程转移(也称为NEAR 型转移)。 如果程序转移后CS、IP均发生了改变,则 称为段间转移或者称为远程转移(也称为FAR

280 4. 8086的指令系统 8086指令系统中的转移指令有两大类: 无条件转移指令:有JMP、CALL、RET、IRET
条件转移指令:如JZ、JC、JCXZ、LOOP等。

281 ;转移到由通用寄存器REG指定的位置执行程序 (3) JMP MEM
的指令系统 一、无条件转移指令 格式: (1) JMP LABEL ;转移到标号LABEL处执行程序 (2) JMP REG16 ;转移到由通用寄存器REG指定的位置执行程序 (3) JMP MEM ;转移到由存储单元MEM指定的位置执行程序 字单元实现段内转移 双字单元实现段间转移

282 4. 8086的指令系统 语句标号 EG: (1) JMP LABEL
这时并不需要特别指出转移指令是Near型的段内转移还是Far型的段间转移,宏汇编程序(MASM)会根据标号L1的位置,自动生成相应的指令代码。 EG: . JUMP L1 L1: MOV AX, BX

283 4. 8086的指令系统 (2) JMP REG16 EG: 如果要根据BX的内容进行转移,即BX中存放有转移的目的地址,
则采用 JMP BX指令。 EG: MOV BX, 2 JMP BX ;转移到CS:0002H

284 4. 8086的指令系统 (3) JMP MEM 设字变量VAR1存放有转移的目的偏移地址,
则可以采用 JMP VAR1 完成程序的段内转移 设双字变量VAR2存放有转移的目的段地址和偏移地址, 则可以采用 JMP VAR2 完成程序的段间转移 DBT1 DW 0400H DBT2 DD H TAB DW 0600H,0640H,06A0H 则在代码段中有: MOV BX, 2 JMP DBT1 ;转移到CS:0400H JMP DBT2 ;转移到0100:0020H JMP TAB[BX+2] ;转移到CS:06A0H JMP WORD PTR[BX] ;转移到本段,偏移地址保存在 DS:0002H与DS:0003H中 段地址不变 TAB的地址+4 基址变址且相对寻址

285 的指令系统 二、有条件转移指令 对有条件转移指令,只有当给定的条件满足时,才转移到指定的地址,否则执行下一条指令。依据为PSW中的标志位,这些标志位是由上一条指令执行时产生的。指令形式有许多种,如表3.6所示。

286 4. 8086的指令系统 根据单个标志位(CF、ZF、SF、OF、PF)的状态进行转移 指令格式 测试条件 功能 英文描述 JC LABEL
有进/借位 Jump if carry JNC LABEL (CF=0) 无进/借位 Jump if not carry JE/JZ LABEL (ZF=1) 相等 Jump if equal/zero JNE/JNZ LABEL (ZF=0) 不相等 Jump if not equal/not zero JS LABEL (SF=1) 负数 Jump if sign JNS LABEL (SF=0) 正数 Jump if not sign

287 4. 8086的指令系统 JO LABEL (OF=1) 有溢出 Jump if overflow JNO LABEL (OF=0) 无溢出
Jump if not overflow JP/JPE LABEL (PF=1) 有偶数个1 Jump if parity/parity equal JNP/JPO LABEL (PF=0) 有奇数个1 Jump if not parity/parity odd

288 4. 8086的指令系统 无符号数比较大小 JA/JNBE LABEL (CF=0)∧(ZF=0) 高于/不低于等于
ABOVE EQUAL BELOW JA/JNBE LABEL (CF=0)∧(ZF=0) 高于/不低于等于 Jump if above/not below nor zero JAE/JNB LABEL (CF=0) 高于等于/不低于 Jump if above or equal /not below JB/JNAE LABEL (CF=1) 低于/不高于等于 Jump if below /not above nor equal JBE/JNA LABEL (CF=1) ∨(ZF=1) 低于等于/不高于 Jump if below or equal /not above

289 4. 8086的指令系统 有符号数比较大小 OF)=1 OF)=0 (SF
GREATER EQUAL LESS OF)=1 OF)=0 (SF Jump if less or equal/not greater 小于等于/不大于 (OF ∨ZF)=0 JLE/JNG LABEL Jump if less /not greater nor equal 小于/不大于等于 JL/JNGE LABEL Jump if greater or equal/not less 大于等于/不小于 JGE/JNL LABEL Jump if greater /not less nor equal 大于/不小于等于 JG/JNLE LABEL

290 的指令系统 所有的有条件转移只有一种寻址方式: 段内直接转移 转移范围:-128~127

291 4. 8086的指令系统 在使用有条件转移指令时,应该注意下列几点:
1.由于有条件转移指令的指令转移范围为-128~+127,因此为了转移到更远的位置,需要将条件转移指令与JMP指令结合起来使用,例如当(AL)等于1时要转移到较远的KS1处,应该采用: CMP AL, 1 JZ K1 K1: JMP KS1

292 的指令系统 2.对有符号数和无符号数进行比较时,应该采用不同的转移指令,JB、JA为无符号数的比较指令,而JL、JG为有符号数的比较指令,例如: VAR1 DW 003AH VAR2 DW 8003H MOV AX, VAR1 MOV BX, VAR2 CMP AX, BX ;设置标志位CF=1, OF=0, SF=1, AF=0, ZF=0, PF=0 JB KS1 JB KS1 指令的条件满足(CF=1),也即将两个数看成无符号数时,条件003AH<8003H满足,因此程序转移到KS1。 如果JB KS1换成JL KS1 指令,则表示将两个数看成有符号数进行比较,条件003AH<8003H不满足,因此,程序不产生转移,继续执行下一条指令。

293 的指令系统 3.应正确理解各指令的含义及测试条件。 例如JC和JB指令都是测试CF是否等于1,将它用在CMP和SUB之后,表示判断两个无符号数相减结果是否少于0,而用在ADD之后则表示判断相加运算是否有进位,如果用在移位指令之后,则用于判断移出的一位是否为1。

294 4. 8086的指令系统 4.特别注意有些指令并不影响标志位,如通用传送指令MOV等,因此要判断变量VAR1是否为0时,应该采用
MOV AX, VAR1 ;不影响标志位 OR AX, AX ;在保持AX内容 不变的前提下,设置标志位 或 AND AX, AX 或 CMP AX,0 JZ KS1

295 4. 8086的指令系统 5.完成同一功能可以有多种形式,例如两个无符号数比较时,(DST)低于(SRC)时转移到KS1,则可以采用:
JB KS1 或 JNAE KS1 或 JC KS1

296 的指令系统 转移指令与转移地址寻址方式

297 的指令系统 转移指令与转移地址寻址方式 指令中指明的8bit/16bit的相对位移量DISP 是相对于当前IP来计算的,有正、负转移,向地址增加的方向转移,为正转移,DISP用原码表示;向地址减小的方向转移,为负转移,DISP用补码表示。 转移目的地物理地址的求法: PA=(CS)×16+当前(IP)+DISP 注:8086指令系统当中的所有条件转移指令只能在段内转移,且转移范围以当前IP为基准,不能超出-128∽+127之间,其寻址方式为段内相对寻址。

298 的指令系统 转移指令与转移地址寻址方式 2.段内间接寻址 这种寻址方式中,转移地址的段内偏移地址要么存放在一个16bit的寄存器中,要么放在存储器的一个字单元之中。这个寄存器或字单元的地址,由前面讲过的数据的寻址方式指明。只不过寻址所得到的不是数据,而是偏移地址。

299 4. 8086的指令系统 转移指令与转移地址寻址方式 例:若(DS)=2000H,(BX)=0100H,(SI)=0002H,
(20100H)=1200H,(20102H)=1250H, 则CPU执行: JMP BX 指令后,(IP)=0100H JMP WORD PTR [BX]指令后,(IP)=1200H JMP WORD PTR [BX][SI]指令后,(IP)=1250H

300 段间转移地址的寻址方式(CS、IP均发生改变)
的指令系统 转移指令与转移地址寻址方式 段间转移地址的寻址方式(CS、IP均发生改变) ——只适合于无条件转移指令 1. 段间直接寻址 指令语句书写时直接写出转移目的地的符号地址(FAR型标号名)。 书写格式为: JMP FAR PTR 标号名

301 的指令系统

302 …… + 4. 8086的指令系统 如 :JMP FAR PTP ADDR 操作码 IP CS OP CODE OFFSET低字节
00 30 IP OFFSET低字节 OFFSET高字节 CS H 00 40 CS SEG低字节 + IP H SEG高字节 …… H ADDR OP CODE 存储器

303 4. 8086的指令系统 2. 段间间接寻址 这种寻址方式和段内间接寻址方式相似,但不 可能有寄存器间接寻址了,因为要得到的转移地址
是32bit(16bit SEG地址和16bit EA地址)。因 此转移目的地的地址只能间接的存放在一个双字的存储器单元当中。这个双字存储器单元可以用五种存储器寻址方式的任一种寻找到。找到的这个双字单元(连续的4个字节单元)存放的就是转移地址如下图所示:

304 的指令系统 低字节 …… 高字节 存放转移地址的首址 转移OFFSET IP 转移SEG地址 CS 存储器

305 的指令系统

306 Thank You !

307 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

308 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

309 的指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令

310 (DO-WHILE结构) 4. 8086的指令系统 1.循环程序的基本结构 循环程序有以下两种结构。 (A)先循环工作,后循环判定
(DO-UNTIL结构) (B)先循环判定,后循环工作 (DO-WHILE结构)

311 4. 8086的指令系统 (A) (B) 初始化准备部分 出口判定 Y N 开 始 结 束 循环工作部分 循环参数调整部分 出口判定 Y N

312 的指令系统 2.循环程序的组成 不管是哪一种循环结构,一个标准的循 环程序应由以下四部分组成: 初始化准备部分 循环工作部分 参数调整部分 出口判定部分

313 4. 8086的指令系统 初始化准备部分 循环工作部分 参数调整部分 循环出口判定部分
这是为循环做准备的,它不在循环体内。 循环工作部分 这部分是循环程序解题所需的核心程序,题目要完成的功能在此进行。根据题目要求不同,这部分程序可以很简单,也可以很复杂,甚至是内循环嵌套外循环结构——多重循环程序。 参数调整部分 这部分主要用来更新某些数据或修正循环控制的参数,以保证每次循环所完成的功能不是完全重复的。 循环出口判定部分 循环程序中至少要有一个出口判定,以保证循环程序正常结束。也有些循环程序有多个出口,程序可以有多个条件作为循环结束的控制,只要其中一个条件满足即可结束循环。

314 4. 8086的指令系统 3.循环控制指令 为了便于循环控制,8086/8088CPU 专门设置了一类循环控制类指令: LOOP LABEL
;(CX)←(CX)-1, (CX)≠0时转LABEL LOOPZ/LOOPE LABEL ;(CX)←(CX)-1, (CX)≠0且ZF=1时转LABEL LOOPNZ/LOOPNE LABEL ;(CX)←(CX)-1, (CX)≠0且ZF=0时转LABEL JCXZ LABEL ;CX=0时转LABEL 说明: 循环控制指令的寻址方式均为段内直接转移,而且为短转移方式。

315 的指令系统 1. LOOP指令 LOOP(Loop)指令为常用的循环控制指令,(CX)的内容为设定的循环次数,每循环一次(CX)的内容减1,直到(CX)为零时退出循环。其循环结构为: MOV CX, 次数 ;循环准备 标号: ;循环体 LOOP 标号 这里的“标号”与“LOOP 标号”指令之间至多包含128字节,这是因为循环控制指令为短转移指令。

316 的指令系统 2. LOOPZ/LOOPE指令 LOOPZ/LOOPE(Loop if zero/equal)指令与LOOP指令类似,只是当(CX)≠0且ZF=1时才转至LABEL,因此是否循环,除了与设定的循环次数有关外,还与循环中设定的条件是否满足有关。例如: MOV CX, 10 L1: CMP AX,BX ;若(AX)≠(BX),即ZF=0,则退出循环 LOOPZ L1 这种指令非常适合于在指定区域中查找不同的“字符”,当找到不同的“字符”时,会自动提出循环。

317 的指令系统 3. LOOPNZ/LOOPNE LOOPNZ/LOOPNE(Loop if not zero/not equal)指令的功能与LOOPZ/LOOPE指令相反,只是当(CX)≠0且ZF=0时才转至LABEL。例如: MOV CX, 10 L2: CMP AX,BX ;若(AX)=(BX),即ZF=1, 则退出循环 LOOPNZ L2 这种指令非常适合于在区域中查找指定的“字符”,当找到指定的“字符”时,会自动退出循环。

318 的指令系统 4. JCXZ指令 JCXZ(Jump if register CX=0)指令经常与循环指令配合使用。如果循环次数(CX)设定为0,则要循环65536次(最大的循环次数),这一点与常规表示不同。为此,应该在进入循环前检查(CX)的值,如果(CX)为0,则跳过循环,这时可以采用JCXZ指令完成,其结构为: MOV CX, VAR1 ;设定循环次数,可能为0 JCXZ DONE ;当(CX)=0时,跳过循环 ;循环准备 L3: ;循环体 LOOP L3 DONE:

319 的指令系统 例3.30 设在BUFFER中保存有15个无符号字节型数据,编写程序产生这组数据的校验和,并置入第16个字节单元中。 解:常用的校验和产生算法为: 因此,设在数据段中已经定义好字节型变量BUFFER,则程序如下: LEA SI, BUFFER MOV CX,15 MOV AL,0 L1: ADD AL,[SI] INC SI LOOP L1 MOV [SI],AL ;保存校验和

320 的指令系统 例3.31 设在BUFFER中已经保存有字型数据(),其中前2个字节为数据的个数,计算数据的差分,并保存在DIFF缓冲区中。 解:数据的差分定义为 设在数据段中已经定义缓冲区: BUFFER DW n DW X1,X2,…,Xn DIFF DW n-1 DUP(?) 然后,可以在代码段中设计程序:

321 4. 8086的指令系统 MOV SI,BUFFER MOV CX,[SI] ADD SI,2
JCXZ PROCEND ;当(CX)=0时,跳过循环 LEA DI,DIFF MOV AX,[SI] PROC1:ADD AX,[SI] SHR AX,1 ;完成(AX)÷2操作 MOV [DI],AX ;保存差分结果 ADD DI,2 MOV AX,[SI] LOOP PROC1 PROCEND:

322 的指令系统 作业: 4,5, 11,12, 15,16 18,19,20

323 Thank You !

324 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

325 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

326 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令 4. 8086的指令系统 子程序调用返回指令
中断调用返回指令

327 4. 8086的指令系统 概念:子程序为功能确定、且独立的程序段。 优点:
可以将任何一段独立的程序归整为一个子程序,当需要该段程序时,只需调用子程序即可,调用后会自动返回到调用指令的下一条指令。因此采用子程序设计时,可以简化程序设计。 从调试程序的角度,由于原本在多处出现的程序段,缩减为子程序调用指令,使调试程序更加方便。 缺点: 采用子程序设计后。由于调用子程序和从子程序中返回需要执行指令,并且为保护某些寄存器的内容,需要进行压入堆栈和弹出堆栈的操作,因此会使程序执行速度受到一定的影响。

328 4. 8086的指令系统 实现: 子程序调用是通过自动修改(IP)和/或(CS)的内容实现的。
为了确保子程序调用后能够返回到调用指令之后,CALL指令会自动保存返回地址(IP和/或CS),而RET指令会自动返回到CALL指令的下一条指令。

329 4. 8086的指令系统 一、子程序调用指令CALL 子程序调用指令CALL(Call procedure)有两种格式:
CALL LABEL ;调用入口地址为 ;标号LABEL的子程序 CALL OPR ;调用子程序,其入口地址 ;为操作数OPR的内容

330 4. 8086的指令系统 CALL LABEL ;调用入口地址为 ;标号LABEL的子程序 分三种情况:
(1)当标号LABEL与CALL指令不在同一个段内时,子程序调用在段间进行,其完成的操作有:CS入栈,IP入栈;(IP)←LABEL的偏移地址;(CS)←LABEL的段地址。指令的寻址方式为段间直接寻址。

331 的指令系统 (2)当标号LABEL与CALL指令在同一个段内,且可以采用8位有符号数表示其相对位移量时,则子程序调用在段内进行,其完成的操作有:IP入栈;(IP)←(IP)+DISP8。指令的寻址方式为段内直接寻址,也称为相对寻址。 (3)当标号LABEL与CALL指令在同一个段内,且需要采用16位有符号数表示其相对位移量时,则子程序调用在段内进行,其完成的操作有:IP入栈;(IP)←(IP)+DISP16。指令的寻址方式为段内直接寻址,也称相对寻址。

332 4. 8086的指令系统 CALL OPR ;调用子程序,其入口地址 ;为操作数OPR的内容 分为三种情况 :
(1)当OPR为16位的通用寄存器REG16时,则子程序调用在段内进行,其完成的操作有:IP入栈;(IP)←(REG16)。指令的寻址方式为段内间接寻址。

333 的指令系统 (2)当OPR为16位的存储单元RAM时,则子程序调用在段内进行,其完成的操作有:IP入栈;(IP)←(RAM)。指令的寻址方式为段内间接寻址。 (3)当OPR为32位的存储单元RAM时,则子程序调用在段间进行,其完成的操作有:CS入栈,IP入栈;(IP)←(RAM),(CS)←(RAM+2)。指令的寻址方式为段间间接寻址。

334 4. 8086的指令系统 二、子程序返回指令RET 子程序返回指令RET(Return from procedure)有三种格式:
完成IP 出栈,即(IP)←(SP) RETF ;用于段间子程序的返回, 完成IP 出栈,CS 出栈 RET n ;完成RET(或RETF)指令功能后, (SP)←(SP)+n

335 4. 8086的指令系统 三、过程定义 在IBM PC汇编过程中,子程序通常以过程方式编写。过程定义格式: 过程名 PROC [类型]
     RET 过程名 ENDP 其中,过程名是用户给子程序起的名字,它可以看作为标号,具有段地址、偏移地址和类型的属性。子程序的类型可以取NEAR(近程过程,可供段内调用)和FAR(远程过程,可供段间调用),当类型缺省时,表示NEAR(近程过程)。

336 4. 8086的指令系统 一个子程序名一但定义,就具有以下三个属性 段地址 就是子程序第一条指令的地址 段内偏移地址 NEAR(可缺省)
类型 FAR

337 的指令系统 子程序还可以是另一种形式: 〈标号〉: RET

338 …… 4. 8086的指令系统 子程序调用与返回指令应用结构 ①段内子程序调用与返回 ;主程序 CODE SEGMENT
ASSUME CS:CODE START: ……

339 … …… 4. 8086的指令系统 ●SP←(SP)-2 ●((SP))←返回 可以省略 地址(IP) ●IP←(IP)+16 位DISP
CALL NEAR PTR SUB1 ●SP←(SP)-2 ●((SP))←返回 地址(IP) 可以省略 ;子程序SUB1 SUB1 PROC NEAR ●IP←(IP)+16 位DISP …… ●IP←((SP)) RET ; SUB1 ENDP CODE ENDS END START ●SP←(SP)+2

340 … …… … 4. 8086的指令系统 ;主程序 ;子程序 ①SP←(SP)-2 ((SP))←返回地址(CS) ②SP←(SP)-2
((SP))←返回地址(IP) ③IP←OFFSET SUB2 CS←SEG SUB2 ①IP←((SP)) SP←(SP)+2 ②CS←((SP)) 的指令系统 ;主程序 CODEM SEGMENT ASSUME CS:CODEM START: CALL FAR PTR SUB2 MOV AH,4CH INT 21H CODEM ENDS ;子程序 CODES SEGMENT ASSUME CS:CODES SUB2 PROC FAR RETF ;也可以写成RET SUB2 ENDP CODES ENDS END START ……

341 的指令系统 例3.32 子程序设计,编写子程序实现统计一个字(AX)中“1”的个数。 解:利用移位指令或循环移位指令,每次对CF位进行检测位: 当CF=1时,则总个数加1; 当CF=0时,则总个数不变。 这种操作可以采用有条件转移指令来实现,但更方便的方式是采用ADC指令实现。子程序如下:

342 4. 8086的指令系统 COUNTER1 PROC NEAR PUSH AX PUSH CX MOV CX,16 XOR BL,BL
SHR AX,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTER1 ENDP

343 4. 8086的指令系统 例3.33 子程序应用。利用上例设计的子程序,统计字型变量VAR1中1的个数。
解:在数据段中定义变量VAR1和CounterVar1: VAR1 DW 1234H CounterVar1 DB ? 则可在代码段中编写程序: MOV AX, VAR1 CALL COUNTER1 MOV CounterVar1,BL 执行后,结果单元CounterVar1的值为5,说明1234H中包含有5个“1”。

344 4. 8086的指令系统 例3.34 编写以十六进制数显示AL和AX内容的子程序(DISPAL、DISPAX)。
解:先编写显示AL寄存器内容的子程序DISPAL。 (1)如何将一个十六进制数转换成ASCII码 (2)AL中有两个十六进制数,如何分别显示 (3)如何在屏幕上显示一个ASCII码字符 需要考虑三个方面 调用INT 21H的02H号功能进行显示。

345 子程序1:CHANG,十六进制数变换成ASCII码
的指令系统 子程序1:CHANG,十六进制数变换成ASCII码 CHANG PROC NEAR ; CMP AL,10 JNGE CHANG1; ‘0’~‘10’ ADD AL,7 ; ‘A’~‘F’ CHANG1: ADD AL,30H; 将数字转换为ASCII码 RET CHANG ENDP

346 子程序2:DISPAL, 通过调用CHANG将AL的内容显示出来
的指令系统 DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX MOV CL,4 ;处理高位十六进制数 SHR AL,CL CALL CHANG ;十六进制数变换成ASCII码 MOV AH,02H MOV DL,AL INT 21H 子程序2:DISPAL, 通过调用CHANG将AL的内容显示出来 代表功能 DOS 系统中断功能 P 381 附录B ;显示DL中的一位ASCII码

347 4. 8086的指令系统 POP AX AND AL,0FH ;处理低位十六进制数 CALL CHANG ;十六进制数变换成ASCII码
MOV AH,02 MOV DL,AL INT 21H ;显示一位字符 POP DX POP CX RET DISPAL ENDP

348 子程序3:DISPAX, 通过调用DISPAL,实现将AX的内容显示出来
的指令系统 子程序3:DISPAX, 通过调用DISPAL,实现将AX的内容显示出来 DISPAX PROC NEAR XCHG AL,AH CALL DISPAL XCHG AH,AL RET DISPAX ENDP

349 的指令系统 中断 计算机在程序运行过程中,由于发生了某些“紧急事件”,需要进行特殊处理(转向中断服务子程序执行),处理后返回到程序中断处继续执行,这种过程称为中断处理过程。 中断调用指令 中断申请 主程序 中断服务程序 返回

350 4. 8086的指令系统 一、中断调用指令INT 中断调用指令INT(Interrupt)的格式为: INT n
这表示调用第n号中断,n为中断类型号,其值可以是0~255。当执行该指令时,会进行下列操作: 一个中断类型号对应一个中断服务子程序 识别中断源,获得中断类型号 FLAGS CS IP 进栈 清除 TF IF 标志 ,关中断 读中断向量 转入中断 服务程序 开中断 中断处理 关中断 恢复现场 中断返回 主程序 保护现场 断点 中断响应周期 中断服务程序 在保护现场和恢复现场时,不希望被打断,所以要关中断。 在保护现场之后,为了实现中断嵌套,需要开中断。

351 4. 8086的指令系统 二、中断返回指令IRET 中断返回指令IRET(Interrupt return)的格式为: IRET
表示从中断服务子程序返回主程序。执行该指令时,会完成IP、CS、PSW的出栈操作,其次序与INT n 指令的入栈次序相反。由于修改了IP和CS的内容,从而实现的程序的返回功能。

352 的指令系统 INT n 这表示调用第n号中断,n为中断类型号 中断类型号 中断向量 中断向量 表

353 为了能使CPU识别中断源,从而能正确地转向该中断源对应的中断服务程序入口,通常用若干位二进制编码来给中断源编号,该编号称为中断类型号。
的指令系统 ●中断类型号 为了能使CPU识别中断源,从而能正确地转向该中断源对应的中断服务程序入口,通常用若干位二进制编码来给中断源编号,该编号称为中断类型号。 ●中断向量表 存储器从00000H开始的最低地址区的1024个单元,存放256个中断服务程序的入口地址(中断向量)。 已知中断类型号,可以直接找到该中断服务子程序的入口地址

354 的指令系统 中断向量表结构

355 4. 8086的指令系统 保护现场,将有可能用到的寄存器入栈 开中断 关中断 恢复现场 开中断 Step3. 中断服务子程序结构
入口地址:PUSH AX; PUSH BX; PUSH CX; PUSH DX; PUSH SI; PUSH DI; PUSH SP; PUSH BP; STI; CLI; POP BP; POP SP; POP DI; POP DX; POP SI; POP CX; POP BX; POP AX; STI ; IRET 保护现场,将有可能用到的寄存器入栈 开中断 关中断 恢复现场 开中断

356 4. 8086的指令系统 五、系统功能调用 IBM PC/XT机器提供了许多中断服务子程序,在编写程序时可以直接进行调用。
系统功能调用分两类: (1)BIOS功能调用,它是以系统中所支持的硬件为对象的,例如13H号功能为磁盘服务,17H号功能为打印机服务; (2)DOS 功能调用,它以软件方式支持的功能,例如常用的DOS功能调用有21H、20H、25H、26H等,详细说明参见附录B。

357 4. 8086的指令系统 MOV AH, XXH INT 21H 根据对AH赋值不同,实现不同的功能 MOV DL 61H
MOV AH, 02H INT 21H MOV AH, 4CH INT 21H 在显示器上显示 ASCII码 终止程序

358 Thank You !

359 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

360 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

361 的指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令

362 的指令系统 所谓字符串是指一组代码或数据,字符串操作指令就是对这组代码或数据进行相同功能处理的指令。字符串存放在一个连续的存储区域中。

363 的指令系统 8086系统提供了5类字符串操作指令: 字符串传送MOVS(Move byte or word string) 字符串比较CMPS(Compare byte or word string) 字符串扫描SCAS(Scan byte or word string) 字符串装入LODS(Load byte or word string) 字符串存储STOS(Store byte or word string)

364 ☞ 字符串处理指令既可以按字节操作,也可以按字操作,且DST和SRC的寻址方式均为隐含寻址。这类指令要遵循的共同约定如下:
的指令系统 字符串处理指令既可以按字节操作,也可以按字操作,且DST和SRC的寻址方式均为隐含寻址。这类指令要遵循的共同约定如下:

365 ① 若源串在存储器,则存储器地址由DS:SI确定; 若源串在寄存器,则:
的指令系统 ① 若源串在存储器,则存储器地址由DS:SI确定; 若源串在寄存器,则: 字操作时,在AX中 字节操作时,在AL中

366 ② 若目的串在存储器,则存储器地址必须由ES:DI确定; 若目的串在寄存器,则:
的指令系统 ② 若目的串在存储器,则存储器地址必须由ES:DI确定; 若目的串在寄存器,则: 字操作时,在AX中 字节操作时,在AL中

367 ③ 字符串操作指令CPU执行后,(SI)或(DI)会自动地修改,其修改方向受DF控制。
的指令系统 ③ 字符串操作指令CPU执行后,(SI)或(DI)会自动地修改,其修改方向受DF控制。 0时,会自动地增1或2 当DF= 1时,会自动地减1或2 受操作类型控制, 字节操作时,增/减1 字操作时,增/减2

368 在MOVS DST,SRC中,当DST和SRC同为字节类型时,等同于MOVSB指令;当DST和SRC同为字类型时,等同于MOVSW指令。
的指令系统 字符串操作指令有: 在MOVS DST,SRC中,当DST和SRC同为字节类型时,等同于MOVSB指令;当DST和SRC同为字类型时,等同于MOVSW指令。 DF=0时,地址增1 一、字符串传送指令 助记符格式 主要功能 MOVS DST , SRC MOVSB MOVSW (ES:DI ) ← (DS:SI) 字操作时: (SI)←(SI)±2 (DI)←(DI)±2 字节操作时:(SI)←(SI)±1 (DI)←(DI)±1 字节传送 字传送 隐含寻址 一次只能操作一个数

369 的指令系统 例如指令 MOVS VAR1,VAR2 并不是完成VAR1变量的内容传送到VAR2,而是将(DS:SI)中的内容传送到由(ES:DI)指定的位置,当VAR1和VAR2均为字节型变量时,该指令等同于MOVSB,当VAR1和VAR2均为字型变量时,该指令等同于MOVSW。

370 4. 8086的指令系统 LENG DW 10 DATA1 DW 10 DUP(?) DATA2 DW 20 DUP(?)
CLD ; 地址修正为增2 MOV AX , SEG DATA1 MOV DS, AX MOV ES, AX LEA SI, DATA1 LEA DI, DATA2 MOV CX, LENG MOVSW ; MOV DATA2, DATA1 LOOP AGAIN AGAIN:

371 的指令系统 说明: 字符串传送指令对PSW的标志位无影响。 字符串传送指令每次只能完成一个字和字节的传送,而实际应用中,经常需要将一块存储区域的内容整体搬移到另一个位置,为此,8086提供了重复前缀。

372 重复前缀放在字符串操作指令之前,重复次数由CX 决定
的指令系统 由于这类指令要对一组代码进行操作,希望能够成批处理数据,这需要字符串指令与重复前缀配合使用。 REP(Repeat string operation) REPZ/REPE(Repeat string operation while equal/ zero) REPNZ/REPNE(Repeat string operation while not equal/not zero) 重复前缀放在字符串操作指令之前,重复次数由CX 决定

373 4. 8086的指令系统 1. 重复前缀REP相当于LOOP指令 助记符格式 主要功能 REP MINST
当(CX)≠0时,重复执行MINST,(CX)-1→(CX); MINST STOSW STOSB MOVSW MOVSB

374 4. 8086的指令系统 当REP与MOVS指令配合时,有 REP MOVSB ;(ES:DI)←(DS:SI)(字节传送),
; (SI)←(SI)±1, (DI)←(DI)±1, ;(CX)←(CX)-1, (CX)≠0时重复执行, ; 即当(CX)=0时退出循环 REP MOVSW ;与REP MOVSB指令类似, ; 只是每次传送一个字 先执行再判断

375 4. 8086的指令系统 LENG DW 10 LENG DW 10 DATA1 DW 10 DUP(?)
CLD ; 地址修正为增2 MOV AX , SEG DATA1 MOV DS, AX MOV ES, AX LEA SI, DATA1 LEA DI, DATA2 MOV CX, LENG MOVSW ; LOOP AGAIN LENG DW 10 DATA1 DW DUP(?) DATA2 DW DUP(?) CLD ; 地址修正为增2 MOV AX , SEG DATA1 MOV DS, AX MOV ES, AX LEA SI, DATA1 LEA DI, DATA2 MOV CX, LENG REP MOVSW ; AGAIN:

376 4. 8086的指令系统 三、字符串比较指令 源-目的 助记符格式 主要功能 DF=0时,地址增1 CMPS DST , SRC CMPSB
CMPSW (DS:SI) - (ES:DI) 建立标志 字操作时:(SI)← (SI)±2 (DI) ← (DI)±2 字节操作时:(SI)← (SI)±1 (DI) ← (DI)±1 字节比较 字比较 用源减去目的,设置标志 源来自于DS:SI, 目的来自于ES:DI

377 的指令系统 指令CMPS与CMP类似,比较结果不进行保存,只是用于设置PSW中的标志位,但是,在字符串比较指令中,采用“源操作数”减去“目的操作数”,而在CMP指令中,采用“目的操作数”减去“源操作数”。因此,对比较结果的转移的条件是不同的: CMP DST,SRC CMPS DST, SRC JG ABC JG ABC 当(DST)>(SRC)时转ABC 当(DS:SI)>(ES:DI) 时转ABC 这一点应特别引起注意。

378 4. 8086的指令系统 字符串比较指令会正常影响PSW中的6个标志位。
CMPS指令经常与REPZ/REPE、REPNZ/REPNE配合使用,其含义有所不同。 1.REPZ CMPS 比较两字符串时,当遇到第一个不相同的字符时,就跳出比较循环(ZF=0)。 2.REPNZ CMPS 比较两字符串时,当遇到第一个相同的字符时,就跳出比较循环(ZF=1)。

379 4. 8086的指令系统 找不同 2.重复前缀REPZ/REPE相当于LOOPZ/LOOPE指令 助记符格式 主要功能
REPE/REPZ CINST 当(CX)≠0时,且ZF=1时,重复执行CINST, (CX)-1→(CX); CINST CMPS SCAS 找不同

380 4. 8086的指令系统 找相同 3.重复前缀REPNZ/REPNE相当于LOOPNZ/LOOPNE指令 助记符格式 主要功能
REPNE/REPNZ CINST 当(CX)≠0时,且ZF=0时,重复执行CINST, (CX)-1→(CX). CINST SCAS CMPS 找相同

381 的指令系统 例3.37 BUFFER1和BUFFER2为长度100的两个字型缓冲区,对比这两个缓冲区中的数据,如果 找到相同的字,则在ADDR中保存该数据在BUFFER1中的地址,如果找不到,则在ADDR中置0FFFFH。 解:设在数据段中已经定义好字型缓冲区BUFFER1、BUFFER2和字型变量ADDR,并将DS和ES都指向该数据段,则在代码段中编写下列程序: REPNZ

382 4. 8086的指令系统 LEA SI,BUFFER1 LEA DI,BUFFER2 MOV CX,100 CLD REPNZ CMPSW
JZ FOUND MOV ADDR,-1 JMP ELSE FOUND: SUB SI,2 MOV ADDR,SI ELSE:

383 四、字符串扫描指令 4. 8086的指令系统 助记符格式 主要功能 DF=0时,地址增1 SCAS DST SCASB SCASW
字扫描时: (AX) - (ES:DI) 建立标志 (DI) ← (DI)±2 字节扫描时: (AL) - (ES:DI) 建立标志 (DI) ← (DI±1) 用AX或AL减去目的,设置标志 目的来自于ES:DI

384 4. 8086的指令系统 说明: SCAS指令与CMPS指令类似,只是源操作数固定为AL或AX的内容。其它说明类似于字符串比较指令。
字符串扫描指令会正常影响PSW中的6个状态标志位,从而后续指令可以对比较结果进行判断与转移操作。因此SCAS指令经常与REPZ/REPE、REPNZ/REPNE配合使用,其含义有所不同。

385 的指令系统 1.REPZ SCAS 比较(AL)或(AX)的内容与目的字符串的内容,也就是在目的字符串中查找指定的字符(AL)或(AX),当找到第一个不相同的字符时,就跳出比较循环(ZF=0)。 2.REPNZ SCAS 比较(AL)或(AX)的内容与目的字符串的内容,也就是在目的字符串中查找指定的字符(AL)或(AX),当找到第一个相同的字符时,就跳出比较循环(ZF=1)。

386 的指令系统 例3.38 在字节型缓存区BUFFER中保存有20000个数据,要求在其中查找字符串“12345”(以ASCII码表示),并将其在BUFFER的偏移地址存放在ADDR单元中,如果没有找到,则将0FFFFH存放在ADDR中。 解:为了查找一串数据,首先应该在BUFFER中查找第一个数据,当找到后,再对后续的数据进行对比,如果恰好都相同,则表示找到了找到的字符串;如果有一个字符不相同,则应该回到刚才的位置继续查找第一个数据,这一点很重要,可以避免漏掉要查找的字符串。

387 的指令系统 例如在BUFFER中有这样的字符串:“112345”,就容易造成漏检,如图3.6所示,当找到第一个字符“1”时,DI指向位置“B”,接着与第二个字符“2”比较,发现两者不同,这时DI已经指向位置“C”,如果不恢复原来的地址进行搜索,则程序找不到第二个“1”,从而使该正确的字符串漏检。

388 4. 8086的指令系统 数据段的内容为: BUFFER DB 20000 dup(?) ADDR dw ?
STRING DB ‘12345’ 并使DS和ES都指向该数据段,则设计的程序为: MOV ADDR,-1 LEA DI,BUFFER MOV CX,20000 MOV AL,STRING ;取第一个字符 CLD

389 4. 8086的指令系统 STARTSEARCH: REPNZ SCASB ; JNZ NOFOUND LEA SI,STRING+1
PUSH CX ;保存搜索次数 PUSH DI ;保存搜索指针 MOV CX, ;比较后续字符 REPZ CMPSB POP DI ;恢复搜索指针 POP CX ;恢复搜索次数 JNZ STARTSEARCH FOUND: SUB DI, ;指针修正 MOV ADDR,DI NOFOUND: 查找第一个字符,本条指令结束的条件是cx=0,或 ZF=1

390 五、字符串装入指令 4. 8086的指令系统 助记符格式 主要功能 DF=0时,地址增1 LODS SRC LODSB LODSW
字操作时:(AX) ← (DS:SI) (SI)← (SI)±2 字节操作时:(AL) ← (DS:SI) (SI)← (SI)±1 下载或读出字符任务 将字符串里的内容(DS:SI)放入AX或AL

391 4. 8086的指令系统 字符串装入指令不影响FLAG。
每次执行都会从源数据区取一个值送到(AL)或(AX),重复操作意味着后面装人的内容将覆盖前面装人的内容,因此LODS指令很少与重复前缀配合使用。

392 4. 8086的指令系统 六、字符串存储指令 助记符格式 主要功能 STOS DST STOSB STOSW
字操作时:(ES:DI) ←AX (DI)← (DI)±2 字节操作时:(ES:DI) ← (AL) (DI)← (DI)±1 将字符存入字符串功能 将AX或AL里的内容放入字符串(ES:DI)

393 4. 8086的指令系统 字符串存储指令不影响FLAG。
每次执行都会将(AL)或(AX)的值存储到目的数据区中,重复操作意味着对整个数据区置入相同的值,因此STOS指令经常与RET前缀配合使用,表示将指定的数据区域进行清零或置入同一个初值。

394 解:设在数据段中已经定义好缓冲区BUFFER1和BUFFER2,并让ES执行该数据段,则可以设计汇编语言程序:
的指令系统 例3.39 对字型缓冲区BUFFER1(长度为200)进行清零,对字节型缓冲区BUFFER2(长度为256)置入初值55H。 解:设在数据段中已经定义好缓冲区BUFFER1和BUFFER2,并让ES执行该数据段,则可以设计汇编语言程序:

395 CLD LEA DI,BUFFER1 MOV CX,200 XOR AL,AL REP STOSW LEA DI,BUFFER2
的指令系统 CLD LEA DI,BUFFER1 MOV CX,200 XOR AL,AL REP STOSW LEA DI,BUFFER2 MOV CX,256 MOV AL,55H REP STOSB

396 Thank You !

397 教师:王晓甜 xtwang@mail.xidian.edu.cn
8086CPU 指令系统 教师:王晓甜

398 提纲 1. 汇编语言基本概念 2. 汇编语言指令分类 3.数据与转移地址的寻址方式 4.8086的指令系统 5. 总结

399 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令 4. 8086的指令系统 I/O输入输出指令
其它指令 宏指令

400 的指令系统 8086/8088CPU采用两个地址空间,即存储器地址空间和I/O端口地址空间,这就是说,访问存储器与访问I/O端口的指令是不同的,因此,我们不能采用MOV指令来访问I/O端口。 8086/8088CPU提供了访问I/O端口的专门指令,由于系统至多可以设计65536个端口寄存器,因此端口地址只需要用16位地址表示,这一点与存储器不同。

401 4. 8086的指令系统 一、端口输入指令IN(Input byte or word from port) 格式: IN DST, SRC
表示CPU从端口读取数据。DST用于指定存储读取数据的寄存器,这里只能取AL或AX寄存器,当从8位端口中读取一个字节时,采用AL寄存器;当从16位端口中读取一个字时,采用AX寄存器。SRC用于指定端口地址,它有两种寻址方式:(1)当端口地址可以用8位地址值表示时,SRC可以直接用地址值(port)表示,这时的寻址方式为直接寻址;(2)当端口地址不能用8位表示时,SRC取DX,即将端口地址存放在DX中,通过DX找到端口地址,这时的寻址方式为寄存器间接寻址。当然,对可以用8位地址表示的端口访问也可以采用寄存器间接寻址方式。

402 4. 8086的指令系统 二、端口输出指令(Output byte or word to port) 端口输出指令OUT的格式为
OUT DST, SRC 表示CPU将数据送给I/O端口。其说明类似与IN指令,只是SRC用于指定存储读取数据的寄存器,DST用于指定端口地址。

403 4. 8086的指令系统 表3.7列出了合法的输入输出指令,其中port表示8位的地址值。 操作类型 端口输入指令 端口输出指令 字节
IN AL, PORT OUT PORT, AL IN AX, PORT OUT PORT, AX IN AL, DX OUT DX, AL IN AX, DX OUT DX, AX

404 4. 8086的指令系统 其它指令 二、处理器控制指令(5条) 1.空操作指令NOP 格式: NOP
说明:空操作指令NOP(No operation)表示什么也不做,但要占用机器的三个时钟周期,利用NOP指令可以构成适当的延时操作。

405 的指令系统 2. 暂停指令HLT 格式: HLT 说明:暂停指令HLT(Halt until interrupt or reset)可以使CPU进入暂停状态,退出暂停状态的条件有: RESET信号有效,即CPU进行复位操作; NMI (非屏蔽中断请求)信号有效,即系统收到了非屏蔽的中断请求,这时系统必须进行适当的处理; INTR (可屏蔽中断请求)信号有效,而且IF=1,这时要求系统响应该指定请求。 适当的使用HLT指令,并与硬件电路配合,可以使CPU与外部设备协调工作。

406 4. 8086的指令系统 3.等待指令WAIT 格式: WAIT
说明:等待指令WAIT(Wait for pin active)可以使CPU处于等待状态,这时CPU会定期测试8086/8088芯片的TEST 引脚,当它为高电平时,则继续等待,并且每隔5个时钟周期对TEST线的状态进行测试,直到线上出现低电平时,CPU退出等待,并顺序执行下一条指令。

407 4. 8086的指令系统 4.总线锁定指令LOCK 格式: LOCK <其它指令>
说明:总线锁定指令LOCK(Lock bus during next instruction)可以保持总线的使用权,它放在其它指令之前,表示在执行这组指令期间,使别的设备不能使用外部总线。

408 4. 8086的指令系统 5.ESC 格式: ESC CODE,DATA
说明:换码指令ESC(Escape to external processor)可以完成多处理器之间的指令和数据交换,在8086/8088CPU与其它处理器配合使用时,利用该指令可以将任务分配给其它的处理器,CODE是一个事先规定的6位指令码,表示完成相应的操作,DATA表示要送给其它处理器的数据。

409 的指令系统 宏指令 宏指令是用户自己定义的指令,它是由指令和伪指令构成的一个程序段。用户要采用宏指令时,必须先定义后调用。宏指令是指用一个标识符(称为宏指令名)来表示指定的一段程序,在调用该宏指令时可以在程序汇编时展开成相应的程序段(这一过程称为宏展开)。因此宏指令在汇编时并没有相对应的指令代码,而只是类似于EQU定义的一个标识符。 可以将在程序中多次重复的程序段经过整理后定义成宏指令,从而使汇编语言的程序设计得到简化。

410 … … 宏指令 4. 8086的指令系统 宏指令名 MACRO<形式参数> ;宏定义开始伪指令 宏体(由指令语句组成的能
一、宏指令的定义 宏指令名 MACRO<形式参数> ;宏定义开始伪指令 宏体(由指令语句组成的能 完成某一特定功能的一段程序) … … ENDM ;宏定义结束伪指令 宏定义一般在伪指令段进行

411 宏指令 4. 8086的指令系统 <宏指令名>为一个标识符,即定义的宏指令的名称;
<形式参数>为宏体中使用的参数,它允许宏指令中具有待定的参数,在宏调用时必须用实际的参数代替它,因此每次宏指令调用时可以通过改变实际参数而改变宏指令的功能,使宏指令的设计更加灵活。 宏指令可有多个形式参数,它们之间以逗号间隔,但总长度不得超过132。调用时,实际参数的个数和类型必须与形式参数一致。 宏指令也可以不带任何形式参数。

412 4. 8086的指令系统 一、宏指令的定义 例3.41 设计对通用寄存器左移4位的宏指令。
例3.41 设计对通用寄存器左移4位的宏指令。 解:设形式参数REG表示任一个调用寄存器,则宏指令LSHIFT4定义为: LSHIFT4 MACRO REG MOV CL,4 SHL REG,CL ENDM 这样,在程序中,如果要对BX的内容左移4位,则可以直接采用: LSHIFT4 BX 如果要对DL的内容左移4位,则可以直接采用: LSHIFT4 DL

413 4. 8086的指令系统 一、宏指令的定义 例3.42 设计在显示器上显示出缓冲区中字符串的宏指令。
例3.42 设计在显示器上显示出缓冲区中字符串的宏指令。 解:为了显示出字符串,需要用到DOS功能调用INT 21H的09号功能,参见附录C。而且要求缓冲区中存放好以ASCII码表示的字符串,并以‘$’结尾。为设计具有调用性的宏指令,采用形式参数MESSAGE表示要显示缓冲区的首地址,则宏指令DISPMESSAGE可以定义为: DISPMESSAGE MACRO MESSGE LEA DX, MESSGE MOV AH, 09H INT 21H ENDM 这样,当要显示STRING中的字符串时,可以采用: DISPMESSAGE STRING

414 4. 8086的指令系统 一、宏指令的定义 例3.40 设计宏指令REGSAVE和REGRESTO分别实现保护和恢复所有通用寄存器。
解:在设计子程序和中断服务子程序时,经常需要在入口处对寄存器的内容进行保护,在出口处恢复寄存器的内容。

415 4. 8086的指令系统 一、宏指令的定义 REGSAVE MACRO REGRESTO MACRO PUSH AX POPF
PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP PUSHF ENDM 恢复寄存器的宏指令REGRESTO为: REGRESTO MACRO POPF POP BP POP DI POP SI POP DX POP CX POP BX POP AX ENDM

416 4. 8086的指令系统 例3.43 设计对通用寄存器的左移、右移N位的宏指令。 解:宏指令SHIFTN定义为:
SHIFTN MACRO N, REG, CC MOV CL, N S&CC REG, CL ENDM 这里REG表示任一个调用寄存器,N表示移位次数,CC表示移位方式: CC取HR时,表示采用SHR移位; CC取HL时,表示采用SHL移位; CC取AR时,表示采用SAR移位; CC取AL时,表示采用SAL移位; 符号 “&”为连接符,表示字符串CC与S直接连接。 宏的参数也可以出现在操作助记符中 在本例中实参只能用这些 EG : SHIFTN 3, BL, HL

417 宏指令 4. 8086的指令系统 二、宏调用与宏展开 宏调用的格式为: 宏指令名 <实际参数>
宏指令名 <实际参数> 应该注意,实际参数应该与宏指令定义时的形式参数一一对应。 在汇编过程中,当汇编到宏调用语句时,将用宏体中的一段程序来代替这一条宏指令,并且用实际参数取代形式参数。在汇编过程产生的LST(列表)文件中,可看到宏展开语句的前面有一个“+”号或其它符号,以表示与其它指令的区别。

418 4. 8086的指令系统 二、宏调用与宏展开 LSHRFT4 MOV BL, BUF MACRO REG MOV AL, BL
LSHRFT4 AL CALL CHANGE DISPM AL AND BL, 0FH MOV AH 4CH INT 21H PROC NEAR ; CMP AL,10 JNGE CHANG1; ADD AL,7 ; ‘A’~‘F’ CHANG1: ADD AL,30H; 将数字转换为ASCII码 RET CHANG ENDP ENDS END START MACRO REG MOV CL,4 SHR REG,CL ENDM MOV DL MOV AH, 02H INT 21H SEGMENT STACK DW 256 DUP(?) LABEL WORD ENDS SEGMENT BUF DB 7AH EDNS ASSUME CS:CODE, DS:DATA,ES:DATA,SS:STACK MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP DISPM STACK TOP CHANG STACK DATA DATA CODE START: CODE

419 宏指令 4. 8086的指令系统 三、宏指令中的标号与变量
当宏指令定义中出现标号和/或变量定义语句时,由于多次调用会出现相同的标号和/或变量的定义,从而导致汇编出错,因此,这时应该采用伪指令LOCAL将宏指令中的来标号和/或变量指定为局部标号或变量,这样在宏展开时,系统会自动将其中标号和/或变量赋以新的标识符,约定依次采用“??0000”、 “??0001”、 “??0002”等等。 局部标号或变量的定义格式为: LOCAL 标号或变量

420 宏指令 4. 8086的指令系统 例3.44 编写宏指令实现计算 的值。
例3.44 编写宏指令实现计算 的值。 解:设x为字型变量,则 的值会超出一个字的值,因此,采用(DX:AX)表示相乘的结果。宏指令MULPX定义为: MULPX MACRO N, X LOCAL L1, L2 XOR DX, DX MOV AX, X MOV CX, N JCXZ L2 L1: ADD AX, AX ADDC DX, DX LOOP L1 L2: ENDM 宏指令

421 宏指令 4. 8086的指令系统 这样,当要计算 的值时,有程序(设变量z为双字类型): MULPX 3,x
MOV WORD PTR z, AX MOV WORD PTR z+2, DX MULPX 5,y ADD WORD PTR z, AX ADDC WORD PTR z+2, DX

422 的指令系统 宏指令 四、重复宏 重复宏是一种伪指令,它指示汇编程序对指定的一组语句进行重复汇编,其结束语句也是ENDM。重复宏不一定出现在宏定义中,可以在程序的任意位置,但一旦出现在宏定义中,则必须先结束重复宏,然后再结束宏定义。 重复宏有3种格式:REPT(重复)、IRP(不定重复)和IRPC(不定字符重复)。

423 宏指令 4. 8086的指令系统 1.重复宏REPT 重复宏REPT(Repeat)的格式为: REPT <表达式>
;由指令和伪指令构成的重复内容 ENDM 根据给定的表达式计算出重复的次数,从而重复指定的程序段。当表达式的值不是整数时,进行取整运算。

424 宏指令 4. 8086的指令系统 REPT 200 X=(X+79) mod 256 DB X ENDM
例3.45 在数据段中定义字节型变量,其值为随机数,产生的数据满足: ,初值 。 解:这是一种产生随机数的简单方法,题目要求产生200个字节数据,其前5个数据为96、175、254、77、156,有一定的随机性,这种方法在实际应用中具有重要的作用。重复宏提供了产生随机数的便利手段,其重复宏可以表示成: X=17 REPT 200 X=(X+79) mod 256 DB X ENDM

425 宏指令 4. 8086的指令系统 2. 不定重复宏IRP 不定重复宏IRP(Indefinite Repeat)的格式为:
;由指令和伪指令构成的重复内容 ENDM 表示将尖括号内的各个参数依次赋给形式参数,并重复指定的程序段。

426 宏指令 4. 8086的指令系统 例3.46 设计重复宏完成上例前5个数据单元的定义。 解:采用不定重复宏的程序为
例3.46 设计重复宏完成上例前5个数据单元的定义。 解:采用不定重复宏的程序为 IRP X, <96,175,254,77,156> DB X ENDM 等效于: DB 96,175,254,77,156

427 的指令系统 宏指令 3. 不定字符重复宏IRPC 不定字符重复宏IRPC(Indefinite Repeat Character)的格式为: IRPC <形式参数>,<字符串> ;由指令和伪指令构成的重复内容 ENDM 表示将字符串中的各个字符依次赋给形式参数,并重复执行指定的程序段。

428 宏指令 4. 8086的指令系统 例3.47 不定字符重复宏IRPC示例。 解:设有不定字符重复宏: IRPC CC, AAB
ADD AX, CC&X ENDM 这等效于: ADD AX, AX ADD AX, BX

429 的指令系统 五、宏指令与子程序比较 宏指令是采用一个标识符来代替一段程序,它在汇编时要进行宏展开,对程序执行来说并没有增加额外的指令,因此执行速度快,但由于通过宏展开,使宏体在程序中多处出现,因此会占用较多的存储空间。 子程序也是一段功能独立的子程序,但它只出现一次,每次需要时,通过CALL指令进行调用,会额外引入子程序调用、子程序返回指令,因此会影响程序的执行速度。 宏指令

430 宏指令 4. 8086的指令系统 宏指令和子程序优缺点 优点 缺点 宏指令 1.执行速度快 2.设计灵活(可借助参数改变功能) 3.修改方便
占用内存多 子程序 占用内存少 1.执行速度慢 2.设计不太灵活

431 Thank You !


Download ppt "教师:王晓甜 xtwang@mail.xidian.edu.cn 8086CPU 指令系统 教师:王晓甜 xtwang@mail.xidian.edu.cn."

Similar presentations


Ads by Google