1
第 5章
指令系统
计算机教学实验中心
第二部分
2
三、逻辑运算和移位类
逻辑运算
移位操作
与
或
非
异或
非循环移位
循环移位
逻辑移位
算术移位
不带进位位的移位
带进位位的移位
3
1,逻辑运算
? 逻辑运算指令对操作数的要求大多与 MOV指
令相同。, 非, 运算指令要求操作数不能是立
即数;
? 除“非”运算指令外,其余指令的执行都会使
标志位 OF=CF=0
4
“与”指令
? 格式,AND OPRD1,OPRD2
? 操作,两操作数按位相, 与,,结果送目标
地
址
5
“与”指令的应用
? 实现两操作数相与的运算;
? 使目标操作数的某些位不变,某些位清零;
? 在操作数不变的情况下使 CF和 OF清零。
6
“与”指令的应用
? AND BL,[BX]
? AND AL,0FH
? AND AX,AX
7
“或”运算指令
? 格式,OR OPRD1,OPRD2
? 操作,两操作数按位相, 或,,结果送目
标
地址
8
“或”运算指令的应用
? 实现两操作数相“或”的运算;
? 使某些位不变,某些位置,1”
? 在不改变操作数的情况下使 OF=CF=0
9
应用程序例
OR AX,[DI]
OR CL,0FH
OR AX,AX
OR AL,AL
JPE GOON
OR AL,80H
GOON,….
偶校验转移
( PF=1)
将一个二
进制数 9变
为字符
‘ 9’
?
10
“非”运算指令
? 格式,NOT OPRD
? 操作:操作数按位取反再送回原地址
? 指令中的操作数不能是立即数
? 指令的执行对标志位无影响
? 例,NOT BYTE PTR[BX]
11
“异或”运算指令
? 格式,XOR OPRD1,OPRD2
? 操作,两操作数相, 异或,,结果送目标
地址
? 两操作数自身相异或,结果
XOR AX,AX
12
“测试”指令
? 格式,TEST OPRD1,OPRD2
? 操作,执行“与”运算,但运算的结果不
送回目标地址。
? 应用,常用于测试某些位的状态
13
“测试”指令例
? 从地址为 38F0H的端口中读入一个字节数,
如果该数的 bit1位为 1,则可从 38FEH端口
将 DATA为首地址的一个字输出,否则就不
能进行数据传送。
编写相应的程序段。
14
“测试”指令例
开 始
取待输出数的
偏移地址
读入状态字
测试 bit1位状态
Bit1=1?
取输入口地址
取输出口地址
输出一个字
N
Y
15
“测试”指令例
LEA SI,DATA
MOV DX,38F0H
WATT,IN AL,DX
TEST AL,02H
JZ WATT ; ZF=1转移
MOV DX,38FEH
MOV AX,[SI]
OUT DX,AX
16
2,移位指令
? 非循环移位指令
? 循环移位指令
? 注:
移动一位时由指令直接给出;移动两位及以上,
则移位次数由 CL指定。
17
非循环移位指令
? 逻辑左移
? 算术左移
? 逻辑右移
? 算术右移
18
算术左移和逻辑左移
? 格式:
SAL OPRD,1
SAL OPRD,CL
SHL OPRD,1
SHL OPRD,CL
有符号数
无符号数
逻辑
左移 移动一位后,若 CF与最高不相等,则 OF=1;否则 OF=0
19
逻辑右移
? 格式:
SHR OPRD,I
SHR OPRD,CL
0 CF
无符号数
的右移
移动一位后,若次高位与最高位不相等,则 OF=1;
否则 OF=0
20
算术右移
? 格式:
SAR OPRD,I
SAR OPRD,CL
有符号数
的右移
CF
21
非循环移位指令的应用
? 左移可实现乘法运算
? 右移可实现除法运算
见 教材 p198例
22
循环移位指令
不带进位位的循环移位
带进位位的循环移位
循环移位指令的格式、对操作数的要求与非循环移位指
令相同
左移 ROL
右移 ROR
左移 RCL
右移 RCR
23
不带进位位的循环移位
CF
CF
24
带进位位的循环移位
CF
CF
25
循环移位指令的应用
? 用于对某些位状态的测试;
? 高位部分和低位部分的交换;
? 与非循环移位指令一起组成 32位或更长字
长数的移位。
26
程序例
MOV SI,1000H
MOV DI,3000H
MOV CX,4
BBB,MOV AL,[SI]
MOV BL,AL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,BL
PUSH CX
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
INC SI
POP CX
DEC CX
JNZ BBB
HLT
程序
功能?
27
程序功能
? 将 1000H开始存放的
四个压缩 BCD码转换
为 ASCII码存放在
3000H开始的单元中
去。
┇
┇
12H
34H
56H
78H
┇
1000H
3000H
28
四、串操作指令
? 针对数据块或字符串的操作;
? 可实现存储器到存储器的数据传送;
? 待操作的数据串称为源串,目标地址称为
目标串。
29
串操作指令的特点
? 源串一般存放在数据段,偏移地址由 SI指定。
允许段重设;
? 目标串必须在附加段,偏移地址由 DI指定;
? 指令自动修改地址指针,修改方向由 DF决定。
DF=0 增地址方向; DF=1 减地址方
向;
? 数据块长度值由 CX指定;
? 可增加自动重复前缀以实现自动修改 CX内容。
30
串操作指令流程
取源串地址
取目标串地址
设串长度
传送一个字节或字
修改地址指针
修改串长度值
传送完否?
31
重复前缀
? REP 无条件重复
? REPE 相等重复
? REPZ 为零重复
? REPNE 不相等重复
? REPNZ 不为零重复
条件重复
CX≠0
ZF=1
CX≠0
ZF=0
CX≠0 重复
32
串操作指令
? 串传送 MOVS
? 串比较 CMPS
? 串扫描 SCAS
? 串装入 LODS
? 串送存 STOS
33
串传送指令
? 格式:
MOVS OPRD1,OPRD2
MOVSB
MOVSW
指令用于实现数据块的传送,常与无条件重复前缀连用。
34
串传送指令
? 对比用 MOV指令和 MOVS指令实现将 200
个字节数据从内存的一个区域送到另一个
区域的程序段。
35
串传送指令例
? 用串传送指令实现 200个字节数据的传送:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT
36
串比较指令
? 格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW
? 该指令用于两个数据块或两个字符串之间的比较;
? 常与条件重复前缀连用,指令的执行不改变操作数,
仅影响标志位。
37
串比较指令例
? 测试上例中 200个字节数据是否传送正确:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REPE CMPSB
JZ STOP
DEC SI
MOV AL,[SI]
MOV BX,SI
STOP,HLT
38
串扫描指令
? 格式:
SCAS OPRD
SCASB
SCASW
? 指令执行,AX(或 AL) - OPRD
? 该指令常用于在某个区域中寻找关键字。
目 标
操作数
39
串装入指令
? 格式:
LODS OPRD
LODSB
LODSW
? 操作,对字节,AL ([DS:SI])
对 字,AX ([DS:SI])
源操作数
40
串装入指令
? 用于将内存某个区域的数据串依次装入累加器,
以便显示或输出到接口。
? LODS指令一般不加重复前缀。
41
串送存指令
? 格式:
STOS OPRD
STOSB
STOSW
? 操作,对字节,AL ([ES:DI])
对 字,AX ([ES:DI])
目 标
操作数
42
串送存指令的应用
? 将内存某个区域清零
区域首地址送 ES,DI
串长度送 CX
置方向标志 DF
0送累加器 AL
执行串送存指令
开始
43
五、程序控制指令
? 转移指令
? 循环控制
? 过程调用
? 中断控制
44
1,转移指令
? 无条件 转移指令
无条件转移到目标地址,执行新的指令
? 有条件转移指令
在具备一定条件的情况下转移到目标地址
45
转移指令的转移原理
? 通过修改代码段寄存器 CS及指令指针 IP
的内容,使程序改变顺序执行的模式,转
到新的目标地址执行。
46
无条件转移指令
? 指令格式:
JMP OPRD
? 无条件转移的目标地址可以是在当前代码段,
也可在另一代码段
47
无条件转移指令
? 段内转移 ——目标地址与 JMP指令在同一代码段
? 转移方式:
直接转移 ——指令中直接给出转移的目标地址
间接转移 ——由指令中的寄存器或存储器间接给出转移
目标地址
48
无条件段内转移
? 直接转移:
JMP Lable
? 转移目标地址:
段基地址不变;
偏移地址 =当前 IP+位移量
JMP
Label
┇
┇
┇
代
码
段
位移量
近地址标号
49
无条件段内转移
? 间接转移:
JMP BX
JMP WORD PTR[BX]
JMP
┇
┇
┇
代
码
段
数
据
段
BX=1200
┇
XXH
XXH
IP
指令码
50
无条件段间转移
? 直接转移:
JMP FAR Lable
远地址标号
JMP
Label
┇
┇
┇
代
码
段
1
代
码
段
2
XXH
XXH
XXH
XXH
IP
CS
51
无条件段间转移
? 间接转移:
JMP DWORD PTR[BX]
XXH
XXH
XXH
XXH
[BX]
IP
CS
JMP
┇
┇
┇
┇
指令码
代
码
段
1
代
码
段
2
数
据
段
52
条件转移指令
? 在满足一定的条件下,程序转移到目标地址继
续执行;
? 在条件转移指令之前,应有一条为条件转移指
令的执行形成条件的指令(如对标志位产生影
响的指令);
? 条件转移指令均为段内短转移,即转移范围为:
-128------+127
p206
53
2,循环控制指令
? 控制程序在以当前 IP为中心的 -128~ +127范围
内循环执行;
? 循环次数由 CX寄存器指定。
循环指令
无条件循环指令 LOOP
条件循环指令 LOOPZ LOOPNZ
54
无条件循环指令
? 格式:
LOOP Lable
? 循环条件:
CX ≠ 0
? LOOP指令的操作相当于:
DEC CX
JNZ Lable
55
条件循环指令
? 格式:
LOOPZ Lable
LOOPE Lable
? 循环条件:
CX ≠ 0 ZF=1
? 格式:
LOOPZ Lable
LOOPE Lable
? 循环条件:
CX ≠ 0 ZF=1
56
3,过程调用和返回
段内调用
段间调用
段内直接调用
段内间接调用
段间直接调用
段间间接调用
57
调用指令与转移指令的比较
? 用于调用一个子过程;
? 调用前须保护断点地址;
? 子过程执行结束后要返回原调用处继续执行
原程序 ——断点恢复。
58
调用指令的执行过程
? 将调用指令的下一条指令的地址(断点)压入
堆栈;
? 获取子过程的入口地址(子过程第 1条指令的
偏移地址);
? (执行子过程,含相应参数的保存及恢复);
? 将断点偏移地址由堆栈弹出,返回原程序。
59
段内调用
? 子过程与原调用程序在同一代码段,在调
用之前只需保护断点的偏移地址
? 格式:
CALL NEAR PROC
近过程名
断点
入口
地址
60
段内调用例
? CALL TIMRE
? CALL WORD PTR[SI]
直接调用
间接调用
61
段间调用
? 子过程与原调用程序不在同一代码段,在调
用之前需保护断点的段基地址和偏移地址。
? 断点地址的保护是先将断点的 CS压栈,再将
IP压入堆栈。
? 指令格式:
CALL FAR PROC
62
段间调用例
? CALL FAR TIMRE
? CALL DWORD PTR[SI]
63
返回指令
? 从堆栈中弹出断点地址,返回原程序。
? 格式:
RET
? RET指令一般位于子程序的最后。
64
4,中断指令
中断与过程调用:
? 中断是随机事件或异常事件引起,调用则是事
先已在程序中安排好 ;
? 响应中断请求不仅要保护断点地址,还要保护
FLAGS内容;
? 调用指令在指令中直接给出子程序入口地址,
中断指令只给出中断向量码,入口地址则在向
量码指向的内存单元中。
65
中断指令
? 格式:
INT n
? 说明:
nх4 =存放中
断服务子程序
入口地址的单
元地址
中断类型码
n=0 ? 255
n х4 XXH
XXH
XXH
XXH
入口偏移地址 IP
入口段地址 CS
66
中断指令
操作:
? 将 FLAGS压入堆栈;
? 将 INT指令下一条指令的 CS,IP压栈;
? 取中断服务程序入口地址。
67
中断指令例
? INT 21H
IPL
IPH
CSL
CSH
SP=1200
FLAGSL
FLAGSH
SP=11FA
执行INT指
令后
保护断点
68
中断指令例
? 执行 INT 21H指令后
IP=?
CS=? 21Hх4
=0084H 23H
11H
00H
20H
IP
CS
69
溢出中断指令
? 格式:
INTO
? 若 OF=1,则启动一个类型为 4的中断过程,给出
一个出错标志,如果 OF=0,不做任何操作。
? INTO指令通常安排在有符号数加减运算指令之
后。
相当于 INT 4
70
中断返回指令
? 格式:
IRET
? 中断服务程序的最后一条指令,负责
恢复断点
恢复标志寄存器内容
71
六、处理器控制指令
对标志位的操作
与外部设备的同步
p213表 5-7
72
§ 5.4 汇编语言源程序
掌握:
? 汇编语言与汇编程序的概念;
? 汇编语言程序设计过程;
? 汇编语言源程序的结构框架;
? 常用伪指令及基本 DOS功能模块的应用。
73
一,80X86新增指令特点:
? 增加对 32位字长操作的指令;
? 加强各类指令功能;
? 增加了高级语言、控制保护,Cache 管理
等指令。
74
二、汇编语言及汇编程序
? 计算机语言:
机器语言
汇编语言
高级语言
面向机器
的语言
机器语言 汇编语言 高级语言
75
汇编语言及汇编程序
? 汇编语言源程序 用助记符编写的程序
源程序的编译程序
汇编程序汇编语言源程序 机器语言目标程序
76
汇编语言程序设计与执行过程
? 输入汇编语言源程序 源文件,ASM
? 汇编(编译) 目标文件,OBJ
? 链接 可执行文件,EXE
? 调试 最终程序
77
汇编语言的语句格式
? 指令性语句 ——由 CPU执行的指令
? 语句格式:
[标号,] [前缀 ] 助记符 [操作数 ],[操作数 ] [ ;注释 ]
指令的符号地址,
标号后要有冒号 操作码 注释前加分号
78
汇编语言的语句格式
? 指示性语句,
CPU不执行的指令,不生成目标代码;
由汇编程序执行,用于分配内存空间、定义变量、指
示程序开始和结束等。
? 指令格式:
[名字 ] 伪指令助记符 操作数 [,操作数,… ] [ ;注释 ]
变量的符号地址
其后不加冒号
指示性语句中至少有一个操作数
79
操作数
? 常量 —— 数值或字符、字符串
? 寄存器
? 存储器单元
? 变量或标号
? 表达式 —— 可包括各种运算符
80
变量
? 代表内存中的数据区,程序中视为存储器
操作数
? 变量的属性:
段 值 —— 变量所在段的段地址
偏移量 —— 变量单元地址与段首地址之
间的位移量 。
类 型 —— 字节型, 字型和双字型
81
三、基本伪指令
? 数据定义伪指令
? 符号定义伪指令
? 段定义伪指令
? 设定段寄存器伪指令
? 结束伪指令
? *过程定义伪指令
? *宏命令伪指令
82
数据定义伪指令
? 用于定义数据区中变量的类型
? 格式:
[变量名 ] 伪指令助记符 操作数,[… ] [ ;注释 ]
83
数据定义伪指令
伪指令助记符
? DB 定义的变量为字节型
? DW 定义的变量为字类型(双字节)
? DD 定义的变量为双字型( 4字节)
? DQ 定义的变量为 4字型( 8字节)
? DT 定义的变量为 10字节型
84
数据定义伪指令
? DATA1 DB 11H,22H,33H,44H
? DATA2 DW 11H,22H,3344H
? DATA3 DD 11H*2,22H,33445566H
考虑以上变量在内
存中的存放形式
85
数据定义伪指令
? 伪指令的性质决定所定义变量的属性;
? 定义字符串必须用 DB伪指令
? 例:
DATA1 DB ‘ABCD’,66H ‘A’‘B’
‘C’
‘D’
41H
42H
43H
44H
66H
86
重复操作符
? 为一个数据区的各单元设置相同的初值
? 格式:
[变量名 ] 伪指令助记符 n DUP(初值,… )
? 例:
BW 20 DUP( 0)
DB 3 DUP( 22H,11H,?)
随机数
87
符号定义伪指令
? 格式:
符号名 EQU 表达式
? 操作:
用符号名取代后边的表达式,不可重新定义
? 例:
CONSTANT EQU 100
VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
88
段定义伪指令
? 说明逻辑段的起始和结束;
? 说明不同程序模块中同类逻辑段之间的
联系形态
89
段定义伪指令
段名 SEGMENT [定位类型 ] [组合类型 ] [’类别 ’]
┇
段名 ENDS
说明逻辑
段的起点
说明不同模块
中同名段的组
和连接方式
90
段定义伪指令例
DATA SEGMENT
MEM1 DB 11H,22H
MEM2 DW 1234H
DATA ENDS
91
设定段寄存器伪指令
? 说明所定义逻辑段的性质
? 格式
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
92
结束伪指令
? 表示源程序结束
? 格式:
END [标号 ]
93
一个完整源程序结构例
DSEG SEGMENT
DATA1 DB 1,2,
DATA2 DW 1234H
DSEG ENDS
ESEG SEGMENT
DB 20 DUP(?)
ESEG ENDS
SSEG SEGMENT
DB 200 DUP(?)
SSEG ENDS
94
一个完整源程序结构例
CSEG SEGMENT
ASSUME CS,CSEG,DS,DSEG,
ES,ESEG,SS,SSEG
START,MOV AX,DSEG
MOV DS,AX
MOV AX,ESEG
MOV ES,AX
MOV AX,SSEG
MOV SS,AX
┇
CSEG ENDS
END START
源程序
代码
95
过程定义伪指令
? 用于定义一个过程体
? 格式:
过程名 PROC [ NEAR / FAR ]
┇
RET
过程名 ENDP
过程入口的符号地址
96
宏命令伪指令
? 宏命令 ——源程序中由汇编程序识别的具有
独立功能的一段程序代码
? 格式:
宏命令名 MACRO <形式参数 >
┇
┇
ENDM 宏体
97
四,DOS功能模块
? 用 INT 21H 软中断指令,可调用包含多
个子功能的功能包;
? 各子功能采用功能号来区分;
? 功能包括,设备管理,目录 管理, 文件管
理 等 。
98
DOS功能模块调用格式
? 调用格式:
MOV AH,功能号
<置相应参数 >
INT 21H
99
常用子功能
? 从键盘输入单字符并显示;
? 从键盘输入字符串并显示;
? 在屏幕上显示单字符;
? 在屏幕上显示字符串。
100
从键盘输入单字符并显示
? 调用方法:
MOV AH,01
INT 21H
? 输入的字符在 AL中
101
单字符输入例
GET_KEY,MOV AH,1
INT 21H
CMP AL,’Y’
JZ YES
CMP AL,’N’
JZ NO
JNZ GET_KEY
YES,┇
NO,┇
交互式应
答程序
102
从键盘输入字符串
? AH 功能号 OAH
? DS,DX 字符串在内存中的存放地址
? INT 21H
103
定义字符缓冲区
? 用户自定义缓冲区格式:
0DHN1 N2
整个缓冲区
最大键入字符数
实际键入字符数
104
输入字符串程序段
? DAT1 DB 20,?,20 DUP(?)
? LEA DX,DAT1
MOV AH,0AH
INT 21H
105
输入缓冲区
14H
?
20个字节
定义后的输入缓
冲区初始状态:
106
单字符显示输出
? AH 功能号 O2H
? DL 待输出字符
? INT 21H
107
单字符显示输出例
? MOV AH,02
? MOV DL,41H
? INT 21H
执行结果:屏幕显示字符 ‘ A’
108
字符串输出显示
? AH 功能号 O9H
? DS,DX 待输出字符串的偏移地址
? INT 21H
109
字符串输出显示例
DATA SEGMENT
MESS1 DB ‘Input String:’ 0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
┇
MOV AH,09
MOV DX,OFFSET MESS1
INT 21H
┇
被显示的
字符串必
须以‘ $’结
束
110
结束语
? 了解指令性语句及指示性语句的格式;
? 了解操作数的类型及变量的属性;
? 掌握 8086CPU指令系统的寻址方式;
? 掌握 8086CPU指令系统 6大类指令的功能;
? 掌握基本伪指令及主要 DOS功能模块的应用;
? 掌握汇编语言源程序的结构框架;
? 理解汇编语言程序设计的一般过程;
? 具备编写简单汇编语言源程序的能力。
111
作业:
? 5.2
? 5.4
? 5.7
? 5.8
? 5.9
? 5.11
? 5.15
? 5.16
? 5.19
第 5章
指令系统
计算机教学实验中心
第二部分
2
三、逻辑运算和移位类
逻辑运算
移位操作
与
或
非
异或
非循环移位
循环移位
逻辑移位
算术移位
不带进位位的移位
带进位位的移位
3
1,逻辑运算
? 逻辑运算指令对操作数的要求大多与 MOV指
令相同。, 非, 运算指令要求操作数不能是立
即数;
? 除“非”运算指令外,其余指令的执行都会使
标志位 OF=CF=0
4
“与”指令
? 格式,AND OPRD1,OPRD2
? 操作,两操作数按位相, 与,,结果送目标
地
址
5
“与”指令的应用
? 实现两操作数相与的运算;
? 使目标操作数的某些位不变,某些位清零;
? 在操作数不变的情况下使 CF和 OF清零。
6
“与”指令的应用
? AND BL,[BX]
? AND AL,0FH
? AND AX,AX
7
“或”运算指令
? 格式,OR OPRD1,OPRD2
? 操作,两操作数按位相, 或,,结果送目
标
地址
8
“或”运算指令的应用
? 实现两操作数相“或”的运算;
? 使某些位不变,某些位置,1”
? 在不改变操作数的情况下使 OF=CF=0
9
应用程序例
OR AX,[DI]
OR CL,0FH
OR AX,AX
OR AL,AL
JPE GOON
OR AL,80H
GOON,….
偶校验转移
( PF=1)
将一个二
进制数 9变
为字符
‘ 9’
?
10
“非”运算指令
? 格式,NOT OPRD
? 操作:操作数按位取反再送回原地址
? 指令中的操作数不能是立即数
? 指令的执行对标志位无影响
? 例,NOT BYTE PTR[BX]
11
“异或”运算指令
? 格式,XOR OPRD1,OPRD2
? 操作,两操作数相, 异或,,结果送目标
地址
? 两操作数自身相异或,结果
XOR AX,AX
12
“测试”指令
? 格式,TEST OPRD1,OPRD2
? 操作,执行“与”运算,但运算的结果不
送回目标地址。
? 应用,常用于测试某些位的状态
13
“测试”指令例
? 从地址为 38F0H的端口中读入一个字节数,
如果该数的 bit1位为 1,则可从 38FEH端口
将 DATA为首地址的一个字输出,否则就不
能进行数据传送。
编写相应的程序段。
14
“测试”指令例
开 始
取待输出数的
偏移地址
读入状态字
测试 bit1位状态
Bit1=1?
取输入口地址
取输出口地址
输出一个字
N
Y
15
“测试”指令例
LEA SI,DATA
MOV DX,38F0H
WATT,IN AL,DX
TEST AL,02H
JZ WATT ; ZF=1转移
MOV DX,38FEH
MOV AX,[SI]
OUT DX,AX
16
2,移位指令
? 非循环移位指令
? 循环移位指令
? 注:
移动一位时由指令直接给出;移动两位及以上,
则移位次数由 CL指定。
17
非循环移位指令
? 逻辑左移
? 算术左移
? 逻辑右移
? 算术右移
18
算术左移和逻辑左移
? 格式:
SAL OPRD,1
SAL OPRD,CL
SHL OPRD,1
SHL OPRD,CL
有符号数
无符号数
逻辑
左移 移动一位后,若 CF与最高不相等,则 OF=1;否则 OF=0
19
逻辑右移
? 格式:
SHR OPRD,I
SHR OPRD,CL
0 CF
无符号数
的右移
移动一位后,若次高位与最高位不相等,则 OF=1;
否则 OF=0
20
算术右移
? 格式:
SAR OPRD,I
SAR OPRD,CL
有符号数
的右移
CF
21
非循环移位指令的应用
? 左移可实现乘法运算
? 右移可实现除法运算
见 教材 p198例
22
循环移位指令
不带进位位的循环移位
带进位位的循环移位
循环移位指令的格式、对操作数的要求与非循环移位指
令相同
左移 ROL
右移 ROR
左移 RCL
右移 RCR
23
不带进位位的循环移位
CF
CF
24
带进位位的循环移位
CF
CF
25
循环移位指令的应用
? 用于对某些位状态的测试;
? 高位部分和低位部分的交换;
? 与非循环移位指令一起组成 32位或更长字
长数的移位。
26
程序例
MOV SI,1000H
MOV DI,3000H
MOV CX,4
BBB,MOV AL,[SI]
MOV BL,AL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,BL
PUSH CX
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
INC SI
POP CX
DEC CX
JNZ BBB
HLT
程序
功能?
27
程序功能
? 将 1000H开始存放的
四个压缩 BCD码转换
为 ASCII码存放在
3000H开始的单元中
去。
┇
┇
12H
34H
56H
78H
┇
1000H
3000H
28
四、串操作指令
? 针对数据块或字符串的操作;
? 可实现存储器到存储器的数据传送;
? 待操作的数据串称为源串,目标地址称为
目标串。
29
串操作指令的特点
? 源串一般存放在数据段,偏移地址由 SI指定。
允许段重设;
? 目标串必须在附加段,偏移地址由 DI指定;
? 指令自动修改地址指针,修改方向由 DF决定。
DF=0 增地址方向; DF=1 减地址方
向;
? 数据块长度值由 CX指定;
? 可增加自动重复前缀以实现自动修改 CX内容。
30
串操作指令流程
取源串地址
取目标串地址
设串长度
传送一个字节或字
修改地址指针
修改串长度值
传送完否?
31
重复前缀
? REP 无条件重复
? REPE 相等重复
? REPZ 为零重复
? REPNE 不相等重复
? REPNZ 不为零重复
条件重复
CX≠0
ZF=1
CX≠0
ZF=0
CX≠0 重复
32
串操作指令
? 串传送 MOVS
? 串比较 CMPS
? 串扫描 SCAS
? 串装入 LODS
? 串送存 STOS
33
串传送指令
? 格式:
MOVS OPRD1,OPRD2
MOVSB
MOVSW
指令用于实现数据块的传送,常与无条件重复前缀连用。
34
串传送指令
? 对比用 MOV指令和 MOVS指令实现将 200
个字节数据从内存的一个区域送到另一个
区域的程序段。
35
串传送指令例
? 用串传送指令实现 200个字节数据的传送:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT
36
串比较指令
? 格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW
? 该指令用于两个数据块或两个字符串之间的比较;
? 常与条件重复前缀连用,指令的执行不改变操作数,
仅影响标志位。
37
串比较指令例
? 测试上例中 200个字节数据是否传送正确:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REPE CMPSB
JZ STOP
DEC SI
MOV AL,[SI]
MOV BX,SI
STOP,HLT
38
串扫描指令
? 格式:
SCAS OPRD
SCASB
SCASW
? 指令执行,AX(或 AL) - OPRD
? 该指令常用于在某个区域中寻找关键字。
目 标
操作数
39
串装入指令
? 格式:
LODS OPRD
LODSB
LODSW
? 操作,对字节,AL ([DS:SI])
对 字,AX ([DS:SI])
源操作数
40
串装入指令
? 用于将内存某个区域的数据串依次装入累加器,
以便显示或输出到接口。
? LODS指令一般不加重复前缀。
41
串送存指令
? 格式:
STOS OPRD
STOSB
STOSW
? 操作,对字节,AL ([ES:DI])
对 字,AX ([ES:DI])
目 标
操作数
42
串送存指令的应用
? 将内存某个区域清零
区域首地址送 ES,DI
串长度送 CX
置方向标志 DF
0送累加器 AL
执行串送存指令
开始
43
五、程序控制指令
? 转移指令
? 循环控制
? 过程调用
? 中断控制
44
1,转移指令
? 无条件 转移指令
无条件转移到目标地址,执行新的指令
? 有条件转移指令
在具备一定条件的情况下转移到目标地址
45
转移指令的转移原理
? 通过修改代码段寄存器 CS及指令指针 IP
的内容,使程序改变顺序执行的模式,转
到新的目标地址执行。
46
无条件转移指令
? 指令格式:
JMP OPRD
? 无条件转移的目标地址可以是在当前代码段,
也可在另一代码段
47
无条件转移指令
? 段内转移 ——目标地址与 JMP指令在同一代码段
? 转移方式:
直接转移 ——指令中直接给出转移的目标地址
间接转移 ——由指令中的寄存器或存储器间接给出转移
目标地址
48
无条件段内转移
? 直接转移:
JMP Lable
? 转移目标地址:
段基地址不变;
偏移地址 =当前 IP+位移量
JMP
Label
┇
┇
┇
代
码
段
位移量
近地址标号
49
无条件段内转移
? 间接转移:
JMP BX
JMP WORD PTR[BX]
JMP
┇
┇
┇
代
码
段
数
据
段
BX=1200
┇
XXH
XXH
IP
指令码
50
无条件段间转移
? 直接转移:
JMP FAR Lable
远地址标号
JMP
Label
┇
┇
┇
代
码
段
1
代
码
段
2
XXH
XXH
XXH
XXH
IP
CS
51
无条件段间转移
? 间接转移:
JMP DWORD PTR[BX]
XXH
XXH
XXH
XXH
[BX]
IP
CS
JMP
┇
┇
┇
┇
指令码
代
码
段
1
代
码
段
2
数
据
段
52
条件转移指令
? 在满足一定的条件下,程序转移到目标地址继
续执行;
? 在条件转移指令之前,应有一条为条件转移指
令的执行形成条件的指令(如对标志位产生影
响的指令);
? 条件转移指令均为段内短转移,即转移范围为:
-128------+127
p206
53
2,循环控制指令
? 控制程序在以当前 IP为中心的 -128~ +127范围
内循环执行;
? 循环次数由 CX寄存器指定。
循环指令
无条件循环指令 LOOP
条件循环指令 LOOPZ LOOPNZ
54
无条件循环指令
? 格式:
LOOP Lable
? 循环条件:
CX ≠ 0
? LOOP指令的操作相当于:
DEC CX
JNZ Lable
55
条件循环指令
? 格式:
LOOPZ Lable
LOOPE Lable
? 循环条件:
CX ≠ 0 ZF=1
? 格式:
LOOPZ Lable
LOOPE Lable
? 循环条件:
CX ≠ 0 ZF=1
56
3,过程调用和返回
段内调用
段间调用
段内直接调用
段内间接调用
段间直接调用
段间间接调用
57
调用指令与转移指令的比较
? 用于调用一个子过程;
? 调用前须保护断点地址;
? 子过程执行结束后要返回原调用处继续执行
原程序 ——断点恢复。
58
调用指令的执行过程
? 将调用指令的下一条指令的地址(断点)压入
堆栈;
? 获取子过程的入口地址(子过程第 1条指令的
偏移地址);
? (执行子过程,含相应参数的保存及恢复);
? 将断点偏移地址由堆栈弹出,返回原程序。
59
段内调用
? 子过程与原调用程序在同一代码段,在调
用之前只需保护断点的偏移地址
? 格式:
CALL NEAR PROC
近过程名
断点
入口
地址
60
段内调用例
? CALL TIMRE
? CALL WORD PTR[SI]
直接调用
间接调用
61
段间调用
? 子过程与原调用程序不在同一代码段,在调
用之前需保护断点的段基地址和偏移地址。
? 断点地址的保护是先将断点的 CS压栈,再将
IP压入堆栈。
? 指令格式:
CALL FAR PROC
62
段间调用例
? CALL FAR TIMRE
? CALL DWORD PTR[SI]
63
返回指令
? 从堆栈中弹出断点地址,返回原程序。
? 格式:
RET
? RET指令一般位于子程序的最后。
64
4,中断指令
中断与过程调用:
? 中断是随机事件或异常事件引起,调用则是事
先已在程序中安排好 ;
? 响应中断请求不仅要保护断点地址,还要保护
FLAGS内容;
? 调用指令在指令中直接给出子程序入口地址,
中断指令只给出中断向量码,入口地址则在向
量码指向的内存单元中。
65
中断指令
? 格式:
INT n
? 说明:
nх4 =存放中
断服务子程序
入口地址的单
元地址
中断类型码
n=0 ? 255
n х4 XXH
XXH
XXH
XXH
入口偏移地址 IP
入口段地址 CS
66
中断指令
操作:
? 将 FLAGS压入堆栈;
? 将 INT指令下一条指令的 CS,IP压栈;
? 取中断服务程序入口地址。
67
中断指令例
? INT 21H
IPL
IPH
CSL
CSH
SP=1200
FLAGSL
FLAGSH
SP=11FA
执行INT指
令后
保护断点
68
中断指令例
? 执行 INT 21H指令后
IP=?
CS=? 21Hх4
=0084H 23H
11H
00H
20H
IP
CS
69
溢出中断指令
? 格式:
INTO
? 若 OF=1,则启动一个类型为 4的中断过程,给出
一个出错标志,如果 OF=0,不做任何操作。
? INTO指令通常安排在有符号数加减运算指令之
后。
相当于 INT 4
70
中断返回指令
? 格式:
IRET
? 中断服务程序的最后一条指令,负责
恢复断点
恢复标志寄存器内容
71
六、处理器控制指令
对标志位的操作
与外部设备的同步
p213表 5-7
72
§ 5.4 汇编语言源程序
掌握:
? 汇编语言与汇编程序的概念;
? 汇编语言程序设计过程;
? 汇编语言源程序的结构框架;
? 常用伪指令及基本 DOS功能模块的应用。
73
一,80X86新增指令特点:
? 增加对 32位字长操作的指令;
? 加强各类指令功能;
? 增加了高级语言、控制保护,Cache 管理
等指令。
74
二、汇编语言及汇编程序
? 计算机语言:
机器语言
汇编语言
高级语言
面向机器
的语言
机器语言 汇编语言 高级语言
75
汇编语言及汇编程序
? 汇编语言源程序 用助记符编写的程序
源程序的编译程序
汇编程序汇编语言源程序 机器语言目标程序
76
汇编语言程序设计与执行过程
? 输入汇编语言源程序 源文件,ASM
? 汇编(编译) 目标文件,OBJ
? 链接 可执行文件,EXE
? 调试 最终程序
77
汇编语言的语句格式
? 指令性语句 ——由 CPU执行的指令
? 语句格式:
[标号,] [前缀 ] 助记符 [操作数 ],[操作数 ] [ ;注释 ]
指令的符号地址,
标号后要有冒号 操作码 注释前加分号
78
汇编语言的语句格式
? 指示性语句,
CPU不执行的指令,不生成目标代码;
由汇编程序执行,用于分配内存空间、定义变量、指
示程序开始和结束等。
? 指令格式:
[名字 ] 伪指令助记符 操作数 [,操作数,… ] [ ;注释 ]
变量的符号地址
其后不加冒号
指示性语句中至少有一个操作数
79
操作数
? 常量 —— 数值或字符、字符串
? 寄存器
? 存储器单元
? 变量或标号
? 表达式 —— 可包括各种运算符
80
变量
? 代表内存中的数据区,程序中视为存储器
操作数
? 变量的属性:
段 值 —— 变量所在段的段地址
偏移量 —— 变量单元地址与段首地址之
间的位移量 。
类 型 —— 字节型, 字型和双字型
81
三、基本伪指令
? 数据定义伪指令
? 符号定义伪指令
? 段定义伪指令
? 设定段寄存器伪指令
? 结束伪指令
? *过程定义伪指令
? *宏命令伪指令
82
数据定义伪指令
? 用于定义数据区中变量的类型
? 格式:
[变量名 ] 伪指令助记符 操作数,[… ] [ ;注释 ]
83
数据定义伪指令
伪指令助记符
? DB 定义的变量为字节型
? DW 定义的变量为字类型(双字节)
? DD 定义的变量为双字型( 4字节)
? DQ 定义的变量为 4字型( 8字节)
? DT 定义的变量为 10字节型
84
数据定义伪指令
? DATA1 DB 11H,22H,33H,44H
? DATA2 DW 11H,22H,3344H
? DATA3 DD 11H*2,22H,33445566H
考虑以上变量在内
存中的存放形式
85
数据定义伪指令
? 伪指令的性质决定所定义变量的属性;
? 定义字符串必须用 DB伪指令
? 例:
DATA1 DB ‘ABCD’,66H ‘A’‘B’
‘C’
‘D’
41H
42H
43H
44H
66H
86
重复操作符
? 为一个数据区的各单元设置相同的初值
? 格式:
[变量名 ] 伪指令助记符 n DUP(初值,… )
? 例:
BW 20 DUP( 0)
DB 3 DUP( 22H,11H,?)
随机数
87
符号定义伪指令
? 格式:
符号名 EQU 表达式
? 操作:
用符号名取代后边的表达式,不可重新定义
? 例:
CONSTANT EQU 100
VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
88
段定义伪指令
? 说明逻辑段的起始和结束;
? 说明不同程序模块中同类逻辑段之间的
联系形态
89
段定义伪指令
段名 SEGMENT [定位类型 ] [组合类型 ] [’类别 ’]
┇
段名 ENDS
说明逻辑
段的起点
说明不同模块
中同名段的组
和连接方式
90
段定义伪指令例
DATA SEGMENT
MEM1 DB 11H,22H
MEM2 DW 1234H
DATA ENDS
91
设定段寄存器伪指令
? 说明所定义逻辑段的性质
? 格式
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
92
结束伪指令
? 表示源程序结束
? 格式:
END [标号 ]
93
一个完整源程序结构例
DSEG SEGMENT
DATA1 DB 1,2,
DATA2 DW 1234H
DSEG ENDS
ESEG SEGMENT
DB 20 DUP(?)
ESEG ENDS
SSEG SEGMENT
DB 200 DUP(?)
SSEG ENDS
94
一个完整源程序结构例
CSEG SEGMENT
ASSUME CS,CSEG,DS,DSEG,
ES,ESEG,SS,SSEG
START,MOV AX,DSEG
MOV DS,AX
MOV AX,ESEG
MOV ES,AX
MOV AX,SSEG
MOV SS,AX
┇
CSEG ENDS
END START
源程序
代码
95
过程定义伪指令
? 用于定义一个过程体
? 格式:
过程名 PROC [ NEAR / FAR ]
┇
RET
过程名 ENDP
过程入口的符号地址
96
宏命令伪指令
? 宏命令 ——源程序中由汇编程序识别的具有
独立功能的一段程序代码
? 格式:
宏命令名 MACRO <形式参数 >
┇
┇
ENDM 宏体
97
四,DOS功能模块
? 用 INT 21H 软中断指令,可调用包含多
个子功能的功能包;
? 各子功能采用功能号来区分;
? 功能包括,设备管理,目录 管理, 文件管
理 等 。
98
DOS功能模块调用格式
? 调用格式:
MOV AH,功能号
<置相应参数 >
INT 21H
99
常用子功能
? 从键盘输入单字符并显示;
? 从键盘输入字符串并显示;
? 在屏幕上显示单字符;
? 在屏幕上显示字符串。
100
从键盘输入单字符并显示
? 调用方法:
MOV AH,01
INT 21H
? 输入的字符在 AL中
101
单字符输入例
GET_KEY,MOV AH,1
INT 21H
CMP AL,’Y’
JZ YES
CMP AL,’N’
JZ NO
JNZ GET_KEY
YES,┇
NO,┇
交互式应
答程序
102
从键盘输入字符串
? AH 功能号 OAH
? DS,DX 字符串在内存中的存放地址
? INT 21H
103
定义字符缓冲区
? 用户自定义缓冲区格式:
0DHN1 N2
整个缓冲区
最大键入字符数
实际键入字符数
104
输入字符串程序段
? DAT1 DB 20,?,20 DUP(?)
? LEA DX,DAT1
MOV AH,0AH
INT 21H
105
输入缓冲区
14H
?
20个字节
定义后的输入缓
冲区初始状态:
106
单字符显示输出
? AH 功能号 O2H
? DL 待输出字符
? INT 21H
107
单字符显示输出例
? MOV AH,02
? MOV DL,41H
? INT 21H
执行结果:屏幕显示字符 ‘ A’
108
字符串输出显示
? AH 功能号 O9H
? DS,DX 待输出字符串的偏移地址
? INT 21H
109
字符串输出显示例
DATA SEGMENT
MESS1 DB ‘Input String:’ 0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
┇
MOV AH,09
MOV DX,OFFSET MESS1
INT 21H
┇
被显示的
字符串必
须以‘ $’结
束
110
结束语
? 了解指令性语句及指示性语句的格式;
? 了解操作数的类型及变量的属性;
? 掌握 8086CPU指令系统的寻址方式;
? 掌握 8086CPU指令系统 6大类指令的功能;
? 掌握基本伪指令及主要 DOS功能模块的应用;
? 掌握汇编语言源程序的结构框架;
? 理解汇编语言程序设计的一般过程;
? 具备编写简单汇编语言源程序的能力。
111
作业:
? 5.2
? 5.4
? 5.7
? 5.8
? 5.9
? 5.11
? 5.15
? 5.16
? 5.19