第二章 8086/8088的寻址方式与指令系统
指令系统, 计算机提供给用户使用的指令集
双操作数指令格式,操作码 操作数,操作数目的 源
例如,MOV AX,100
MOV AX,BX
MOV AX,[BX]
要访问操作数,首先必须确定 如何形成操作数的地址 。
确定获得操作数地址的方法寻址方式:
操作结果 替代 目的操作数
不影响 源操作数
寻址方式选择得正确与否,直接影响程序的执行效率。
2.1 寻址方式
寻址方式分类,1)与数据有关 的寻址方式2)与转移地址有关 的寻址方式, 确定内存单元的地址
有 7 种 与数据有关的寻址方式
,确定转移地址
以 MOV指令为例, MOV 目的 操作数,源操作数
对 源操作数 分别使用 7 种 寻址方式如下:
( 1) 立即寻址方式 ( Immediate Addressing )
特点, 操作数包含在指令中
操作数是指令的组成部分,可以是 8位或 16位,取出指令就
立即获得 操作数 ——立即数
例 1,MOV AL,5
执行指令后, (AL) = 05H B0
05
存储器
指令
05
AL
例 2,MOV AX,3045H
执行指令后, (AX) = 3045H
指令
45
AX
OP
45
存储器
30
30
低地址
高地址
用途, 给变量或寄存器赋常量值
限制, 只能用于源操作数
( 2) 寄存器寻址方式 ( Register Addressing )
特点,操作数存在寄存器中
例, MOV AX,BX
执行指令前, (AX) = 3045H (BX) = 4000H
执行指令后, (AX) = 4000H (BX) = 4000H
用途, 用寄存器提供操作数时存取速度快
指令
2000H
50
30
…
…
…
…
存储器
代码段
op
00
20
数据段30000H
32000H
AX
用途, 用于存取单个变量中的操作数
30 50
例,设 ( DS ) = 3000H
MOV AX,[2000H]
( 3) 直接寻址方式 ( Direct Addressing )
特点,操作数的偏移地址包含在指令中
要访问的存储单元 物理地址 为:
30000H+2000H=32000H
设, (32000H)=3050H
执行指令后, (AX)=3050H
如果 2000H单元在附加段,指令为,MOV AX,ES:[2000H]
段跨越前缀, 段寄存器名, —— 改变默认使用的段寄存器
MOV AX,NUM
1000H
AX
用途, 可 用于处理数组
50 A0
A0
50
…
…
…
存储器
数据段20000H
21000H
XX
XX
21002H
例,设 ( DS ) = 2000H
( BX ) = 1000H
指令为, MOV AX,[ BX ] 数组起始地址
( 4) 寄存器间接寻址方式 ( Register Indirect Addressing )
特点, (寄存器 ) = 操作数的偏移地址
计算操作数物理地址的公式,
1) 操作数物理地址 =( DS) ?16+
2) 操作数物理地址 =( SS) ?16+( BP)
(BX)
(SI)
(DI)
20000H+1000H = 21000H
要访问的存储单元
物理地址 为:
设, (21000H)=50A0H
执行指令后, (AX)=50A0H
指令
4000H
30000H
AX
(寄存器相对寻址方式)
12 34
例:设 ( DS ) = 3000H
ARRAY=4000H
( SI ) = 2000H
指令为, MOV AX,ARRAY[ SI ]
34
12…
…
…
…
存储器
代码段
op
00
40
数据段
36000H
op
…2000H
数组起始地址
( 5) 变址寻址方式 ( Indexed Addressing )
特点,(变址、基址寄存器 ) +指令中的位移量 = 操作数的偏移地址
计算操作数物理地址的公式,
1) 操作数物理地址 =(DS)?16+
2) 操作数物理地址 =( SS)?16+ (BP) + 8位位移量16位位移量
30000H+4000H +2000H= 36000H
要访问的存储单元
物理地址 为:
设, (36000H)=1234H
用途, 可 用于处理数组
执行指令后, (AX)=1234H
+
(SI)
(DI)
(BX)
8位位移量
16位位移量
0158H
AX
12 34
例:设 ( DS ) = 2100H
( BX ) = 0158H
( DI ) = 1000H
指令为, MOV AX,[BX+DI]
34
12
…
…
…
存储器
数据段21000H
22158H
1000H
数组起始地址
( 6) 基址 变址寻址方式 ( Based Index Addressing )
特点,(基址寄存器 ) + (变址寄存器 ) = 操作数的偏移地址
计算操作数物理地址的公式,
1) 操作数物理地址 =(DS)?16+
2) 操作数物理地址 =( SS)?16+ (BP) +
(BX) + (SI)(DI)
(SI)
(DI)
21000H+0158H +1000H= 22158H
要访问的存储单元
物理地址 为:
设, (22158H)=1234H
执行指令后, (AX)=1234H
用途, 可 用于处理数组
几种 可处理数组 的 寻址方式 的比较,
1,MOV AX,[BX]
2,MOV AX,ARRAY [SI]
3,MOV AX,[BX][SI]
寄存器间接寻址方式
变址寻址方式
基址变址寻址方式
特点, 可读性好,指令中明确指出了要处理的数组。
限制,写程序时必须清楚要处理什么数组。
特点, 适用于要处理的数组需要在程序运行中动态确定,
并且修改 BX就可以处理不同的数组。
特点, 适用于要处理的数组需要在程序运行中动态确定,
且形式简单。
?上述 1.和 2.指令中的 [寄存器 ]还可被哪些寄存器替换?
DI SI BP (加 段跨越前缀 DS,或 ES)
?上述 3.指令中的 BX寄存器是否可被其他寄存器替换?
DI BX BP (加 段跨越前缀 DS,或 ES)
next
指令
2000H
AX
12 34
例:设 ( SS ) = 3000H
( BP ) = 2000H
ARRAY = 0250H
( SI ) = 1000H
MOV AX,ARRAY[BP][SI]
1000H
30000H
34
12…
…
…
…
存储器
代码段
op
50
02
堆栈段
33250H
op
…
? ?
…
0250H
栈顶
数组首址
( 7)相对基址 变址寻址方式 ( Relative Based Index Addressing )
特点,(基址寄存器 ) + (变址寄存器 )+位移量 = 操作数的偏移地址
30000H+2000H +0250+1000H
= 33250H
要访问的存储单元 物理地址 为:
用途, 便于访问堆栈中的数组
要求, 熟练掌握前 6种 寻址方式,其中 前 3种 是 最基本 的寻
址方式,后 3种 是 重点 寻址方式。
2.2 指令系统
8086/8088指令系统中的指令按功能可分为 六类,
( 1) 数据传送指令 ( 2) 算术运算指令
( 3) 逻辑运算与移位指令 (4) 串操作指令
( 5)控制转移指令 ( 6)处理机控制指令
2.2.1 数据传送指令
(1) 通用传送指令
1) 传送指令 MOV
指令格式,MOV dst,src
执行操作, ( dst) ← ( src)
( dst:目的操作数, src:源操作数 )
功能,在 CPU与存储器之间或 CPU内部传送数据 。
标志位,不受影响
例, MOV AL,?E? 指令执行后, ( AL) = 45H
MOV指令的 语法形式,
( 1) MOV mem/regl,reg2
( 2) MOV regl,mem/reg2
( 3) MOV mem/reg,imm
其中, mem,存储器单元
reg,寄存器
imm,立即数
例,判断下列指令是否合法:
MOV DS,AX ?
不允许两个操作数都是存储器单元
MOV CS,AX ?
MOV CH,4050H ?
MOV DL,5BH ?
MOV DX,5BH ?
MOV DX,AL ?
MOV VA1,VA2 ?
MOV 45,DL ?
目的操作数不允许是 CS段寄存器
目的操作数不允许是立即数
数据类型不匹配
数据类型不匹配
next
调试工具 DEBUG简介
两种进入 DEBUG的方式:
( 1) H>DEBUG 程序名 参数
( 2) H>DEBUG
- ( 命令提示符 )
常用命令, (单字母命令,默认十六进制,但不加 H )
命令及功能 格式 例子
1,D 显示内存单元 D 地址 -D 100
D 地址范围 -D 100 107
2,E 修改内存单元 E 地址 字节串 -E 200 ‘Hello’
E 地址 -E 100
1742:0100 70.89
3,N 定义文件名 N 文件名 -N FILE.COM
命令及功能 格式 例子
4,R 显示寄存器 R 寄存器名 -R DX
R
6,U 反汇编 U 地址范围 -U 100 108
5,A 汇编源程序 A 地址 -A 100
汇编
符号语言指令 二进制代码指令
反汇编
7,L 装入文件 L 地址 -L 100
8,W 写文件 W 起始地址 -W 100
操作过程,
(1) –N FILE.COM (定义文件名 )
(2) –R BX (文件长度送 BX:CX)
–R CX
(3) –W 100 (写文件,数据区的内存起始地址为 100)
命令及功能 格式 例子
9,G 执行程序 G =起始地址 -G =200
10,T 跟踪程序 T =起始地址 -T =200
按地址逐条跟踪指令
11,P 跟踪程序 P =起始地址 -P =200
根据书写的指令逐条整条跟踪
上机程序例子,
1.显示一个字符
-A 100
MOV DL,41 ; ‘A’ -> DL
MOV AH,2 ; 功能号 2->AH
INT 21 ; DOS 功能调用 (显示一个字符 )
INT 20 ; 结束程序执行
-G =100
A
2,大写 ->小写
MOV DL,41 ; ‘A’ -> DL
OR DL,20 ; 大写 ->小写
MOV AH,2 ; 功能号 2->AH
INT 21 ; DOS 功能调用 (显示一个字符 )
INT 20 ; 结束程序执行
3,显示字符串
-A 100
MOV DX,120 ; 字符串地址 -> DX
MOV AH,9 ; 功能号 9->AH
INT 21 ; DOS 功能调用 (显示一个字符串 )
INT 20 ; 结束程序执行
-E 120 ‘How do you do.$’
-G =100
‘How do you do.’
4,从键盘输入字符并显示
-A 300
MOV AH,1 ; 功能号 1->AH
INT 21 ; DOS 功能调用 (输入一个字符 )
MOV DL,AL ; 输入字符 -> DL
MOV AH,2 ; 功能号 2->AH
INT 21 ; DOS 功能调用 (显示一个字符 )
INT 20 ; 结束程序执行
G =300
KK
next
2) 入栈指令 PUSH
指令格式, PUSH src
执行操作, ( SP) ← ( SP) -2
( (SP)+1,(SP)) ← (src)
功能,将指定的字数据压入栈顶
例, PUSH AX
POP BX
设:
( AX) = 3104H
( BX) = 1000H
执行指令前 \后状态,
3) 出栈指令 POP
指令格式, POP dst
执行操作, (dst) ← ( (SP)+1,(SP))
( SP) ← ( SP) +2
功能,将栈顶字数据弹出堆栈
31
04
? 堆栈段
栈顶SP
?
3001H
3002H
3003H
3004H
SP1,PUSH AX
AX BX
3104 1000
2,POP BX
AX BX
3104 3104
前,
后,
4) 交换指令 XCHG
指令格式, XCHG oprl,opr2
执行操作, ( opr1) ?( opr2)
功能,两个操作数互换
例, XCHG AX,BX
设 ( AX) =1024H ( BX) =2048H
指令执行后,
( AX) =2048H ( BX) =1024H
等效三条 MOV指令, MOV CX,AX
MOV AX,BX
MOV BX,CX
(2) 端口数据传送指令
(输入 /输出指令 IN/ OUT,第 5章介绍 )
(3) 地址传送指令
LEA指令 指令格式, LEA reg,src
执行操作, ( reg) ← src的偏移地址
功能, 将源操作数的偏移地址送指定寄存器
例, LEA DX,BUFFER
设, BUFFER单元的地址 = F000H, 4300H
指令执行后,
如果指令 改为, MOV DX,BUFFER
指令执行后,
( 4) 标志传送指令
( BUFFER) = 5000H
传送标志寄存器 FR中的标志位
PUSHF FR中的标志字 —>栈顶
POPF 栈顶的字数据出栈 —>FR
不影响 标志位
影响 标志位
(DX)= 4300H
(DX)= 5000H
设置 TF标志位:
( FR中的 TF=1 )
PUSHF
POP AX
OR AX,0100H
PUSH AX
POPF
2.2.2 算术运算指令
算术运算指令完成加, 减, 乘, 除
( 1) 加法指令 ( 完成 二进制 的加法, 带进位加法, 加 1)
1) 加法指令 ADD
ADD dst,src ( dst) ← (dst)+(src)
影响 CF,AF,OF,PF,SF,ZF 标志位 。
2) 带进位加法指令 ADC
ADC dst,src ( dst )←( dst )+( src )+CF( 进位标志位的值 )
3) 加 1指令 INC
INC opr ( opr) ← ( opr) +1 (不影响 CF )
CF=1:无符号数运算溢出 最高有效位有进位时, CF置 1
OF=1,带符号数运算溢出 两个同符号操作数的运算结
果符号发生变化时, OF置 1
CF,OF标志位在加法运算中的作用,
无符号数 带符号数
S1 1 1 1 1 1 1 1
255 -1
1 1 1 1 1 1 1 1
例, 用 ADD,ADC指令执行两个双字加法运算
计算,0002F360H+0005E020H = 0008D380H
设执行指令前, (DX)=0002H,(AX)=F360H,(BX)=0005H,(CX)=E020H
ADD AX,CX
ADC DX,BX
执行第一条指令 ADD:
F360H
+ E020H
(AX)=D380H,SF=1,ZF=0
CF=1,OF=0
执行第二条指令 ADC,
0002H
+ 0005H
+ 1H ( CF )
(DX)=0008H,SF=0,ZF=0
CF=0,OF=0
对于双字加法, 用 ADC指令:低位字加法的进位 —>高位字
1← D380H
0008H
0 ~ 255 127 ~ -128
例, INC CX
设指令执行前, (CX) = 0005H 指令执行后, (CX) = 0006H
INC常用于, 寄存器或存储器单元自增,修改计数器或地址,
比加法指令简便、效率高。
( 2)减法指令
完成二进制减法, 带借位减法, 减 1,求补和比较运算 。
1) 减法指令 SUB
SUB dst,src
2) 带借位减法指令 SBB
影响 AF,CF,OF,PF,SF,ZF标志位
(dst) ← (dst) - (src)
SBB dst,src (dst) ← (dst) – (src) - CF( 借位值 )
3) 减 1指令 DEC
DEC opr (opr) ← (opr) -1
ADD CX,1 (一般不用这种方式)
例:求补指令举例
NEG AL
设执行指令前,( AL) = 02H
执行指令时, 计算 0FFH -( AL) +1
1111 1111B
- 0000 0010B
等效求反
4)求补指令 NEG
NEG opr ( opr) ← 0FFH-( opr) +1( 字节操作 )或 ( opr) ← 0FFFFH-( opr) +1( 字操作 )
1111 1101B
FEH的原码十进制值是 -2
1111 1101B
+ 0000 0001B (AL) = FEH
1111 1110B
加 1FFH –(AL)
等效求补
NEG指令的功能, 改变操作数的符号
可用于取操作数的绝对
值
5)比较指令 CMP
CMP opr1,opr2 ( oprl) -( opr2)
例, 比较指令 CMP 举例
设指令为, CMP AX,CX
ZF =
CF =
指令执行后 如何判别 AX和 CX 的大小关系 (以无符号数为例 )?
1 即 ( AX) =( CX) (AX) - (CX) = 0
0 即 ( AX) ?( CX) (AX) - (CX) ? 0
1 即 ( AX) <( CX) 有借位
0 即 ( AX) >( CX) 无借位
CMP指令 仅仅做减法并设置标志位
判别大小关系由 条件转移指令 完成(后边介绍)。
?CMP和 SUB 的差别?(操作与用途)
(3) 乘法指令
两条,无符号数 乘法指令和 带符号数 乘法指令
MUL src 字节操作, (AX) ← (AL) * (src)字操作, (DX (
高位字 ),AX (低位字 )) ←( AX)* (src)
2)带符号数乘法指令 IMUL
IMUL src
1)无符号数乘法指令
如果 CF=OF=0,字节 乘 字节 的积 —>字节
字 乘 字 的积 —>字
标志位:影响 CF和 OF,其它标志位无定义。
操作与 MUL相似,不同处是 操作数为带符号数 。
如果 CF=OF=1,字节 乘 字节 的积 —>字
字 乘 字 的积 —>双字
CF 和 OF 标志位可判定乘积的数据类型,
例, 比较 无符号数 和 带符号数 乘法指令
设 指令执行前, ( AL) =A4H
( BL) =12H
(A4H) 无符号数 带符号数
164D -92D
(12H ) 无符号数 带符号数
18D 18D
执行 IMUL后, (AX)= F988H = -1656D CF= 1,OF= 1
执行 MUL后, (AX)= 0B88H= 2952D CF= 1,OF= 1
(4) 除法指令
IMUL BL
MUL BL
( 无符号数 和 带符号数 除法指令 )
1)无符号数除法指令
DIV src
字节操作,(AL)←(AX)/(src) 的 商
(AH)←(AX)/(src) 的 余数
字操作,(AX)←( DX,AX)/(src)的 商
(DX)←( DX,AX)/(src)的 余数
2) 带符号数除法指令
IDIV src (操作同 DIV)
?如果操作数 不满足 除法指令的要求, 怎么办?
例,93H/45H,被除数不是 16位, 应当扩展为 16位, 如何扩展?
简便起见, 以 3为例, 讨论二进制数位的扩展问题:
8位 的二进制 3 —> 0000 0011 扩展为 16位 0000 0000 0000 0011
8位 的二进制 -2 —> 1111 1110 扩展为 16位 1111 1111 1111 1110
数据位扩展方法,用符号位进行数位的扩展 。
有两条指令完成 符号扩展功能:
3) 字节转换为字指令
上述能保持符号的数据位扩展方法称为,符号扩展
CBW 执行操作,将 (AL)的符号扩展到 AH,构成字 (AX)
( AL ) 7 = 0 (AH)=00H1 (AH)=FFH
4) 字转换为双字指令
CWD 执行操作,将 ( AX) 的符号扩展到 DX,方法类似
例,设执行指令前,( AX) =0800H ( BL) =A4H
DIV BL
( AL) = 商
( 5) 十进制调整指令
( AH) = 余数执行指令后:
BCD码 —>建立了二进制与十进制的联系
算术运算指令 只能完成二进制运算, 十进制数调整指令可
对二进制运算结果进行调整, 得到用 BCD码表示的十进制数 。
BCD码有压缩和非压缩两种格式:
压缩的 BCD码:
4位 二进制数 —>1位 十进制数 ( 95,1001 0101 )BCD
非压缩的 BCD码:
8位 二进制数 —> 1位 十进制数 (95,0000 1001 0000 0101 )BCD
8位非压缩 BCD码的高 4位可以是 任意值,因此数字字符的
ASCII码 —>看成 一种非标准的压缩的 BCD码
例,?5?的 ASCII码为 35H( 0011 0101)BCD —> 5 (非压缩的 BCD码 )
28H
+ 36H
5EH
十进制调整指令也分为 压缩的 和 非压缩的 BCD码调整指令,
共有 6条 指令 。
加法的调整规则,
以压缩的 BCD码加法调整指令为例介绍十进制调整指令的
基本思路和方法,
分析, 例 1,十进制计算 28+36=64
用指令进行二进制加法运算的结果为,
写成 BCD码为,
(0010 1000 )BCD + (0011 0110 )BCD = ( 0110 0100 )BCD
问题, 逢十六进位
解决方法, 加 6补偿
5EH
+ 6H
64H ( 0110 0100 )BCD
例 2,十进制计算 28+69=97= ( 1001 0111 )BCD = 97H
28H
+ 69H
91H
问题, 逢十六进位
解决方法, 加 6补偿
91H
+ 6H
97H ( 1001 0111 )BCD
根据上述分析, 总结 加法的调整规则,
两个 BCD码数位相加后, 如果 产生了进位 或 和大于 9,加 6调整 。
十进制调整指令 DAA,
DAA ( AL) ← 把 AL中存放的加法的和调整为压缩的 BCD码
调整方法:
若 AF=1,或 ( AL )0~3=A~ F,则 ( AL) ← (AL) + 06H,AF=1
若 CF=1,或 ( AL )4~7=A~ F,则 ( AL) ← (AL) + H,CF=160
例,十进制加法计算,28+69=97
设执行指令前, (AL) =( 0010 1000) BCD= 28H (= 28D )
( CL) =( 0110 1001) BCD= 69H (= 69D )
执行的指令为, ADD AL,CL
DAA
执行 ADD指令, (AL) = 91H,CF=0,AF=1
执行 DAA指令, ( AL) ← (AL) + 06H = 91H +06H = 97H
( AL) =( 1001 0111) BCD=97D,CF=0,AF=1
( dst) ← ( dst)( src)
2.2.3 逻辑运算和移位指令
位操作指令可以体现汇编语言对硬件的控制能力。
( 1) 逻辑运算指令
按位进行逻辑与、或、异或、非运算、测试位的操作。
1) 逻辑与指令 AND
AND dst,src ( dst) ← ( dst) ∧ ( src)
2) 逻辑或指令 OR
OR dst,src
3)异或指令 XOR
XOR dst,src
( dst) ← ( dst) ∨ ( src)
4) 逻辑非指令 NOT
NOT opr ( opr) ← ( opr)求反
5)测试指令 TEST
TEST oprl,opr2 ( oprl) ∧ ( opr2)
?何时 该用 何种 逻辑操作?
0110
? 0 011
目的操作数
源操作数
0010
特点:源操作数
( 2) 逻辑或操作
( 3) 异或操作
( 1) 逻辑与操作 1 —保留原值
0110
? 0 011
目的操作数
源操作数
0111
0 —置 0
特点:源操作数 1 —置 10 —保留原值
0110
0011
目的操作数
源操作数
0101
特点:源操作数 1 —取反0 —保留原值
根据上述操作的特点, 可以确定该用什么操作实现需要的功能,
保留某些位 ( 其他位 清 0) 用逻辑与操作
某位置 1 用逻辑或操作, 某位求反 用异或操作
保留清 0
置 1
求反
保留
保留
?如何确定源操作数?
例,将 AL的 D0位和 D1位清 0。
设 ( AL) = BFH,指令为
AND AL,?
分析,1011 1111B
∧ 1111 1100B ( FCH)
1011 1100B
应将源操作数取为立即数 FCH,指令为
AND AL,0FCH
执行指令后,( AL) =BCH
例,将 AL中 的 大写字母转换为小写字母 ( AL) = 41H
即 41H 61H
指令为,OR AL,? 分析,0100 0001B ( 41H)∨ 0010 0000B ( 20H)
0110 0001B ( 61H)
20H
执行指令后,( AL) =61H
小写转换为大写的指令为:
AND AL,?0DFH ∧ 1101 1111B ( DFH)
0100 0001B ( 41H)执行指令后,( AL) =41H
根据需要的功能, 先确定 逻辑运算指令, 再利用逻辑运算
指令特点 确定源操作数 。
例:测试 AL的 D0位是否为 1。
MOV AL,0F3H ; 设 ( AL) =0F3H
TEST AL,01H
执行指令后,ZF=0
分析,1111 0011B
∧ 0000 0001B
0000 0001B根据 ZF=0可知 AL的 D0位为 1
指令系统有专门的指令来检测 ZF的设置, 从而控制程
序的处理流程 。
( 2) 移位指令 ( 分为 逻辑 移位, 算术 移位和 循环 移位三类 )
1) 逻辑左移指令
SHL opr,count
2) 算术左移指令
SAL opr,count
oprCF
补 0
SHL / SAL 移位
例:将 BL中的值逻辑左移 1位, 设 ( BL) =AFH
SHL BL,1 1 0 1 0 1 1 1 10 指令执行前
0 1 0 1 1 1 1 01 指令执行后执行指令后,( BL) =5EH
3) 逻辑右移指令
SHR opr,count
4) 算术右移指令
SAR opr,count
opr CF
补 0 SHR 移位
例, 将 BL中的值 逻辑右移 1位, 设 ( BL) =AFH
SHR BL,1 1 0 1 0 1 1 1 1 0 指令执行前
0 1 0 1 0 1 1 1 1 指令执行后执行指令后,( BL) =57H
S保持符号 SAR 移位
将 BL中的值 算术右移 1位,设( BL) =AFH
SAR BL,1 1 0 1 0 1 1 1 1 0 指令执行前
执行指令后:
( BL) =D7H 1 1 0 1 0 1 1 1 1 指令执行后
逻辑移位总是 补 0,算术移位 保持符号 。
5) 循环左移指令
ROL opr,count
6) 带进位 循环左移指令
RCL opr,count RCL 移位
7) 循环右移指令
ROR opr,count
8) 带进位 循环右移指令
RCR opr,count RCR 移位
CFopr
ROR 移位
CF opr
ROL 移位
例:将 BL中的值 循环左移 1位, 设 ( BL) =AFH
ROL BL,1 1 0 1 0 1 1 1 10 指令执行前
执行指令后:
( BL) =5FH 0 1 0 1 1 1 1 11 指令执行后
例,将 BX指向的存储器单元的高字节与低字节互换位置 。
MOV CL,8
ROR [BX],CL
5 B 4 0 0 指令执行前
设执行指令前:
(DS) =3000H,( BX) =0150H
(30150H) =5B40H
注意,如果 移位位数 大于 1,必须用 CL寄存器给出移位位数 。
执行指令后,( 30150H) =405BH, CF=0
指令执行后4 0 5 B 0
算术, 逻辑移位可用于,
改变数据的位置 ( 丢失移出的位 )
二进制的整次幂的乘法 ( 左移 ), 除法 ( 右移 )
算术移位 用于 带符号数 运算, 逻辑移位 用于 无符号数 运算
循环移位可用于:
改变数据的位置 ( 不丢失移动的位 )
2.2.4 串操作指令
传送, 比较, 搜索, 存, 取 字节串或字串
SI用于寻址源操作数 ( 存于数据段 ), 由 DS提供段地址
DI用于寻址目的操作数 ( 存于附加段 ), 由 ES提供段地址
执行一次串操作指令后 SI,DI中的 地址减小 ( DF=1)
SI,DI中的 地址增大 ( DF=0)
重复执行串操作指令 (由 CX控制次数 ), 实现串操作 。
(1) 串传送指令
MOVSB ( 字节操作 )
MOVSW ( 字操作 )
执行操作,( (DI)) ← ( (SI))
完成操作后, (SI)←( SI)± 1,(DI)←( DI)± 1
(SI)←( SI)± 2,(DI)←( DI)± 2
DF=0,取 +
DF=1,取 -
串传送指令与 重复操作前缀 联用, 就可以传送数据串 。
重复操作前缀 有下列三种形式:
1) 重复前缀
REP
2) 相等重复前缀
REPE/REPZ
3) 不相等重复前缀
REPNE/REPNZ
(CX)=0?
执行串操作指令
(CX) (CX) -1
(SI) (SI) +1
(DI) (DI) +1
是
否
退出执行
(CX)=0 或 ZF=0? 或 ZF =1
以 REP MOVSB为例, 串操作步骤:
( 1) 源串首地址 → SI
( 2) 目的串首地址 → DI
( 3) 串长度 → CX
( 4) 设置方向标志
( 5) 执行串操作指令,REP MOVSB
例,buffer l (4个字符 ) buffer2
程序如下, LEA SI,buffer1
LEA DI,buffer2
CLD
MOV CX,4
REP MOVSB
CLD DF=0 地址自动增
STD DF=1 地址自动减
数据段
附加段
REP MOVSB 指令操作
(CX)=0?
((DI)) ((SI))
(CX) (CX) -1
(SI) (SI) +1
(DI) (DI) +1
是
否
退出执行
v
e
m
o
…
…
…
存储器
o
v
e
buffer1m
buffer2
SI
DI
DS
ES …
…
…
…
…
DI
SI
串传送指令执行前、后的情况,
( 2) 串比较指令
CMPSB ( 字节操作 )
CMPSW (字操作)
完成操作,(( SI) ) - (( DI) )
例:比较存放在两个数组( string l和 string2)中的两个字符串
(14个字节 ) 是否相同,即比较 ( string l ) = ( string2 )?
程序如下,LEA SI,string l
LEA DI,string2
MOV CX,14
CLD
REPZ CMPSB 程序执行结果 如图所示
( 3) 串搜索指令
SCASB ( 字节操作 )
SCASW (字操作)
字节操作,( AL) -(( DI) ),( DI) ← ( DI) ± 1
字操作,( AX) -(( DI) ),( DI) ← ( DI) ± 2 next
?如何体现搜索功能?
DISI
…
…
数据段
t
n
string1 sSI
DS
…
…
r
i
…
…
t
r
i
s
ES
g
-
m
20000H
20002H
20004H
20006H
20008H
附加段
DIstring2
n
g
-
c
o…
25000H
25002H
25004H
25006H
25008H
2500AH2000AH
(SI)=0008H (DI)=5008H
返回
…o
( 4) 存串指令
STOSB ( 字节操作 )
STOSW (字操作)
字节操作,(( DI) )← ( AL), ( DI) ← ( DI) ± l
字操作,(( DI) )← ( AX),( DI) ← ( DI) ± 2
( 5) 取串指令
LODSB ( 字节操作 )
LODSW (字操作)
字节操作,( AL) ← (( SI) ),( SI) ← ( SI) ± 1
字操作,( AX) ← (( SI) ),( SI) ← ( SI) ± 2
例, 取串指令举例
LEA SI,BUF
MOV CX,50
CLD
REP LODSB? MOV AL,[SI]INC SILODSB
串操作指令与重复操作前缀的搭配,
REP 存串、串传送指令
REPE/REPZ 串比较指令
REPNE/REPNZ 串搜索指令
无 取串指令
2,2.5 标志位设置指令与处理机控制指令
( 1) 标志位设置指令 ( 7条 )
对指定的标志位操作:
CLC CF←0
CMC CF←CF 求反
STC CF←1
CLD DF←0
STD DF← 1
CLI IF← 0 关中断
STI IF← 1 开中断
( 2) 处理机控制指令
空操作指令, NOP
操作码为 90H,不执行任何操作
用于,1) 调程序时占用一个字节存储单元
2) 空耗一个指令执行周期 延时
XX
XX
90
指令 1
指令 2
指令 3
本章要求:
( 1) 寻址方式 是使用指令时首先面临的问题,要求
理解 寻址方式 的概念,正确使用寻址方式,熟练掌握
前 6种 寻址方式,其中前 3种是最基本的寻址方式,后
3种是重点寻址方式 ;
( 2)掌握 常用指令 是编写汇编语言程序的基础,要
熟悉常用指令的 功能、用法、用途 及 限制 ;
( 3)掌握指令的标准:
1)执行指令前的准备工作
2)执行指令后的结果存在何处?如何表现?
3)寻址方式
4)如何影响标志位?
5)有何限制?
小 结
( REP MOVSB )
( SUB
CMP )( MUL BL SUB VAL2,VAL1 )
( ADD 500,AH )
认真复习,融会贯通
GOTO 第三章
指令系统, 计算机提供给用户使用的指令集
双操作数指令格式,操作码 操作数,操作数目的 源
例如,MOV AX,100
MOV AX,BX
MOV AX,[BX]
要访问操作数,首先必须确定 如何形成操作数的地址 。
确定获得操作数地址的方法寻址方式:
操作结果 替代 目的操作数
不影响 源操作数
寻址方式选择得正确与否,直接影响程序的执行效率。
2.1 寻址方式
寻址方式分类,1)与数据有关 的寻址方式2)与转移地址有关 的寻址方式, 确定内存单元的地址
有 7 种 与数据有关的寻址方式
,确定转移地址
以 MOV指令为例, MOV 目的 操作数,源操作数
对 源操作数 分别使用 7 种 寻址方式如下:
( 1) 立即寻址方式 ( Immediate Addressing )
特点, 操作数包含在指令中
操作数是指令的组成部分,可以是 8位或 16位,取出指令就
立即获得 操作数 ——立即数
例 1,MOV AL,5
执行指令后, (AL) = 05H B0
05
存储器
指令
05
AL
例 2,MOV AX,3045H
执行指令后, (AX) = 3045H
指令
45
AX
OP
45
存储器
30
30
低地址
高地址
用途, 给变量或寄存器赋常量值
限制, 只能用于源操作数
( 2) 寄存器寻址方式 ( Register Addressing )
特点,操作数存在寄存器中
例, MOV AX,BX
执行指令前, (AX) = 3045H (BX) = 4000H
执行指令后, (AX) = 4000H (BX) = 4000H
用途, 用寄存器提供操作数时存取速度快
指令
2000H
50
30
…
…
…
…
存储器
代码段
op
00
20
数据段30000H
32000H
AX
用途, 用于存取单个变量中的操作数
30 50
例,设 ( DS ) = 3000H
MOV AX,[2000H]
( 3) 直接寻址方式 ( Direct Addressing )
特点,操作数的偏移地址包含在指令中
要访问的存储单元 物理地址 为:
30000H+2000H=32000H
设, (32000H)=3050H
执行指令后, (AX)=3050H
如果 2000H单元在附加段,指令为,MOV AX,ES:[2000H]
段跨越前缀, 段寄存器名, —— 改变默认使用的段寄存器
MOV AX,NUM
1000H
AX
用途, 可 用于处理数组
50 A0
A0
50
…
…
…
存储器
数据段20000H
21000H
XX
XX
21002H
例,设 ( DS ) = 2000H
( BX ) = 1000H
指令为, MOV AX,[ BX ] 数组起始地址
( 4) 寄存器间接寻址方式 ( Register Indirect Addressing )
特点, (寄存器 ) = 操作数的偏移地址
计算操作数物理地址的公式,
1) 操作数物理地址 =( DS) ?16+
2) 操作数物理地址 =( SS) ?16+( BP)
(BX)
(SI)
(DI)
20000H+1000H = 21000H
要访问的存储单元
物理地址 为:
设, (21000H)=50A0H
执行指令后, (AX)=50A0H
指令
4000H
30000H
AX
(寄存器相对寻址方式)
12 34
例:设 ( DS ) = 3000H
ARRAY=4000H
( SI ) = 2000H
指令为, MOV AX,ARRAY[ SI ]
34
12…
…
…
…
存储器
代码段
op
00
40
数据段
36000H
op
…2000H
数组起始地址
( 5) 变址寻址方式 ( Indexed Addressing )
特点,(变址、基址寄存器 ) +指令中的位移量 = 操作数的偏移地址
计算操作数物理地址的公式,
1) 操作数物理地址 =(DS)?16+
2) 操作数物理地址 =( SS)?16+ (BP) + 8位位移量16位位移量
30000H+4000H +2000H= 36000H
要访问的存储单元
物理地址 为:
设, (36000H)=1234H
用途, 可 用于处理数组
执行指令后, (AX)=1234H
+
(SI)
(DI)
(BX)
8位位移量
16位位移量
0158H
AX
12 34
例:设 ( DS ) = 2100H
( BX ) = 0158H
( DI ) = 1000H
指令为, MOV AX,[BX+DI]
34
12
…
…
…
存储器
数据段21000H
22158H
1000H
数组起始地址
( 6) 基址 变址寻址方式 ( Based Index Addressing )
特点,(基址寄存器 ) + (变址寄存器 ) = 操作数的偏移地址
计算操作数物理地址的公式,
1) 操作数物理地址 =(DS)?16+
2) 操作数物理地址 =( SS)?16+ (BP) +
(BX) + (SI)(DI)
(SI)
(DI)
21000H+0158H +1000H= 22158H
要访问的存储单元
物理地址 为:
设, (22158H)=1234H
执行指令后, (AX)=1234H
用途, 可 用于处理数组
几种 可处理数组 的 寻址方式 的比较,
1,MOV AX,[BX]
2,MOV AX,ARRAY [SI]
3,MOV AX,[BX][SI]
寄存器间接寻址方式
变址寻址方式
基址变址寻址方式
特点, 可读性好,指令中明确指出了要处理的数组。
限制,写程序时必须清楚要处理什么数组。
特点, 适用于要处理的数组需要在程序运行中动态确定,
并且修改 BX就可以处理不同的数组。
特点, 适用于要处理的数组需要在程序运行中动态确定,
且形式简单。
?上述 1.和 2.指令中的 [寄存器 ]还可被哪些寄存器替换?
DI SI BP (加 段跨越前缀 DS,或 ES)
?上述 3.指令中的 BX寄存器是否可被其他寄存器替换?
DI BX BP (加 段跨越前缀 DS,或 ES)
next
指令
2000H
AX
12 34
例:设 ( SS ) = 3000H
( BP ) = 2000H
ARRAY = 0250H
( SI ) = 1000H
MOV AX,ARRAY[BP][SI]
1000H
30000H
34
12…
…
…
…
存储器
代码段
op
50
02
堆栈段
33250H
op
…
? ?
…
0250H
栈顶
数组首址
( 7)相对基址 变址寻址方式 ( Relative Based Index Addressing )
特点,(基址寄存器 ) + (变址寄存器 )+位移量 = 操作数的偏移地址
30000H+2000H +0250+1000H
= 33250H
要访问的存储单元 物理地址 为:
用途, 便于访问堆栈中的数组
要求, 熟练掌握前 6种 寻址方式,其中 前 3种 是 最基本 的寻
址方式,后 3种 是 重点 寻址方式。
2.2 指令系统
8086/8088指令系统中的指令按功能可分为 六类,
( 1) 数据传送指令 ( 2) 算术运算指令
( 3) 逻辑运算与移位指令 (4) 串操作指令
( 5)控制转移指令 ( 6)处理机控制指令
2.2.1 数据传送指令
(1) 通用传送指令
1) 传送指令 MOV
指令格式,MOV dst,src
执行操作, ( dst) ← ( src)
( dst:目的操作数, src:源操作数 )
功能,在 CPU与存储器之间或 CPU内部传送数据 。
标志位,不受影响
例, MOV AL,?E? 指令执行后, ( AL) = 45H
MOV指令的 语法形式,
( 1) MOV mem/regl,reg2
( 2) MOV regl,mem/reg2
( 3) MOV mem/reg,imm
其中, mem,存储器单元
reg,寄存器
imm,立即数
例,判断下列指令是否合法:
MOV DS,AX ?
不允许两个操作数都是存储器单元
MOV CS,AX ?
MOV CH,4050H ?
MOV DL,5BH ?
MOV DX,5BH ?
MOV DX,AL ?
MOV VA1,VA2 ?
MOV 45,DL ?
目的操作数不允许是 CS段寄存器
目的操作数不允许是立即数
数据类型不匹配
数据类型不匹配
next
调试工具 DEBUG简介
两种进入 DEBUG的方式:
( 1) H>DEBUG 程序名 参数
( 2) H>DEBUG
- ( 命令提示符 )
常用命令, (单字母命令,默认十六进制,但不加 H )
命令及功能 格式 例子
1,D 显示内存单元 D 地址 -D 100
D 地址范围 -D 100 107
2,E 修改内存单元 E 地址 字节串 -E 200 ‘Hello’
E 地址 -E 100
1742:0100 70.89
3,N 定义文件名 N 文件名 -N FILE.COM
命令及功能 格式 例子
4,R 显示寄存器 R 寄存器名 -R DX
R
6,U 反汇编 U 地址范围 -U 100 108
5,A 汇编源程序 A 地址 -A 100
汇编
符号语言指令 二进制代码指令
反汇编
7,L 装入文件 L 地址 -L 100
8,W 写文件 W 起始地址 -W 100
操作过程,
(1) –N FILE.COM (定义文件名 )
(2) –R BX (文件长度送 BX:CX)
–R CX
(3) –W 100 (写文件,数据区的内存起始地址为 100)
命令及功能 格式 例子
9,G 执行程序 G =起始地址 -G =200
10,T 跟踪程序 T =起始地址 -T =200
按地址逐条跟踪指令
11,P 跟踪程序 P =起始地址 -P =200
根据书写的指令逐条整条跟踪
上机程序例子,
1.显示一个字符
-A 100
MOV DL,41 ; ‘A’ -> DL
MOV AH,2 ; 功能号 2->AH
INT 21 ; DOS 功能调用 (显示一个字符 )
INT 20 ; 结束程序执行
-G =100
A
2,大写 ->小写
MOV DL,41 ; ‘A’ -> DL
OR DL,20 ; 大写 ->小写
MOV AH,2 ; 功能号 2->AH
INT 21 ; DOS 功能调用 (显示一个字符 )
INT 20 ; 结束程序执行
3,显示字符串
-A 100
MOV DX,120 ; 字符串地址 -> DX
MOV AH,9 ; 功能号 9->AH
INT 21 ; DOS 功能调用 (显示一个字符串 )
INT 20 ; 结束程序执行
-E 120 ‘How do you do.$’
-G =100
‘How do you do.’
4,从键盘输入字符并显示
-A 300
MOV AH,1 ; 功能号 1->AH
INT 21 ; DOS 功能调用 (输入一个字符 )
MOV DL,AL ; 输入字符 -> DL
MOV AH,2 ; 功能号 2->AH
INT 21 ; DOS 功能调用 (显示一个字符 )
INT 20 ; 结束程序执行
G =300
KK
next
2) 入栈指令 PUSH
指令格式, PUSH src
执行操作, ( SP) ← ( SP) -2
( (SP)+1,(SP)) ← (src)
功能,将指定的字数据压入栈顶
例, PUSH AX
POP BX
设:
( AX) = 3104H
( BX) = 1000H
执行指令前 \后状态,
3) 出栈指令 POP
指令格式, POP dst
执行操作, (dst) ← ( (SP)+1,(SP))
( SP) ← ( SP) +2
功能,将栈顶字数据弹出堆栈
31
04
? 堆栈段
栈顶SP
?
3001H
3002H
3003H
3004H
SP1,PUSH AX
AX BX
3104 1000
2,POP BX
AX BX
3104 3104
前,
后,
4) 交换指令 XCHG
指令格式, XCHG oprl,opr2
执行操作, ( opr1) ?( opr2)
功能,两个操作数互换
例, XCHG AX,BX
设 ( AX) =1024H ( BX) =2048H
指令执行后,
( AX) =2048H ( BX) =1024H
等效三条 MOV指令, MOV CX,AX
MOV AX,BX
MOV BX,CX
(2) 端口数据传送指令
(输入 /输出指令 IN/ OUT,第 5章介绍 )
(3) 地址传送指令
LEA指令 指令格式, LEA reg,src
执行操作, ( reg) ← src的偏移地址
功能, 将源操作数的偏移地址送指定寄存器
例, LEA DX,BUFFER
设, BUFFER单元的地址 = F000H, 4300H
指令执行后,
如果指令 改为, MOV DX,BUFFER
指令执行后,
( 4) 标志传送指令
( BUFFER) = 5000H
传送标志寄存器 FR中的标志位
PUSHF FR中的标志字 —>栈顶
POPF 栈顶的字数据出栈 —>FR
不影响 标志位
影响 标志位
(DX)= 4300H
(DX)= 5000H
设置 TF标志位:
( FR中的 TF=1 )
PUSHF
POP AX
OR AX,0100H
PUSH AX
POPF
2.2.2 算术运算指令
算术运算指令完成加, 减, 乘, 除
( 1) 加法指令 ( 完成 二进制 的加法, 带进位加法, 加 1)
1) 加法指令 ADD
ADD dst,src ( dst) ← (dst)+(src)
影响 CF,AF,OF,PF,SF,ZF 标志位 。
2) 带进位加法指令 ADC
ADC dst,src ( dst )←( dst )+( src )+CF( 进位标志位的值 )
3) 加 1指令 INC
INC opr ( opr) ← ( opr) +1 (不影响 CF )
CF=1:无符号数运算溢出 最高有效位有进位时, CF置 1
OF=1,带符号数运算溢出 两个同符号操作数的运算结
果符号发生变化时, OF置 1
CF,OF标志位在加法运算中的作用,
无符号数 带符号数
S1 1 1 1 1 1 1 1
255 -1
1 1 1 1 1 1 1 1
例, 用 ADD,ADC指令执行两个双字加法运算
计算,0002F360H+0005E020H = 0008D380H
设执行指令前, (DX)=0002H,(AX)=F360H,(BX)=0005H,(CX)=E020H
ADD AX,CX
ADC DX,BX
执行第一条指令 ADD:
F360H
+ E020H
(AX)=D380H,SF=1,ZF=0
CF=1,OF=0
执行第二条指令 ADC,
0002H
+ 0005H
+ 1H ( CF )
(DX)=0008H,SF=0,ZF=0
CF=0,OF=0
对于双字加法, 用 ADC指令:低位字加法的进位 —>高位字
1← D380H
0008H
0 ~ 255 127 ~ -128
例, INC CX
设指令执行前, (CX) = 0005H 指令执行后, (CX) = 0006H
INC常用于, 寄存器或存储器单元自增,修改计数器或地址,
比加法指令简便、效率高。
( 2)减法指令
完成二进制减法, 带借位减法, 减 1,求补和比较运算 。
1) 减法指令 SUB
SUB dst,src
2) 带借位减法指令 SBB
影响 AF,CF,OF,PF,SF,ZF标志位
(dst) ← (dst) - (src)
SBB dst,src (dst) ← (dst) – (src) - CF( 借位值 )
3) 减 1指令 DEC
DEC opr (opr) ← (opr) -1
ADD CX,1 (一般不用这种方式)
例:求补指令举例
NEG AL
设执行指令前,( AL) = 02H
执行指令时, 计算 0FFH -( AL) +1
1111 1111B
- 0000 0010B
等效求反
4)求补指令 NEG
NEG opr ( opr) ← 0FFH-( opr) +1( 字节操作 )或 ( opr) ← 0FFFFH-( opr) +1( 字操作 )
1111 1101B
FEH的原码十进制值是 -2
1111 1101B
+ 0000 0001B (AL) = FEH
1111 1110B
加 1FFH –(AL)
等效求补
NEG指令的功能, 改变操作数的符号
可用于取操作数的绝对
值
5)比较指令 CMP
CMP opr1,opr2 ( oprl) -( opr2)
例, 比较指令 CMP 举例
设指令为, CMP AX,CX
ZF =
CF =
指令执行后 如何判别 AX和 CX 的大小关系 (以无符号数为例 )?
1 即 ( AX) =( CX) (AX) - (CX) = 0
0 即 ( AX) ?( CX) (AX) - (CX) ? 0
1 即 ( AX) <( CX) 有借位
0 即 ( AX) >( CX) 无借位
CMP指令 仅仅做减法并设置标志位
判别大小关系由 条件转移指令 完成(后边介绍)。
?CMP和 SUB 的差别?(操作与用途)
(3) 乘法指令
两条,无符号数 乘法指令和 带符号数 乘法指令
MUL src 字节操作, (AX) ← (AL) * (src)字操作, (DX (
高位字 ),AX (低位字 )) ←( AX)* (src)
2)带符号数乘法指令 IMUL
IMUL src
1)无符号数乘法指令
如果 CF=OF=0,字节 乘 字节 的积 —>字节
字 乘 字 的积 —>字
标志位:影响 CF和 OF,其它标志位无定义。
操作与 MUL相似,不同处是 操作数为带符号数 。
如果 CF=OF=1,字节 乘 字节 的积 —>字
字 乘 字 的积 —>双字
CF 和 OF 标志位可判定乘积的数据类型,
例, 比较 无符号数 和 带符号数 乘法指令
设 指令执行前, ( AL) =A4H
( BL) =12H
(A4H) 无符号数 带符号数
164D -92D
(12H ) 无符号数 带符号数
18D 18D
执行 IMUL后, (AX)= F988H = -1656D CF= 1,OF= 1
执行 MUL后, (AX)= 0B88H= 2952D CF= 1,OF= 1
(4) 除法指令
IMUL BL
MUL BL
( 无符号数 和 带符号数 除法指令 )
1)无符号数除法指令
DIV src
字节操作,(AL)←(AX)/(src) 的 商
(AH)←(AX)/(src) 的 余数
字操作,(AX)←( DX,AX)/(src)的 商
(DX)←( DX,AX)/(src)的 余数
2) 带符号数除法指令
IDIV src (操作同 DIV)
?如果操作数 不满足 除法指令的要求, 怎么办?
例,93H/45H,被除数不是 16位, 应当扩展为 16位, 如何扩展?
简便起见, 以 3为例, 讨论二进制数位的扩展问题:
8位 的二进制 3 —> 0000 0011 扩展为 16位 0000 0000 0000 0011
8位 的二进制 -2 —> 1111 1110 扩展为 16位 1111 1111 1111 1110
数据位扩展方法,用符号位进行数位的扩展 。
有两条指令完成 符号扩展功能:
3) 字节转换为字指令
上述能保持符号的数据位扩展方法称为,符号扩展
CBW 执行操作,将 (AL)的符号扩展到 AH,构成字 (AX)
( AL ) 7 = 0 (AH)=00H1 (AH)=FFH
4) 字转换为双字指令
CWD 执行操作,将 ( AX) 的符号扩展到 DX,方法类似
例,设执行指令前,( AX) =0800H ( BL) =A4H
DIV BL
( AL) = 商
( 5) 十进制调整指令
( AH) = 余数执行指令后:
BCD码 —>建立了二进制与十进制的联系
算术运算指令 只能完成二进制运算, 十进制数调整指令可
对二进制运算结果进行调整, 得到用 BCD码表示的十进制数 。
BCD码有压缩和非压缩两种格式:
压缩的 BCD码:
4位 二进制数 —>1位 十进制数 ( 95,1001 0101 )BCD
非压缩的 BCD码:
8位 二进制数 —> 1位 十进制数 (95,0000 1001 0000 0101 )BCD
8位非压缩 BCD码的高 4位可以是 任意值,因此数字字符的
ASCII码 —>看成 一种非标准的压缩的 BCD码
例,?5?的 ASCII码为 35H( 0011 0101)BCD —> 5 (非压缩的 BCD码 )
28H
+ 36H
5EH
十进制调整指令也分为 压缩的 和 非压缩的 BCD码调整指令,
共有 6条 指令 。
加法的调整规则,
以压缩的 BCD码加法调整指令为例介绍十进制调整指令的
基本思路和方法,
分析, 例 1,十进制计算 28+36=64
用指令进行二进制加法运算的结果为,
写成 BCD码为,
(0010 1000 )BCD + (0011 0110 )BCD = ( 0110 0100 )BCD
问题, 逢十六进位
解决方法, 加 6补偿
5EH
+ 6H
64H ( 0110 0100 )BCD
例 2,十进制计算 28+69=97= ( 1001 0111 )BCD = 97H
28H
+ 69H
91H
问题, 逢十六进位
解决方法, 加 6补偿
91H
+ 6H
97H ( 1001 0111 )BCD
根据上述分析, 总结 加法的调整规则,
两个 BCD码数位相加后, 如果 产生了进位 或 和大于 9,加 6调整 。
十进制调整指令 DAA,
DAA ( AL) ← 把 AL中存放的加法的和调整为压缩的 BCD码
调整方法:
若 AF=1,或 ( AL )0~3=A~ F,则 ( AL) ← (AL) + 06H,AF=1
若 CF=1,或 ( AL )4~7=A~ F,则 ( AL) ← (AL) + H,CF=160
例,十进制加法计算,28+69=97
设执行指令前, (AL) =( 0010 1000) BCD= 28H (= 28D )
( CL) =( 0110 1001) BCD= 69H (= 69D )
执行的指令为, ADD AL,CL
DAA
执行 ADD指令, (AL) = 91H,CF=0,AF=1
执行 DAA指令, ( AL) ← (AL) + 06H = 91H +06H = 97H
( AL) =( 1001 0111) BCD=97D,CF=0,AF=1
( dst) ← ( dst)( src)
2.2.3 逻辑运算和移位指令
位操作指令可以体现汇编语言对硬件的控制能力。
( 1) 逻辑运算指令
按位进行逻辑与、或、异或、非运算、测试位的操作。
1) 逻辑与指令 AND
AND dst,src ( dst) ← ( dst) ∧ ( src)
2) 逻辑或指令 OR
OR dst,src
3)异或指令 XOR
XOR dst,src
( dst) ← ( dst) ∨ ( src)
4) 逻辑非指令 NOT
NOT opr ( opr) ← ( opr)求反
5)测试指令 TEST
TEST oprl,opr2 ( oprl) ∧ ( opr2)
?何时 该用 何种 逻辑操作?
0110
? 0 011
目的操作数
源操作数
0010
特点:源操作数
( 2) 逻辑或操作
( 3) 异或操作
( 1) 逻辑与操作 1 —保留原值
0110
? 0 011
目的操作数
源操作数
0111
0 —置 0
特点:源操作数 1 —置 10 —保留原值
0110
0011
目的操作数
源操作数
0101
特点:源操作数 1 —取反0 —保留原值
根据上述操作的特点, 可以确定该用什么操作实现需要的功能,
保留某些位 ( 其他位 清 0) 用逻辑与操作
某位置 1 用逻辑或操作, 某位求反 用异或操作
保留清 0
置 1
求反
保留
保留
?如何确定源操作数?
例,将 AL的 D0位和 D1位清 0。
设 ( AL) = BFH,指令为
AND AL,?
分析,1011 1111B
∧ 1111 1100B ( FCH)
1011 1100B
应将源操作数取为立即数 FCH,指令为
AND AL,0FCH
执行指令后,( AL) =BCH
例,将 AL中 的 大写字母转换为小写字母 ( AL) = 41H
即 41H 61H
指令为,OR AL,? 分析,0100 0001B ( 41H)∨ 0010 0000B ( 20H)
0110 0001B ( 61H)
20H
执行指令后,( AL) =61H
小写转换为大写的指令为:
AND AL,?0DFH ∧ 1101 1111B ( DFH)
0100 0001B ( 41H)执行指令后,( AL) =41H
根据需要的功能, 先确定 逻辑运算指令, 再利用逻辑运算
指令特点 确定源操作数 。
例:测试 AL的 D0位是否为 1。
MOV AL,0F3H ; 设 ( AL) =0F3H
TEST AL,01H
执行指令后,ZF=0
分析,1111 0011B
∧ 0000 0001B
0000 0001B根据 ZF=0可知 AL的 D0位为 1
指令系统有专门的指令来检测 ZF的设置, 从而控制程
序的处理流程 。
( 2) 移位指令 ( 分为 逻辑 移位, 算术 移位和 循环 移位三类 )
1) 逻辑左移指令
SHL opr,count
2) 算术左移指令
SAL opr,count
oprCF
补 0
SHL / SAL 移位
例:将 BL中的值逻辑左移 1位, 设 ( BL) =AFH
SHL BL,1 1 0 1 0 1 1 1 10 指令执行前
0 1 0 1 1 1 1 01 指令执行后执行指令后,( BL) =5EH
3) 逻辑右移指令
SHR opr,count
4) 算术右移指令
SAR opr,count
opr CF
补 0 SHR 移位
例, 将 BL中的值 逻辑右移 1位, 设 ( BL) =AFH
SHR BL,1 1 0 1 0 1 1 1 1 0 指令执行前
0 1 0 1 0 1 1 1 1 指令执行后执行指令后,( BL) =57H
S保持符号 SAR 移位
将 BL中的值 算术右移 1位,设( BL) =AFH
SAR BL,1 1 0 1 0 1 1 1 1 0 指令执行前
执行指令后:
( BL) =D7H 1 1 0 1 0 1 1 1 1 指令执行后
逻辑移位总是 补 0,算术移位 保持符号 。
5) 循环左移指令
ROL opr,count
6) 带进位 循环左移指令
RCL opr,count RCL 移位
7) 循环右移指令
ROR opr,count
8) 带进位 循环右移指令
RCR opr,count RCR 移位
CFopr
ROR 移位
CF opr
ROL 移位
例:将 BL中的值 循环左移 1位, 设 ( BL) =AFH
ROL BL,1 1 0 1 0 1 1 1 10 指令执行前
执行指令后:
( BL) =5FH 0 1 0 1 1 1 1 11 指令执行后
例,将 BX指向的存储器单元的高字节与低字节互换位置 。
MOV CL,8
ROR [BX],CL
5 B 4 0 0 指令执行前
设执行指令前:
(DS) =3000H,( BX) =0150H
(30150H) =5B40H
注意,如果 移位位数 大于 1,必须用 CL寄存器给出移位位数 。
执行指令后,( 30150H) =405BH, CF=0
指令执行后4 0 5 B 0
算术, 逻辑移位可用于,
改变数据的位置 ( 丢失移出的位 )
二进制的整次幂的乘法 ( 左移 ), 除法 ( 右移 )
算术移位 用于 带符号数 运算, 逻辑移位 用于 无符号数 运算
循环移位可用于:
改变数据的位置 ( 不丢失移动的位 )
2.2.4 串操作指令
传送, 比较, 搜索, 存, 取 字节串或字串
SI用于寻址源操作数 ( 存于数据段 ), 由 DS提供段地址
DI用于寻址目的操作数 ( 存于附加段 ), 由 ES提供段地址
执行一次串操作指令后 SI,DI中的 地址减小 ( DF=1)
SI,DI中的 地址增大 ( DF=0)
重复执行串操作指令 (由 CX控制次数 ), 实现串操作 。
(1) 串传送指令
MOVSB ( 字节操作 )
MOVSW ( 字操作 )
执行操作,( (DI)) ← ( (SI))
完成操作后, (SI)←( SI)± 1,(DI)←( DI)± 1
(SI)←( SI)± 2,(DI)←( DI)± 2
DF=0,取 +
DF=1,取 -
串传送指令与 重复操作前缀 联用, 就可以传送数据串 。
重复操作前缀 有下列三种形式:
1) 重复前缀
REP
2) 相等重复前缀
REPE/REPZ
3) 不相等重复前缀
REPNE/REPNZ
(CX)=0?
执行串操作指令
(CX) (CX) -1
(SI) (SI) +1
(DI) (DI) +1
是
否
退出执行
(CX)=0 或 ZF=0? 或 ZF =1
以 REP MOVSB为例, 串操作步骤:
( 1) 源串首地址 → SI
( 2) 目的串首地址 → DI
( 3) 串长度 → CX
( 4) 设置方向标志
( 5) 执行串操作指令,REP MOVSB
例,buffer l (4个字符 ) buffer2
程序如下, LEA SI,buffer1
LEA DI,buffer2
CLD
MOV CX,4
REP MOVSB
CLD DF=0 地址自动增
STD DF=1 地址自动减
数据段
附加段
REP MOVSB 指令操作
(CX)=0?
((DI)) ((SI))
(CX) (CX) -1
(SI) (SI) +1
(DI) (DI) +1
是
否
退出执行
v
e
m
o
…
…
…
存储器
o
v
e
buffer1m
buffer2
SI
DI
DS
ES …
…
…
…
…
DI
SI
串传送指令执行前、后的情况,
( 2) 串比较指令
CMPSB ( 字节操作 )
CMPSW (字操作)
完成操作,(( SI) ) - (( DI) )
例:比较存放在两个数组( string l和 string2)中的两个字符串
(14个字节 ) 是否相同,即比较 ( string l ) = ( string2 )?
程序如下,LEA SI,string l
LEA DI,string2
MOV CX,14
CLD
REPZ CMPSB 程序执行结果 如图所示
( 3) 串搜索指令
SCASB ( 字节操作 )
SCASW (字操作)
字节操作,( AL) -(( DI) ),( DI) ← ( DI) ± 1
字操作,( AX) -(( DI) ),( DI) ← ( DI) ± 2 next
?如何体现搜索功能?
DISI
…
…
数据段
t
n
string1 sSI
DS
…
…
r
i
…
…
t
r
i
s
ES
g
-
m
20000H
20002H
20004H
20006H
20008H
附加段
DIstring2
n
g
-
c
o…
25000H
25002H
25004H
25006H
25008H
2500AH2000AH
(SI)=0008H (DI)=5008H
返回
…o
( 4) 存串指令
STOSB ( 字节操作 )
STOSW (字操作)
字节操作,(( DI) )← ( AL), ( DI) ← ( DI) ± l
字操作,(( DI) )← ( AX),( DI) ← ( DI) ± 2
( 5) 取串指令
LODSB ( 字节操作 )
LODSW (字操作)
字节操作,( AL) ← (( SI) ),( SI) ← ( SI) ± 1
字操作,( AX) ← (( SI) ),( SI) ← ( SI) ± 2
例, 取串指令举例
LEA SI,BUF
MOV CX,50
CLD
REP LODSB? MOV AL,[SI]INC SILODSB
串操作指令与重复操作前缀的搭配,
REP 存串、串传送指令
REPE/REPZ 串比较指令
REPNE/REPNZ 串搜索指令
无 取串指令
2,2.5 标志位设置指令与处理机控制指令
( 1) 标志位设置指令 ( 7条 )
对指定的标志位操作:
CLC CF←0
CMC CF←CF 求反
STC CF←1
CLD DF←0
STD DF← 1
CLI IF← 0 关中断
STI IF← 1 开中断
( 2) 处理机控制指令
空操作指令, NOP
操作码为 90H,不执行任何操作
用于,1) 调程序时占用一个字节存储单元
2) 空耗一个指令执行周期 延时
XX
XX
90
指令 1
指令 2
指令 3
本章要求:
( 1) 寻址方式 是使用指令时首先面临的问题,要求
理解 寻址方式 的概念,正确使用寻址方式,熟练掌握
前 6种 寻址方式,其中前 3种是最基本的寻址方式,后
3种是重点寻址方式 ;
( 2)掌握 常用指令 是编写汇编语言程序的基础,要
熟悉常用指令的 功能、用法、用途 及 限制 ;
( 3)掌握指令的标准:
1)执行指令前的准备工作
2)执行指令后的结果存在何处?如何表现?
3)寻址方式
4)如何影响标志位?
5)有何限制?
小 结
( REP MOVSB )
( SUB
CMP )( MUL BL SUB VAL2,VAL1 )
( ADD 500,AH )
认真复习,融会贯通
GOTO 第三章