6,处理机控制指令
1) 标志处理指令
CLC,STC,CMC,CLD,STD,CLI,STI
2) 处理机控制指令
HLT,NOP,WAIT,ESC,LOCK
1) 标志处理指令
▲ 设置和清除标志的指令,只影响指令指定的标志指令格式 执行操作
CLC CF=0
STC CF=1
CLM C F ← CF
CLD DF=0
STD DF=1
CLI IF= 0
STI IF= 1
2) 处理机控制指令
① 暂停指令 HLT
格式 HLT
执行 使 CPU处于暂停状态用于等待外部中断,中断处理结束后,
继续执行 HLT后的下一条指令例,、、
、、、
STI ;允许外部中断
HLT ;等待中断
MOV AX,0
、、、
、、、
② 空操作指令 NOP
格式 NOP
指令不执行任何操作
mov BX,[100 ] 00
B8
01
07
3A
cmp AL,[BX]
B8
FE
11
mov BX,[100 ] 00
B8
01
90
90
cmp AL,[BX]
90
3A
07
nop
nop
nop
mov CX,20H
B9 2 0 00
例:
( 也可用 NOP指令进行短延时 (教材中的一些例子用到 )
其机器码占一个字节单元,在调试程序时,修改程序用 。
7,串处理指令
串的基本概念顺序存放在内存中的一组数据,称为串 。
用串的首 ( 末 ) 地址,元素类型,串的长度表示 。
12 34,00 00
str ing
DS:B X
ABCDE?
、、、
YZ?
11
22
33
1a
2b
3c
4d
串操作种类
① 串传送将串从内存某一区域传送到另一区域 。
② 从串取从串中取出某一元素 。
③ 存入串将某个数据存入串中 。
④ 串比较对两个串进行比较 。
⑤ 搜索串在串中搜索 ( 查找 ) 某数据 ( 关键字 )
串处理指令格式重复控制前缀 串指令控制重复次数 基本操作
MOVSB,MOVSW 串传送
REP LODSB,LODSW 从串取
REPZ STOSB,STOSW 存入串
REPNZ CMPSB,CMPSW 串比较
SCASB,SCASW 搜索串例 REP MOVSB
REPZ CMPSB
REPNZ SCASW
① 串指令
串传送 MOVS
从串取 LODS
存入串 STOS
串比较 CMPS
搜索串 SCAS
▲ 串指令的特点
① 指令给出串操作的种类,类型,而操作数隐含给出 。
如 MOVSB ;字节
MOVSW ;字
② 源串 由 DS,SI指向的单元目的串 由 ES,DI指向的单元
③ 指令执行后,指针据 DF标志、操作类型自动修改字节操作 1 ; 字操作 2
DF= 0 用 + ; DF= 1 用 -
④ 对只有一个存储器操作数的串指令如 LODS( 从串取 )
STOS( 存入串 )
SCAS( 搜索串 )
另一个操作数在 AL (字节操作 ) 或 AX (字操作 )
⑤ CMPS(串比较 ),SCAS(串搜索 )影响 标志,
MOVS(串传送 ),LODS(从串取 ),STOS(存入串 )不影响 标志 。
串传送
◢ ◢ 格式 MOVSB 字节传送
MOVSW 字传送
◢ ◢ MOVSB 执行操作
(ES:DI ) ← (DS:SI ) 字节传送
(SI ) ← (SI ) 1 修改源串指针
(DI) ← (DI ) 1 修改目的串指针其中,DF = 0,用 +
DF = 1,用 -
◢ ◢ MOVSW 执行操作
(ES:DI ) ← (DS:SI ) 字传送
(SI ) ← (SI ) 2 修改源串指针
(DI ) ← (DI ) 2 修改目的串指针
从串取
◢ ◢ 格式 LODSB 取字节
LODSW 取字
◢ ◢ LODSB执行操作
(AL) ← (DS:SI ) 从源串取入 AL
(SI ) ← (SI ) 1 修改源串指针
◢ ◢ LODSW执行操作
(AX ) ← (DS:SI ) 从源串取入 AX
(SI ) ← (SI ) 2 修改源串指针
存入串
◢ ◢ 格式 STOSB 存入字节
STOSW 存入字
◢ ◢ STOSB执行操作
(ES:DI) ← (AL) 将 AL存入目的串
(DI ) ← (DI ) 1 修改目的串指针
◢ ◢ STOSW执行操作
(ES:DI) ← (AX) 将 AX存入目的串
(DI) ← (DI ) 2 修改目的串指针
串比较
◢ ◢ 格式 CMPSB 字节比较
CMPSW 字比较
◢ ◢ CMPSB 执行操作
(DS:SI ) - (ES:DI ) 字节比较
(SI ) ← (SI ) 1 修改源串指针
(DI ) ← (DI ) 1 修改目的串指针
◢ ◢ CMPSW 执行操作
(DS:SI ) - (ES:DI ) 字比较
(SI ) ← (SI ) 2 修改源串指针
(DI ) ← (DI ) 2 修改目的串指针注意,1.源串 - 目的串
2,两数相减,只影响标志,不影响操作数
搜索串
◢ ◢ 格式 SCASB 取字节
SCASW 取字
◢ ◢ SCASB执行操作
(AL) - (ES:DI ) 从目的串搜索字节
(DI ) ← (DI ) 1 修改目的串指针
◢ ◢ SCASW执行操作
(AX ) - (ES:DI ) 从目的串搜索字节
(DI) ← (DI ) 2 修改目的串指针两数相减,只影响标志,不影响操作数 。
② 重复控制前缀重复前缀 REP
当相等重复前缀 REPZ /REPE
当不相等重复前缀 REPNZ /REPNE
重复前缀 REP
执行过程:
(1)当 (CX)= 0,结束 REP,
执行 REP下一条指令 。
(2)当 (CX)≠0,将 CX的 内容减 1,
执行 REP后的串指令,返回 (1)。
例 LEA DI,destination
LEA SI,source
MOV CX,20
REP MOVSB
MOV AX,0
只在 (CX)=0时退出循环
REP 执行流程
(CX)=(CX)-1
REP 后的串 指 令
Y
N
CX=0?
当相等重复前缀 REPZ
执行过程:
(1) 当 (CX)= 0,结束 REPZ,
执行 REPZ下一条指令;
(2) 当 (CX)≠0,将 CX的内容减 1,
执行 REPZ后的串指令;
(3) 当 ZF = 1,返回 (1) ;
(4) 当 ZF≠1,则结束 REPZ,
执行 REPZ下一条指令 。
(CX)减 1操作不影响标志
ZF标志由串操作决定
REP Z 执行流程
(CX)=(C X)-1
REP Z 后的串 指 令
Y
N
Y
N
CX=0?
ZF = 1?
当不相等重复前缀 REPNZ
执行过程:
(1) 当 (CX )= 0,结束 REPNZ,
执行 REPNZ下一条指令 。
(2)当 (CX)≠0,将 CX的内容减 1,
执行 REPNZ后的串指令 。
(3) 当 ZF = 0,返回 (1);
(4) 当 ZF≠0,则结束 REPNZ,
执行 REPNZ下一条指令 。
RE P NZ 执行流程
(CX)= (C X)-1
RE P NZ 后的串 指 令
Y
N
Y
N
CX= 0?
ZF =0?
例 1 用 REP MOVS 进行数据块传送 。
编程:
① 设置传送方向用 CLD 使 DF = 0,地址增加方向 ( 正向 )
用 STD 使 DF = 1,地址减小方向 ( 反向 )
② 设置源串地址将源串首地址 (DF=0),或末地址 ( DF=1) 放入 DS,SI中 。
③ 设置目的串地址将目的串首地址 (DF=0),或末地址 ( DF=1) 放入 ES,DI中 。
④ 设置串长度将串的长度 ( 传送次数 ) 放入 CX中 。
⑤ 字节传送 用 REP MOVSB
字传送 用 REP MOVSW
例 1
编程将存放在 str1中的 4字节字符串传送到 str2定义的缓冲区中 。
D?
C?
B?
A?str1
str2
data1 SEGMENT
str1 DB?ABCD? ;源串
data1 ENDS
data2 SEGMENT
str2 DB 4 DUP(?) ;缓冲区
data2 ENDS
code SEGMENT
、、、、、、
CLD ;DF=0,正方向传送
MOV AX,data1 ;源串首地址的段值 → DS
MOV DS,AX
LEA SI,str1 ;源串首地址的偏值 → SI
MOV AX,data2 ;目的串首地址的段值 → ES
MOV ES,AX
LEA DI,str2 ;目的串首地址的偏值 → DI
MOV CX,4 ;串长度 CX
REP MOVSB ;串传送
、、、、、、
code ENDS
D?
C?
B?
A?
00H
00H
00H
00H
FC
、、
、、
F3
1234,0000
str1
1235,0000
str2
A4
1236,0000
程 序
CLD
REP
MO VS
BB
data1 SEGMENT
str1 DB?ABCD?
data1 ENDS
data2 SEGMENT
str2 DB 4 DUP(?)
data2 EMDS
code SEGMENT
、、、、、、
CLD
MOV AX,data1
MOV DS,AX
LEA SI,str1
MOV AX,data2
MOV ES,AX
LEA DI,str2
MOV CX,4
REP MOVSB
、、、、、、
code ENDS
假设程序经汇编,连接后,装入内存的情况如下,
D?
C?
B?
A?
00H
00H
00H
00H
123 4:00 00
DS,SI
123 5:00 00
ES,DI
(CX)= 4
执行 R E P 前各寄存器的设置执行一次 MO VSB 后
D?
C?
B?
A?
A?
00H
00H
00H
123 4:00 01
DS,SI
123 5:00 01
ES,DI
(CX)= 3
执行完 R E P 后
D?
C?
B?
A?
A?
B?
C?
D?
123 4:00 04
DS,SI
123 5:00 04
ES,DI
(CX)= 0
程序执行结果:
例 2 比较 string1和 string2的两串,长度为 8字节
stri ng1 11
22
33
、、、
、、、
1a
2b
3c
4d
stri ng211
22
33
、、、
、、、
1a
11
22
34
用 REPZ CMPS 进行串比较编程:
① 设置比较方向 (STD或 CLD)
② 设置源串,目的串地址将源串首地址 (DF=0时 ),或末地址 ( DF=1时 ) 放入 DS,SI
将目的串首地址 (DF=0时 ),或末地址 ( DF=1时 ) 放入 ES,DI
③ 设置串长度将串的长度放入 CX中
④ 按 字节比较 用 REPZ CMPSB
按 字比较 用 REPZ CMPSW
执行完 REPZ CMPS后,根据 ZF判断两串比较结果 。
▲ 若 ZF=1,两串相等,此时:
CX=0,表明串中所有元素已比较完毕
SI,DI指向串尾的下一单元 。
▲ 若 ZF=0,两串不等,此时:
CX的值为剩下的未比较的元素个数 。
SI,DI指向不相等元素的下一元素 。
code SEGMENT
、、、、、、
CLD ;DF=0,正向比较
MOV AX,SEG string1 ;源串首地址 → DS:SI
MOV DS,AX
LEA SI,string1
MOV AX,SEG string2 ;目的串首地址 → ES:DI
MOV ES,AX
LEA DI,string2
MOV CX,8 ;串长度 → CX
REPZ CMPSB ;串比较
JZ equal ;利用 ZF判断比较结果不相等处理
JMP exit
equal,相等处理
exit:,、、
code ENDS
code SEGMENT
、、、、、、
CLD ;DF=0,正向比较
MOV AX,SEG string1 ;源串首地址 → DS:SI
MOV DS,AX
LEA SI,string1
MOV AX,SEG string2 ;目的串首地址 → ES:DI
MOV ES,AX
LEA DI,string2
MOV CX,8 ;串长度 → CX
REPZ CMPSB
JZ equal
不相等处理
JMP exit
equal,相等处理
exit:,、、
code ENDS
JNZ notequ
相等处理
JMP exit
notequ,不相等处理
exit:,、、
、、、,、、
11
22
33
44
1a
2b
3c
4d
11
22
33
44
1a
2b
3c
4d
stri ng1
stri ng2
DS,SI
ES,DI (CX)= 0,ZF =1
执行完 REPZ CMPSB后,此时:
ZF=1,两串相等
CX=0,两串所有元素已比较完
SI,DI串尾的下一单元例
、、、,、、
11
22
33
44
1a
4d
11
22
33
44
2c
4d
2b
3c
3b
3c
stri ng1 stri ng2
DS,SI ES,DI
(CX)= 3,Z F = 0
执行完 REPZ CMPSB后,此时:
ZF=0,两串不等
CX=3,剩下的未比较的元素个数
SI,DI指向不相等元素的下一元素 。
例例 3 用 REPNZ SCAS 在串中找关键字 。
编程步骤:
① 设置查找方向
② 设置串地址将串的首地址 (DF=0时 ),或末地址 ( DF=1时 ) 放入 ES,DI中 。
③ 设置关键字将关键字放入 AL(关键字为字节 )或 放入 AX(关键字为字 )。
④ 设置串长度将串的长度放入 CX中 。
⑤ 查找字节 用 REPNZ SCASB
查找字 用 REPNZ SCASW
执行完 REPNZ SCAS后,根据 ZF判断查找结果 。
▲ 若 ZF=1,则串中有关键字,此时:
CX的值为剩下的未搜索的元素个数,
DI指向关键字元素的下一元素,
而关键字 在 ( DI )-1的位置
▲ 若 ZF=0,则串中无关键字,此时:
CX=0,表明串中所有元素以搜索完毕
DI指向串尾的下一单元 。
例,、、
REPNZ SCASB
JZ found
未找到处理
JMP exit
found,找到处理
exit:,、、
关键字元素
( DI ) = 000 3?C?
$?
B?
A?
D? ( CX) = 000 2
ZF =1
执行后
( DI ) = 000 0
(CX) = 000 5
(AL) =?$?
执行前注意,$ 字符在 ( D I ) - 1=0 002 H 的位置
▲ 串指令可单独使用
MOV AL,[SI]
MOV ES:[DI],AL 等价于 MOVSB
INC SI
INC DI (假设 DF=0)
next,JCXZ exit
DEC CX
MOVSB 等价于 REP MOVSB
JMP next
exit:,、
说明:
下面程序段完成字传送 (8000:1000H)← (4000:2000H)
MOV AX,4000H
MOV DS,AX
MOV SI,2000H
MOV AX,8000H
MOV ES,AX
MOV DI,1000H
MOVSW
▲ 可在有源操作数的串指令前使用段跨越前缀,
此时:源串操作数的段值由段跨越前缀指定 。
包括指令 MOVS,LODS,CMPS
例 ES,MOVSB
执行 ( ES:DI) ← (ES:SI)
而不是 ( ES:DI) ← (DS:SI)
ES,SCASB 没有源串
ES,STOSW
▲ 目的串操作数不允许使用段跨越前缀,
即串指令前的段跨越前缀必指源串操作数 。
▲ 重复前缀中 CX减 1操作,不影响标志 。
REP NZ 执行流程
(CX)=(C X)-1
REP NZ 后的串 指 令
Y
N
Y
N
CX=0?
ZF =0?
REP 执行流程
(CX)=(C X)-1
REP 后的串 指 令
Y
N
CX=0?
(CX)=(C X)-1
REP Z 后的串 指 令
Y
N
Y
N
CX=0?
ZF = 1?
REP Z 执行流程操作类型默 认段寄存器是否允许段 跨 越有效地址取指令 CS 否 IP
以 BP 做基址的 操 作 数
SS C S,DS,ES EA
直接寻址、
以 B X 做基址的 操 作 数
DS CS,SS,ES EA
堆栈操作 SS 否 SP
源 串 DS CS,S S,ES SI
串操作目的串 ES 否 DI几种操作复习
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器第四节 DOS操作系统简介一,操作系统概念二,DOS系统的组成三,DOS系统启动过程四,DOS系统的内存分配一,操作系统概念计算机的工作原理:,存储程序,+“程序控制,
硬件系统软件应用软件
CPU,存储器,I/ O 接口、输入、输出设备操作系统,D O S 系统编辑器,E D IT,exe
汇编程序,M A S M,exe
连接程序,L I N K,exe
调试程序,D E B U G,exe
用户开发的程序,A B C,e xe 等
操作系统是,
是计算机最基本的系统软件,
控制和管理计算机硬件,软件资源,
方便用户充分,有效地利用计算机,
增强整个计算机的处理能力 。
IBM PC/XT机上 安装 /运行的操作系统是 DOS操作系统了解 DOS系统的目的:
① 了解计算机从裸机到可与用户进行交互系统的建立过程,
加深计算机工作原理的理解 。
② 了解 DOS系统下,内存的分配情况,
更好的学习汇编语言程序设计 。
一,DOS系统的组成
1,构成模块
2,各模块功能
1,由四个模块构成
DOS引导模块,
在系统盘的 0面 0道 1扇区上
基本输入 /输出模块 BIOS,
ROM BIOS (在内存的 ROM区 )
IO.SYS (在系统盘上 )
磁盘管理模块,
MSDOS.SYS (在系统盘上 )
命令处理模块,
COMMAND.COM (在系统盘上 )
2,各模块功能
DOS引导模块完成将磁盘上三个系统文件装入内存 。
( 三个文件为 IO.SYS,MSDOS.SYS,COMMAND.COM )
基本输入 /输出模块 BIOS
实现对输入 /输出设备的管理 。
内含 0 - 1CH类型中断子程,
包括显示器,磁盘,键盘,打印机等外设驱动程序 。
磁盘管理模块,
◢ 实现磁盘文件的管理 。
◢ 内含 20H- 27H类型中断子程,
其中 21H类型中断子程提供近百种的系统功能,
使用户程序能方便地享用系统资源 。
命令处理模块,
实现接收,识别和处理键盘命令,
装入程序到内存,转去执行程序的功能 。
系统资源
F F F F,00 0 0 系统检测程序
RAM
ROM
内 存
ROM BIOS
磁 盘
DO S
IO.SYS
COM MAND.COM
MSDO S.SYS
引导程序
EDIT,exe
MASM,exe
LINK,exe
DEBUG,exe
应用程序其他系统程序三,DOS系统启动过程有无对应的执行程序?
给系统加电,从
FF FF,0 开始启动执行 R O M BIO S
中系统检测程序显示出错信息在向量表中填入
ROM BIO S 内中断子程的向量将系统盘上的引导程序装入内存执行引导程序将系统文件装入内存在向量表中填入
IO,SY S 和 M S DO S.SY S
中断子程的向量执行命令处理模块
COM MAN D,CO M
出现提示符,>,,等待从键盘输入命令显示出错信 息建立程序段前缀 P S P
PS P p pa
将执行文件装入内存转到执行文件的入口,
执行程序死机
Y
N
检查系统盘根目录下有无三个系统文件?
N
Y
N
Y
N
Y
Y
N
显示出错信息检测成功?
有命令输入?
程序有返回 D O S 功能?
FF FF:0 000
H
RO M
DO S 加载后系统资源系统检测程序
IO,SY S
CO M M AND,CO M
M SDO S.S YS
用户程序空间引导程序
1K B 中断向量表
RAM
内 存
RO M BIO S
DO S
IO,SY S
CO M M AND,CO M
M SDO S.S YS
引导程序
ED IT,ex e
M ASM,ex e
LIN K,e xe
DE BU G,ex e
应用程序其他系统程序磁 盘
0000,0000 H
0040,0000 H
0050,0000 H
0070,0000 H
A000:0 000H
B00 0:000 0H
C800:0 000H
F6 00:00 00H
FE 00:00 00H
FE 00:1F FFH
640K B RAM
基本内存显示器显示缓存区硬盘驱动器控制 RO M
32K B RO M BASIC
8K B RO M BIO S
IO,SYS 模块
CO MM AND.CO M 常驻模块
MS DO S.SYS 模块用户程序空间
CO MM AND.CO M 暂驻模块
256K B RO M
DO S 工作区
RO M BIO S 工作区
1K B 中断向量表
128K B RAM 保留四,DOS系统的内存分配
一 进入 DEBUG,先用 R命令查看当前 CS 和 IP的值,
此时 CS:IP即为用户空间起点 。
D:\MASM>DEBUG ;进入 DEBUG
-R
AX=0000 BX=0000 CX=0000 DX=0000
SP=FFEE BP=0000 SI=0000 DI=0000
DS=1271 ES=1271 SS=1271 CS=1271 IP=0100
NV UP EI PL NZ NA PO NC
-A ;在用户区汇编指令
1271:0100 MOV AX,1234
1271:0103
-
1) 标志处理指令
CLC,STC,CMC,CLD,STD,CLI,STI
2) 处理机控制指令
HLT,NOP,WAIT,ESC,LOCK
1) 标志处理指令
▲ 设置和清除标志的指令,只影响指令指定的标志指令格式 执行操作
CLC CF=0
STC CF=1
CLM C F ← CF
CLD DF=0
STD DF=1
CLI IF= 0
STI IF= 1
2) 处理机控制指令
① 暂停指令 HLT
格式 HLT
执行 使 CPU处于暂停状态用于等待外部中断,中断处理结束后,
继续执行 HLT后的下一条指令例,、、
、、、
STI ;允许外部中断
HLT ;等待中断
MOV AX,0
、、、
、、、
② 空操作指令 NOP
格式 NOP
指令不执行任何操作
mov BX,[100 ] 00
B8
01
07
3A
cmp AL,[BX]
B8
FE
11
mov BX,[100 ] 00
B8
01
90
90
cmp AL,[BX]
90
3A
07
nop
nop
nop
mov CX,20H
B9 2 0 00
例:
( 也可用 NOP指令进行短延时 (教材中的一些例子用到 )
其机器码占一个字节单元,在调试程序时,修改程序用 。
7,串处理指令
串的基本概念顺序存放在内存中的一组数据,称为串 。
用串的首 ( 末 ) 地址,元素类型,串的长度表示 。
12 34,00 00
str ing
DS:B X
ABCDE?
、、、
YZ?
11
22
33
1a
2b
3c
4d
串操作种类
① 串传送将串从内存某一区域传送到另一区域 。
② 从串取从串中取出某一元素 。
③ 存入串将某个数据存入串中 。
④ 串比较对两个串进行比较 。
⑤ 搜索串在串中搜索 ( 查找 ) 某数据 ( 关键字 )
串处理指令格式重复控制前缀 串指令控制重复次数 基本操作
MOVSB,MOVSW 串传送
REP LODSB,LODSW 从串取
REPZ STOSB,STOSW 存入串
REPNZ CMPSB,CMPSW 串比较
SCASB,SCASW 搜索串例 REP MOVSB
REPZ CMPSB
REPNZ SCASW
① 串指令
串传送 MOVS
从串取 LODS
存入串 STOS
串比较 CMPS
搜索串 SCAS
▲ 串指令的特点
① 指令给出串操作的种类,类型,而操作数隐含给出 。
如 MOVSB ;字节
MOVSW ;字
② 源串 由 DS,SI指向的单元目的串 由 ES,DI指向的单元
③ 指令执行后,指针据 DF标志、操作类型自动修改字节操作 1 ; 字操作 2
DF= 0 用 + ; DF= 1 用 -
④ 对只有一个存储器操作数的串指令如 LODS( 从串取 )
STOS( 存入串 )
SCAS( 搜索串 )
另一个操作数在 AL (字节操作 ) 或 AX (字操作 )
⑤ CMPS(串比较 ),SCAS(串搜索 )影响 标志,
MOVS(串传送 ),LODS(从串取 ),STOS(存入串 )不影响 标志 。
串传送
◢ ◢ 格式 MOVSB 字节传送
MOVSW 字传送
◢ ◢ MOVSB 执行操作
(ES:DI ) ← (DS:SI ) 字节传送
(SI ) ← (SI ) 1 修改源串指针
(DI) ← (DI ) 1 修改目的串指针其中,DF = 0,用 +
DF = 1,用 -
◢ ◢ MOVSW 执行操作
(ES:DI ) ← (DS:SI ) 字传送
(SI ) ← (SI ) 2 修改源串指针
(DI ) ← (DI ) 2 修改目的串指针
从串取
◢ ◢ 格式 LODSB 取字节
LODSW 取字
◢ ◢ LODSB执行操作
(AL) ← (DS:SI ) 从源串取入 AL
(SI ) ← (SI ) 1 修改源串指针
◢ ◢ LODSW执行操作
(AX ) ← (DS:SI ) 从源串取入 AX
(SI ) ← (SI ) 2 修改源串指针
存入串
◢ ◢ 格式 STOSB 存入字节
STOSW 存入字
◢ ◢ STOSB执行操作
(ES:DI) ← (AL) 将 AL存入目的串
(DI ) ← (DI ) 1 修改目的串指针
◢ ◢ STOSW执行操作
(ES:DI) ← (AX) 将 AX存入目的串
(DI) ← (DI ) 2 修改目的串指针
串比较
◢ ◢ 格式 CMPSB 字节比较
CMPSW 字比较
◢ ◢ CMPSB 执行操作
(DS:SI ) - (ES:DI ) 字节比较
(SI ) ← (SI ) 1 修改源串指针
(DI ) ← (DI ) 1 修改目的串指针
◢ ◢ CMPSW 执行操作
(DS:SI ) - (ES:DI ) 字比较
(SI ) ← (SI ) 2 修改源串指针
(DI ) ← (DI ) 2 修改目的串指针注意,1.源串 - 目的串
2,两数相减,只影响标志,不影响操作数
搜索串
◢ ◢ 格式 SCASB 取字节
SCASW 取字
◢ ◢ SCASB执行操作
(AL) - (ES:DI ) 从目的串搜索字节
(DI ) ← (DI ) 1 修改目的串指针
◢ ◢ SCASW执行操作
(AX ) - (ES:DI ) 从目的串搜索字节
(DI) ← (DI ) 2 修改目的串指针两数相减,只影响标志,不影响操作数 。
② 重复控制前缀重复前缀 REP
当相等重复前缀 REPZ /REPE
当不相等重复前缀 REPNZ /REPNE
重复前缀 REP
执行过程:
(1)当 (CX)= 0,结束 REP,
执行 REP下一条指令 。
(2)当 (CX)≠0,将 CX的 内容减 1,
执行 REP后的串指令,返回 (1)。
例 LEA DI,destination
LEA SI,source
MOV CX,20
REP MOVSB
MOV AX,0
只在 (CX)=0时退出循环
REP 执行流程
(CX)=(CX)-1
REP 后的串 指 令
Y
N
CX=0?
当相等重复前缀 REPZ
执行过程:
(1) 当 (CX)= 0,结束 REPZ,
执行 REPZ下一条指令;
(2) 当 (CX)≠0,将 CX的内容减 1,
执行 REPZ后的串指令;
(3) 当 ZF = 1,返回 (1) ;
(4) 当 ZF≠1,则结束 REPZ,
执行 REPZ下一条指令 。
(CX)减 1操作不影响标志
ZF标志由串操作决定
REP Z 执行流程
(CX)=(C X)-1
REP Z 后的串 指 令
Y
N
Y
N
CX=0?
ZF = 1?
当不相等重复前缀 REPNZ
执行过程:
(1) 当 (CX )= 0,结束 REPNZ,
执行 REPNZ下一条指令 。
(2)当 (CX)≠0,将 CX的内容减 1,
执行 REPNZ后的串指令 。
(3) 当 ZF = 0,返回 (1);
(4) 当 ZF≠0,则结束 REPNZ,
执行 REPNZ下一条指令 。
RE P NZ 执行流程
(CX)= (C X)-1
RE P NZ 后的串 指 令
Y
N
Y
N
CX= 0?
ZF =0?
例 1 用 REP MOVS 进行数据块传送 。
编程:
① 设置传送方向用 CLD 使 DF = 0,地址增加方向 ( 正向 )
用 STD 使 DF = 1,地址减小方向 ( 反向 )
② 设置源串地址将源串首地址 (DF=0),或末地址 ( DF=1) 放入 DS,SI中 。
③ 设置目的串地址将目的串首地址 (DF=0),或末地址 ( DF=1) 放入 ES,DI中 。
④ 设置串长度将串的长度 ( 传送次数 ) 放入 CX中 。
⑤ 字节传送 用 REP MOVSB
字传送 用 REP MOVSW
例 1
编程将存放在 str1中的 4字节字符串传送到 str2定义的缓冲区中 。
D?
C?
B?
A?str1
str2
data1 SEGMENT
str1 DB?ABCD? ;源串
data1 ENDS
data2 SEGMENT
str2 DB 4 DUP(?) ;缓冲区
data2 ENDS
code SEGMENT
、、、、、、
CLD ;DF=0,正方向传送
MOV AX,data1 ;源串首地址的段值 → DS
MOV DS,AX
LEA SI,str1 ;源串首地址的偏值 → SI
MOV AX,data2 ;目的串首地址的段值 → ES
MOV ES,AX
LEA DI,str2 ;目的串首地址的偏值 → DI
MOV CX,4 ;串长度 CX
REP MOVSB ;串传送
、、、、、、
code ENDS
D?
C?
B?
A?
00H
00H
00H
00H
FC
、、
、、
F3
1234,0000
str1
1235,0000
str2
A4
1236,0000
程 序
CLD
REP
MO VS
BB
data1 SEGMENT
str1 DB?ABCD?
data1 ENDS
data2 SEGMENT
str2 DB 4 DUP(?)
data2 EMDS
code SEGMENT
、、、、、、
CLD
MOV AX,data1
MOV DS,AX
LEA SI,str1
MOV AX,data2
MOV ES,AX
LEA DI,str2
MOV CX,4
REP MOVSB
、、、、、、
code ENDS
假设程序经汇编,连接后,装入内存的情况如下,
D?
C?
B?
A?
00H
00H
00H
00H
123 4:00 00
DS,SI
123 5:00 00
ES,DI
(CX)= 4
执行 R E P 前各寄存器的设置执行一次 MO VSB 后
D?
C?
B?
A?
A?
00H
00H
00H
123 4:00 01
DS,SI
123 5:00 01
ES,DI
(CX)= 3
执行完 R E P 后
D?
C?
B?
A?
A?
B?
C?
D?
123 4:00 04
DS,SI
123 5:00 04
ES,DI
(CX)= 0
程序执行结果:
例 2 比较 string1和 string2的两串,长度为 8字节
stri ng1 11
22
33
、、、
、、、
1a
2b
3c
4d
stri ng211
22
33
、、、
、、、
1a
11
22
34
用 REPZ CMPS 进行串比较编程:
① 设置比较方向 (STD或 CLD)
② 设置源串,目的串地址将源串首地址 (DF=0时 ),或末地址 ( DF=1时 ) 放入 DS,SI
将目的串首地址 (DF=0时 ),或末地址 ( DF=1时 ) 放入 ES,DI
③ 设置串长度将串的长度放入 CX中
④ 按 字节比较 用 REPZ CMPSB
按 字比较 用 REPZ CMPSW
执行完 REPZ CMPS后,根据 ZF判断两串比较结果 。
▲ 若 ZF=1,两串相等,此时:
CX=0,表明串中所有元素已比较完毕
SI,DI指向串尾的下一单元 。
▲ 若 ZF=0,两串不等,此时:
CX的值为剩下的未比较的元素个数 。
SI,DI指向不相等元素的下一元素 。
code SEGMENT
、、、、、、
CLD ;DF=0,正向比较
MOV AX,SEG string1 ;源串首地址 → DS:SI
MOV DS,AX
LEA SI,string1
MOV AX,SEG string2 ;目的串首地址 → ES:DI
MOV ES,AX
LEA DI,string2
MOV CX,8 ;串长度 → CX
REPZ CMPSB ;串比较
JZ equal ;利用 ZF判断比较结果不相等处理
JMP exit
equal,相等处理
exit:,、、
code ENDS
code SEGMENT
、、、、、、
CLD ;DF=0,正向比较
MOV AX,SEG string1 ;源串首地址 → DS:SI
MOV DS,AX
LEA SI,string1
MOV AX,SEG string2 ;目的串首地址 → ES:DI
MOV ES,AX
LEA DI,string2
MOV CX,8 ;串长度 → CX
REPZ CMPSB
JZ equal
不相等处理
JMP exit
equal,相等处理
exit:,、、
code ENDS
JNZ notequ
相等处理
JMP exit
notequ,不相等处理
exit:,、、
、、、,、、
11
22
33
44
1a
2b
3c
4d
11
22
33
44
1a
2b
3c
4d
stri ng1
stri ng2
DS,SI
ES,DI (CX)= 0,ZF =1
执行完 REPZ CMPSB后,此时:
ZF=1,两串相等
CX=0,两串所有元素已比较完
SI,DI串尾的下一单元例
、、、,、、
11
22
33
44
1a
4d
11
22
33
44
2c
4d
2b
3c
3b
3c
stri ng1 stri ng2
DS,SI ES,DI
(CX)= 3,Z F = 0
执行完 REPZ CMPSB后,此时:
ZF=0,两串不等
CX=3,剩下的未比较的元素个数
SI,DI指向不相等元素的下一元素 。
例例 3 用 REPNZ SCAS 在串中找关键字 。
编程步骤:
① 设置查找方向
② 设置串地址将串的首地址 (DF=0时 ),或末地址 ( DF=1时 ) 放入 ES,DI中 。
③ 设置关键字将关键字放入 AL(关键字为字节 )或 放入 AX(关键字为字 )。
④ 设置串长度将串的长度放入 CX中 。
⑤ 查找字节 用 REPNZ SCASB
查找字 用 REPNZ SCASW
执行完 REPNZ SCAS后,根据 ZF判断查找结果 。
▲ 若 ZF=1,则串中有关键字,此时:
CX的值为剩下的未搜索的元素个数,
DI指向关键字元素的下一元素,
而关键字 在 ( DI )-1的位置
▲ 若 ZF=0,则串中无关键字,此时:
CX=0,表明串中所有元素以搜索完毕
DI指向串尾的下一单元 。
例,、、
REPNZ SCASB
JZ found
未找到处理
JMP exit
found,找到处理
exit:,、、
关键字元素
( DI ) = 000 3?C?
$?
B?
A?
D? ( CX) = 000 2
ZF =1
执行后
( DI ) = 000 0
(CX) = 000 5
(AL) =?$?
执行前注意,$ 字符在 ( D I ) - 1=0 002 H 的位置
▲ 串指令可单独使用
MOV AL,[SI]
MOV ES:[DI],AL 等价于 MOVSB
INC SI
INC DI (假设 DF=0)
next,JCXZ exit
DEC CX
MOVSB 等价于 REP MOVSB
JMP next
exit:,、
说明:
下面程序段完成字传送 (8000:1000H)← (4000:2000H)
MOV AX,4000H
MOV DS,AX
MOV SI,2000H
MOV AX,8000H
MOV ES,AX
MOV DI,1000H
MOVSW
▲ 可在有源操作数的串指令前使用段跨越前缀,
此时:源串操作数的段值由段跨越前缀指定 。
包括指令 MOVS,LODS,CMPS
例 ES,MOVSB
执行 ( ES:DI) ← (ES:SI)
而不是 ( ES:DI) ← (DS:SI)
ES,SCASB 没有源串
ES,STOSW
▲ 目的串操作数不允许使用段跨越前缀,
即串指令前的段跨越前缀必指源串操作数 。
▲ 重复前缀中 CX减 1操作,不影响标志 。
REP NZ 执行流程
(CX)=(C X)-1
REP NZ 后的串 指 令
Y
N
Y
N
CX=0?
ZF =0?
REP 执行流程
(CX)=(C X)-1
REP 后的串 指 令
Y
N
CX=0?
(CX)=(C X)-1
REP Z 后的串 指 令
Y
N
Y
N
CX=0?
ZF = 1?
REP Z 执行流程操作类型默 认段寄存器是否允许段 跨 越有效地址取指令 CS 否 IP
以 BP 做基址的 操 作 数
SS C S,DS,ES EA
直接寻址、
以 B X 做基址的 操 作 数
DS CS,SS,ES EA
堆栈操作 SS 否 SP
源 串 DS CS,S S,ES SI
串操作目的串 ES 否 DI几种操作复习
DS
ES
SS
CS
IP
数据暂存器
PSW标志寄存器 执行部件控制电路指令译码器
AX
BX
CX
DX
AH
BH
CH
DH
SI
DI
BP
SP
AL
BL
CL
DL
寄存器组指令队列总线接口控制电路运算器地址加法器
、、、
指令 1
指令 2
指令 3
指令 4
、、、
数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地址译码器第四节 DOS操作系统简介一,操作系统概念二,DOS系统的组成三,DOS系统启动过程四,DOS系统的内存分配一,操作系统概念计算机的工作原理:,存储程序,+“程序控制,
硬件系统软件应用软件
CPU,存储器,I/ O 接口、输入、输出设备操作系统,D O S 系统编辑器,E D IT,exe
汇编程序,M A S M,exe
连接程序,L I N K,exe
调试程序,D E B U G,exe
用户开发的程序,A B C,e xe 等
操作系统是,
是计算机最基本的系统软件,
控制和管理计算机硬件,软件资源,
方便用户充分,有效地利用计算机,
增强整个计算机的处理能力 。
IBM PC/XT机上 安装 /运行的操作系统是 DOS操作系统了解 DOS系统的目的:
① 了解计算机从裸机到可与用户进行交互系统的建立过程,
加深计算机工作原理的理解 。
② 了解 DOS系统下,内存的分配情况,
更好的学习汇编语言程序设计 。
一,DOS系统的组成
1,构成模块
2,各模块功能
1,由四个模块构成
DOS引导模块,
在系统盘的 0面 0道 1扇区上
基本输入 /输出模块 BIOS,
ROM BIOS (在内存的 ROM区 )
IO.SYS (在系统盘上 )
磁盘管理模块,
MSDOS.SYS (在系统盘上 )
命令处理模块,
COMMAND.COM (在系统盘上 )
2,各模块功能
DOS引导模块完成将磁盘上三个系统文件装入内存 。
( 三个文件为 IO.SYS,MSDOS.SYS,COMMAND.COM )
基本输入 /输出模块 BIOS
实现对输入 /输出设备的管理 。
内含 0 - 1CH类型中断子程,
包括显示器,磁盘,键盘,打印机等外设驱动程序 。
磁盘管理模块,
◢ 实现磁盘文件的管理 。
◢ 内含 20H- 27H类型中断子程,
其中 21H类型中断子程提供近百种的系统功能,
使用户程序能方便地享用系统资源 。
命令处理模块,
实现接收,识别和处理键盘命令,
装入程序到内存,转去执行程序的功能 。
系统资源
F F F F,00 0 0 系统检测程序
RAM
ROM
内 存
ROM BIOS
磁 盘
DO S
IO.SYS
COM MAND.COM
MSDO S.SYS
引导程序
EDIT,exe
MASM,exe
LINK,exe
DEBUG,exe
应用程序其他系统程序三,DOS系统启动过程有无对应的执行程序?
给系统加电,从
FF FF,0 开始启动执行 R O M BIO S
中系统检测程序显示出错信息在向量表中填入
ROM BIO S 内中断子程的向量将系统盘上的引导程序装入内存执行引导程序将系统文件装入内存在向量表中填入
IO,SY S 和 M S DO S.SY S
中断子程的向量执行命令处理模块
COM MAN D,CO M
出现提示符,>,,等待从键盘输入命令显示出错信 息建立程序段前缀 P S P
PS P p pa
将执行文件装入内存转到执行文件的入口,
执行程序死机
Y
N
检查系统盘根目录下有无三个系统文件?
N
Y
N
Y
N
Y
Y
N
显示出错信息检测成功?
有命令输入?
程序有返回 D O S 功能?
FF FF:0 000
H
RO M
DO S 加载后系统资源系统检测程序
IO,SY S
CO M M AND,CO M
M SDO S.S YS
用户程序空间引导程序
1K B 中断向量表
RAM
内 存
RO M BIO S
DO S
IO,SY S
CO M M AND,CO M
M SDO S.S YS
引导程序
ED IT,ex e
M ASM,ex e
LIN K,e xe
DE BU G,ex e
应用程序其他系统程序磁 盘
0000,0000 H
0040,0000 H
0050,0000 H
0070,0000 H
A000:0 000H
B00 0:000 0H
C800:0 000H
F6 00:00 00H
FE 00:00 00H
FE 00:1F FFH
640K B RAM
基本内存显示器显示缓存区硬盘驱动器控制 RO M
32K B RO M BASIC
8K B RO M BIO S
IO,SYS 模块
CO MM AND.CO M 常驻模块
MS DO S.SYS 模块用户程序空间
CO MM AND.CO M 暂驻模块
256K B RO M
DO S 工作区
RO M BIO S 工作区
1K B 中断向量表
128K B RAM 保留四,DOS系统的内存分配
一 进入 DEBUG,先用 R命令查看当前 CS 和 IP的值,
此时 CS:IP即为用户空间起点 。
D:\MASM>DEBUG ;进入 DEBUG
-R
AX=0000 BX=0000 CX=0000 DX=0000
SP=FFEE BP=0000 SI=0000 DI=0000
DS=1271 ES=1271 SS=1271 CS=1271 IP=0100
NV UP EI PL NZ NA PO NC
-A ;在用户区汇编指令
1271:0100 MOV AX,1234
1271:0103
-