第 2 章教学重点重点掌握常用指令功能及应用
常用传送指令
加减法指令
逻辑运算和移位指令
控制转移指令
字符 ( 串 ) 输入输出功能调用第 2 章 什么是指令系统
计算机的指令系统就是指该计算机能够执行的全部指令的集合
每种计算机都有它支持的指令集合
16位 8086指令系统是 Intel 80x86系列微处理器指令系统的基础
Intel 80x86系列微处理器指令系统:
整数指令
浮点指令
多媒体指令第 2 章 8086指令系统概述
Intel 8086指令系统共有 117条基本指令
可分成 6个功能组
① 数据传送类指令
② 算术运算类指令
③ 位操作类指令
④ 串操作类指令
⑤ 控制转移类指令
⑥ 处理机控制类指令第 2 章 学习指令的注意事项
指令的功能 —— 该指令能够实现何种操作 。
通常指令助记符就是指令功能的英文单词或其缩写形式
指令支持的寻址方式 —— 该指令中的操作数可以采用何种寻址方式
指令对标志的影响 —— 该指令执行后是否对各个标志位有影响,以及如何影响
其他方面 —— 该指令其他需要特别注意的地方,如指令执行时的约定设置,必须预置的参数,隐含使用的寄存器等第 2 章 汇编语言指令格式
由 4部分组成:
标号,指令助记符 目的操作数,源操作数 ; 注释标号 表示该指令在主存中的逻辑地址每个指令 助记符 就代表一种指令目的和源 操作数 表示参与操作的对象注释 是对该指令或程序段功能的说明教学提示全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键第 2 章 2.1 数据传送类指令
数据传送是计算机中最基本,最重要的一种操作
传送指令也是最常使用的一类指令
传送指令把数据从一个位置传送到另一个位置
除标志寄存器传送指令外,均 不影响标志 位
重点掌握
MOV XCHG
PUSH POP
LEA
第 2 章 2.1.1 通用数据传送指令
提供方便灵活的通用传送操作
有 3条指令
MOV
XCHG
XLAT
MOV
XCHG XLAT
第 2 章 1,传送指令 MOV( move)
把一个字节或字的操作数从源地址传送至目的地址
MOV reg/mem,imm;立即数送寄存器或主存例题 2.1
MOV reg/mem/seg,reg;寄存器送(段)寄存器或主存例题 2.2
MOV reg/seg,mem;主存送(段)寄存器例题 2.3
MOV reg/mem,seg;段寄存器送寄存器或主存例题 2.5
第 2 章 MOV指令传送功能
MOV并非任意传送立即数段寄存器
CS DS ES SS
通用寄存器
AX BX CX DX
BP SP SI DI
存储器第 2 章 非法传送种种
两个操作数的类型不一致
例如源操作数是字节,而目的操作数是字;
或相反
两个操作数不能都是存储器
传送指令很灵活,但主存之间的直接传送却不允许
段寄存器的操作有一些限制
段寄存器属专用寄存器,对他们的操作能力有限示例示例示例第 2 章 2,交换指令 XCHG( exchange)
把两个地方的数据进行互换
寄存器与寄存器之间对换数据
寄存器与存储器之间对换数据
不能在存储器与存储器之间对换数据
XCHG reg,reg/mem; reg? reg/mem
例题 2.7
例题 2.6
第 2 章
换码指令执行前:
主存建立一个 字节量表格,含要转换成的目的代码表格首地址 存放于 BX,AL存放相对表格首的 位移量
换码指令执行后:
将 AL寄存器的内容转换为 目标代码
3,换码指令 XLAT( translate)
将 BX指定的缓冲区中,AL指定的位移处的一个字节数据取出赋给 AL
XLAT ; al←ds:[bx+al] 例题 2.8
第 2 章 2.1.2 堆栈操作指令
堆栈:后进先出
FILO,位于堆栈段; SS段寄存器记录其段地址
堆栈只有一个出口,即当前栈顶;
用 堆栈指针寄存器 SP指定第 2 章 堆栈的操作
堆栈只有两种基本操作:进栈和出栈,
对应两条指令 PUSH和 POP
Word 1
Word 2
Word 3
Word 4
Word 5
Stack
PUSH
POP
PUSH ;进栈指令先使堆栈指针 SP减 2,然后把一个字操作数存入堆栈顶部
POP ;出栈指令把栈顶的一个字传送至指定的目的操作数,
然后堆栈指针 SP加 2
第 2 章 1,进栈指令 PUSH
push ax
push [2000h]
PUSH r16/m16/seg; SP←SP - 2; SS:[SP]←r16/m16/seg
Word
Stack
PUSH
SP -2
第 2 章 2,出栈指令 POP
pop ax
pop [2000h]
POP r16/m16/seg; r16/m16/seg←SS:[SP]; SP←SP + 2
Word
Stack
POP
SP
+2
第 2 章 堆栈的特点
堆栈操作的单位是字,进栈和出栈只对字量
字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据
堆栈常用来
临时存放数据
传递参数
保存和恢复寄存器 例题 2.11
第 2 章 2.1.3 标志传送指令
标志寄存器传送指令用来传送标志寄存器 FLAGS的内容
标志位操作指令直接对 CF,DF,IF标志进行复位或置位第 2 章 1,标志寄存器传送
标志寄存器传送指令用来传送标志寄存器 FLAGS的内容,方便进行对各个标志位的直接操作
有 2对 4条指令
低 8位传送,LAHF和 SAHF
16位传送,PUSHF和 POPF
第 2 章 标志低字节进出 AH指令
LAHF; AH←FLAGS 的低字节
LAHF指令将标志寄存器的低字节送寄存器 AH
SF/ZF/AF/PF/CF状态标志位分别送入 AH的第
7/6/4/2/0位,而 AH的第 5/3/1位任意
SAHF; FLAGS的低字节 ← AH
SAHF将 AH寄存器内容送 FLAGS的低字节
用 AH的第 7/6/4/2/0位相应设置 SF/ZF/AF/
PF/CF标志第 2 章 标志寄存器进出堆栈指令
PUSHF; SP←SP - 2; SS:[SP]←FLAGS
PUSHF指令将标志寄存器的内容压入堆栈,
同时栈顶指针 SP减 2
POPF; FLAGS←SS,[SP]; SP←SP + 2
POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针 SP加 2
例题 2.12
第 2 章 2,标志位操作
标志位操作指令直接对 CF,DF,IF标志进行复位或置位,常用于特定的情况
对标志位进行设置的指令
CLC STC CMC
CLD STD
CLI STI
第 2 章 进位标志操作指令
用于任意设置进位标志
CLC ;复位进位标志,CF← 0
STC ;置位进位标志,CF← 1
CMC ;求反进位标志,CF← ~ CF
第 2 章 方向标志操作指令串操作指令中,需要使用
CLD ;复位方向标志,DF← 0
STD ;置位方向标志,DF← 1
第 2 章 中断标志操作指令
在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止
CLI ;复位中断标志,DF← 0
STI ;置位中断标志,DF← 1
第 2 章 2.1.4 地址传送指令
地址传送指令将存储器单元的逻辑地址送至指定的寄存器
有效地址传送指令 LEA
指针传送指令 LDS和 LES
注意不是获取存储器单元的内容第 2 章 有效地址传送指令 LEA( load EA)
将存储器操作数的有效地址传送至指定的 16位寄存器中例题 2.13
LEA r16,mem; r16←mem 的有效地址 EA
第 2 章 指针传送指令
LDS r16,mem; r16←mem,; DS←mem+ 2
LDS指 令 将 主存 中
mem指 定 的 字送 至
r16,并将 mem的下一字送 DS寄存器
LES r16,mem; r16←mem,; ES←mem+ 2
LES指令将主存中
mem指定的字送至
r16,并将 mem的下一字送 ES寄存器例题 2.14
第 2 章 2.1.5 输入输出指令
8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是 端口
( Port) 即 I/O地址
8086用于寻址外设端口的地址线为 16
条,端口最多为 216= 65536( 64K) 个,
端口号为 0000H~ FFFFH
每个端口用于传送一个字节的外设数据第 2 章 输入输出寻址方式
8086的 端口有 64K个,无需分段,设计有两种寻址方式
直接寻址,只用于寻址 00H~ FFH前 256个端口,操作数 i8表示端口号
间接寻址,可用于寻址全部 64K个端口,
DX寄存器的值就是端口号
大于 FFH的端口只能采用间接寻址方式第 2 章 输入指令 IN
将外设数据传送给 CPU内的 AL/AX
IN AL,i8;字节输入,AL←I/O 端口( i8直接寻址)
IN AL,DX;字节输入,AL←I/O 端口( DX间接寻址)
IN AX,i8;字输入,AX←I/O 端口( i8直接寻址)
IN AX,DX;字输入,AX←I/O 端口( DX间接寻址)
例题 2.15
第 2 章 输出指令 OUT
将 CPU内的 AL/AX数据传送给外设
OUT i8,AL;字节输出,I/O端口 ← AL( i8直接寻址)
OUT DX,AL;字节输出,I/O端口 ← AL( DX间接寻址)
OUT i8,AX;字输出,I/O端口 ← AX( i8直接寻址)
OUT DX,AX;字输出,I/O端口 ← AX( DX间接寻址)
例题 2.16
第 2 章 2.2 算术运算类指令
四则运算是计算机经常进行的一种操作 。 算术运算指令实现二进制 ( 和十进制 ) 数据的四则运算
请注意算术运算类指令 对标志的影响
掌握,ADD/ADC/INC,SUB/SBB/DEC/
NEG/CMP
熟悉,MUL/IMUL,DIV/IDIV
理解,CBW/CWD,DAA/DAS,AAA/
AAS/AAM/AAD
第 2 章 加法指令 ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
ADD reg,imm/reg/mem; reg←reg + imm/reg/mem
ADD mem,imm/reg; mem←mem + imm/reg
例题 2.17a
第 2 章 带进位加法指令 ADC
ADC指令将源与目的操作数相加,再加上进位 CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与 ADD配合,实现多精度加法运算
ADC reg,imm/reg/mem; reg←reg + imm/reg/mem+ CF
ADC mem,imm/reg; mem←mem + imm/reg+ CF
例题 2.17b
第 2 章 增量指令 INC( increment)
INC指令对操作数加 1( 增量 )
INC指令不影响进位 CF标志,按定义设置其他状态标志
INC reg/mem; reg/mem←reg/mem + 1
inc bx
inc byte ptr [bx]
第 2 章 减法指令 SUB( subtract)
SUB指令将目的操作数减去源操作数,
结果送到目的操作数
SUB指令按照定义相应设置状态标志
SUB reg,imm/reg/mem; reg←reg - imm/reg/mem
SUB mem,imm/reg; mem←mem - imm/reg
例题 2.18a
第 2 章 带借位减法指令 SBB
SBB指令将目的操作数减去源操作数,再减去借位 CF( 进位 ),结果送到目的操作数 。
SBB指令按照定义相应设置状态标志
SBB指令主要与 SUB配合,实现多精度减法运算
SBB reg,imm/reg/mem; reg←reg - imm/reg/mem- CF
SBB mem,imm/reg; mem←mem - imm/reg- CF
例题 2.18b
第 2 章 减量指令 DEC( decrement)
DEC指令对操作数减 1( 减量 )
DEC指令不影响进位 CF标志,按定义设置其他状态标志
DEC reg/mem; reg/mem←reg/mem - 1
dec cx
dec word ptr [si]
INC指令和 DEC指令都是单操作数指令主要用于对计数器和地址指针的调整第 2 章 求补指令 NEG( negative)
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加 1
NEG指令对标志的影响与用零作减法的 SUB指令一样
NEG reg/mem; reg/mem←0 - reg/mem
例题 2.19
第 2 章 比较指令 CMP( compare)
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
CMP指令执行的功能与 SUB指令,但结果不回送目的操作数
CMP reg,imm/reg/mem; reg- imm/reg/mem
CMP mem,imm/reg; mem- imm/reg
例题 2.20
第 2 章 2.2.3 乘法指令
MUL r8/m8;无符号字节乘法; AX←AL × r8/m8
MUL r16/m16;无符号字乘法; DX.AX←AX × r16/m16
IMUL r8/m8;有符号字节乘法; AX←AL × r8/m8
IMUL r16/m16;有符号字乘法; DX.AX←AX × r16/m16
例题 2.21说明第 2 章 2.2.4 除法指令
DIV r8/m8 ;无符号字节除法:
AL←AX ÷ r8/m8的商,Ah←AX ÷ r8/m8的余数
DIV r16/m16 ;无符号字除法:; AX←DX,AX÷ r16/m16的商,DX←DX,AX÷ r16/m16的余数
IDIV r8/m8 ;有符号字节除法:
AL←AX ÷ r8/m8的商,Ah←AX ÷ r8/m8的余数
IDIV r16/m16 ;有符号字除法:; AX←DX,AX÷ r16/m16的商,DX←DX,AX÷ r16/m16的余数例题 2.22
说明第 2 章 2.2.5 符号扩展指令
CBW ; AL的符号扩展至 AH;如 AL的最高有效位是 0,则 AH= 00; AL的最高有效位为 1,则 AH= FFH。 AL不变
CWD ; AX的符号扩展至 DX;如 AX的最高有效位是 0,则 DX= 00; AX的最高有效位为 1,则 DX= FFFFH。 AX不变
什么是 符号扩展
符号扩展指令常用于获得倍长的数据例题 2.23
例题 2.24
第 2 章 2.2.6 十进制调整指令
压缩 BCD码就是通常的 8421码;它用
4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即 00~
99
非压缩 BCD码用 8
个二进制位表示一个十进制位,只用低 4个二进制位表示一个十进制位
0~ 9,高 4位任意,
通常默认为 0
十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果
分成压缩 BCD码和非压缩 BCD码调整第 2 章 BCD码 ( Binary Coded Decimal)
二进制编码的十进制数:一位十进制数用 4位二进制编码来表示
8086支持压缩 BCD码和非压缩 BCD码的调整运算真值 8 64
二进制编码 08H 40H
压缩 BCD码 08H 64H
非压缩 BCD码 08H 0604H
第 2 章 压缩 BCD码加、减调整指令
( ADD AL,i8/r8/m8)
( ADC AL,i8/r8/m8)
DAA; AL← 将 AL的加和调整为压缩 BCD码
( SUB AL,i8/r8/m8)
( SBB AL,i8/r8/m8)
DAS; AL← 将 AL的减差调整为压缩 BCD码
使用 DAA或 DAS指令前,应先执行以 AL为目的操作数的加法或减法指令
DAA和 DAS指令对 OF标志无定义,按结果影响其他标志,例如 CF反映压缩 BCD码相加或减的进位或借位状态例题 2.25a 例题 2.25b
例题 2.26
第 2 章 非压缩 BCD码加、减调整指令
( ADD AL,i8/r8/m8)
( ADC AL,i8/r8/m8)
AAA; AL← 将 AL的加和调整为非压缩 BCD码; AH←AH +调整的进位
( SUB AL,i8/r8/m8)
( SBB AL,i8/r8/m8)
AAS; AL← 将 AL的减差调整为非压缩 BCD码; AH←AH -调整的借位
使用 AAA或 AAS指令前,应先执行以 AL为目的操作数的加法或减法指令
AAA和 AAS指令在调整中产生了进位或借位,则
AH要加上进位或减去借位,同时 CF=AF=1,否则
CF=AF=0;它们对其他标志无定义例题 2.27a 例题 2.27b
第 2 章 非压缩 BCD码乘、除调整指令
( MUL r8/m8)
AAM; AX← 将 AX的乘积调整为非压缩 BCD码
AAD; AX← 将 AX中非压缩 BCD
码扩展成二进制数
( DIV r8/m8)
AAM指令跟在字节乘 MUL之后,将乘积调整为非压缩 BCD码
AAD指令跟在字节除 DIV之前,先将非压缩 BCD
码的被除数调整为二进制数
AAM和 AAD指令 根据结果设置 SF,ZF和 PF,但对
OF,CF和 AF无定义例题 2.27c 例题 2.27d
第 2 章 习题 2.9
设 X,Y,Z,V均为 16位带符号数,分别存放在 X、
Y,Z,V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?
V
Z
Y
X
65
F3
02
00
24
E0
05
00
习题 2.9:算术运算 1
mov ax,X
imul Y ; DX.AX= X× Y
mov cx,ax
mov bx,dx ; BX.CX= X× Y
mov ax,Z
cwd
add cx,ax
adc bx,dx ; BX.CX= X× Y+ Z
习题 2.9:算术运算 2
sub cx,540
sbb bx,0; BX.CX= X× Y+ Z- 540
mov ax,V
cwd
sub ax,cx
sbb dx,bx; DX.AX= V- ( X× Y+ Z- 540)
idiv X; DX.AX= ( V- ( X× Y+ Z- 540)) ÷ X
教学提示在正确理解每条指令的功能基础上,可以阅读和编写有实际意义的程序段第 2 章 2.3 位操作类指令
位操作类指令以二进制位为基本单位进行数据的操作
这是一类常用的指令,都应该掌握
注意这些指令对标志位的影响
1,逻辑运算指令
AND OR XOR NOT TEST
2,移位指令
SHL SHR SAR
3,循环移位指令
ROL ROR RCL RCR
第 2 章 逻辑与指令 AND
对两个操作数执行逻辑与运算,结果送到目的操作数
AND指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
AND reg,imm/reg/mem ; reg←reg ∧ imm/reg/mem
AND mem,imm/reg ; mem←mem ∧ imm/reg
只有相,与,的两位都是 1,结果才是 1;否则,,与,的结果为
0
第 2 章 逻辑或指令 OR
对两个操作数执行逻辑或运算,结果送到目的操作数
OR指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
OR reg,imm/reg/mem ; reg←reg ∨ imm/reg/mem
OR mem,imm/reg ; mem←mem ∨ imm/reg
只要相,或,的两位有一位是 1,
结果就是 1;否则,结果为 0
第 2 章 逻辑异或指令 XOR
对两个操作数执行逻辑异或运算,结果送到目的操作数
XOR指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
XOR reg,imm/reg/mem ; reg←reg ⊕ imm/reg/mem
XOR mem,imm/reg ; mem←mem ⊕ imm/reg
只有相,异或,的两位不相同,
结果才是 1;否则,结果为 0
第 2 章 逻辑非指令 NOT
对一个操作数执行逻辑非运算
NOT指令是一个单操作数指令
NOT指令不影响标志位
NOT reg/mem ; reg/mem← ~ reg/mem
按位取反,原来是,0”的位变为,1”;原来是,1”的位变为,0”
例题:逻辑运算
mov al,45h ;逻辑与 al=01h
and al,31h ; CF=OF=0,SF=0,ZF=0,PF=0
mov al,45h ;逻辑或 al=75h
or al,31h ; CF=OF=0,SF=0,ZF=0,PF=0
mov al,45h ;逻辑异或 al=74h
xor al,31h ; CF=OF=0,SF=0,ZF=0,PF=1
mov al,45h ;逻辑非 al=0bah
not al ;标志不变例题:逻辑指令应用; AND指令可用于复位某些位 ( 同 0相与 ),不影响其他位:将 BL中 D3和 D0位清 0,其他位不变
and bl,11110110B; OR指令可用于置位某些位 ( 同 1相或 ),不影响其他位:将 BL中 D3和 D0位置 1,其他位不变
or bl,00001001B; XOR指令可用于求反某些位 ( 同 1相异或 ),
不影响其他位:将 BL中 D3和 D0位求反,其他不变
xor bl,00001001B
第 2 章 测试指令 TEST
对两个操作数执行逻辑与运算,结果不回送到目的操作数
TEST指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
TEST reg,imm/reg/mem ; reg∧ imm/reg/mem
TEST mem,imm/reg ; mem∧ imm/reg
只有相,与,的两位都是 1,结果才是 1;否则,,与,的结果为
0
例 2.32:测试为 0或 1
test al,01h ;测试 AL的最低位 D0
jnz there ;标志 ZF=0,即 D0=1;则程序转移到 there
..,;否则 ZF=1,即 D0=0,顺序执行
there,...
TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况
TEST
第 2 章 移位指令 ( shift)
将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作
SHL reg/mem,1/CL;逻辑左移,最高位进入 CF,最低位补 0SHR reg/mem,1/CL;逻辑右移,最低位进入 CF,最高位补 0SAL reg/mem,1/CL;算术左移,最高位进入 CF,最低位补 0SAR reg/mem,1/CL;算术右移,最低位进入 CF,最高位不变
SAL与 SHL相同第 2 章 移位指令的操作数
移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元
后一个操作数表示移位位数,该操作数为 1,表示移动一位;当移位位数 大于
1时,则用 CL寄存器值表示,该操作数表达为 CL
第 2 章 移位指令对标志的影响
按照移入的位设置进位标志 CF
根据移位后的结果影响 SF,ZF,PF
对 AF没有定义
如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移位前的操作数最高位与移位后操作数的最高位不同 ( 有变化 ),则 OF = 1;否则
OF = 0。 当移位次数大于 1时,OF不确定例 2.33:移位指令
mov cl,4
mov al,0f0h ; al=f0h
shl al,1 ; al=e0h; CF=1,SF=1,ZF=0,PF=0,OF=0
shr al,1 ; al=70h; CF=0,SF=0,ZF=0,PF=0,OF=1
sar al,1 ; al=38h; CF=0,SF=0,ZF=0,PF=0,OF=0
sar al,cl ; al=03h; CF=1,SF=0,ZF=0,PF=1
第 2 章 循环移位指令 ( rotate)
将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作
ROL reg/mem,1/CL ;不带进位循环左移
ROR reg/mem,1/CL ;不带进位循环右移
RCL reg/mem,1/CL ;带进位循环左移
RCR reg/mem,1/CL ;带进位循环右移第 2 章 循环移位指令对标志的影响
按照指令功能设置进位标志 CF
不影响 SF,ZF,PF,AF
如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移位前的操作数最高位与移位后操作数的最高位不同 ( 有变化 ),则 OF = 1;否则
OF = 0。 当移位次数大于 1时,OF不确定例 2.35,32位数移位;将 DX.AX中 32位数值左移一位
shl ax,1
rcl dx,1
DX AXCF
0
例 2.36:位传送;把 AL最低位送 BL最低位,保持 AL不变
ror bl,1
ror al,1
rcl bl,1
rol al,1
AL,BL CF
BL CF
ALCF
AL之 D0
例 2.37,BCD码合并; AH.AL分别存放着非压缩 BCD码的两位;将它们合并成为一个压缩 BCD码存 AL
and ax,0f0fh ;保证高 4位为 0
mov cl,4
rol ah,cl ;也可以用 shl ah,cl
add al,ah ;也可以用 or al,ah
第 2 章 2.4 控制转移类指令
控制转移类指令 用于实现分支,循环,过程等程序结构,是仅次于传送 指令的常用指令重点掌握,JMP/Jcc/LOOP CALL/RET
INTn/IRET 常用系统功能调用一般了解,LOOPZ/LOOPNZ INTO
控制转移类指令通过 改变 IP( 和 CS)
值,实现程序执行顺序的改变第 2 章 2.4.1 无条件转移指令
只要执行无条件转移指令 JMP,就使程序转到指定的目标地址处,从目标地址处开始执行指令
操作数 label是要转移到的 目标地址 ( 目的地址,
转移地址 )
JMP指令分成 4种类型:
⑴ 段内转移,相对寻址
⑵ 段内转移,间接寻址
⑶ 段间转移,直接寻址
⑷ 段间转移,间接寻址
JMP label ;程序转向 label标号指定的地址第 2 章 目标地址的寻址方式
相对寻址方式
相对寻址方式以当前 IP为基地址,加上位移量构成目标地址
直接寻址方式
转移地址象立即数一样,直接在指令的机器代码中
间接寻址方式
转移地址在寄存器或主存单元中用标号表达用寄存器或存储器操作数表达用标号表达第 2 章 目标地址的范围:段内
段内转移 —— 近转移 ( near)
在当前代码段 64KB范围内转移
( ± 32KB范围 )
不需要更改 CS段地址,只要改变 IP偏移地址
段内转移 —— 短转移 ( short)
转移范围可以用一个字节表达,
在段内- 128~+ 127范围的转移代码段代码段第 2 章 目标地址的范围:段间
段间转移 —— 远转移 ( far)
从当前代码段跳转到另一个代码段,可以在 1MB范围
更改 CS段地址和 IP偏移地址
目标地址必须用一个 32位数表达,叫做 32位远指针,它就是逻辑地址代码段代码段实际编程时,MASM汇编程序会根据目标地址的距离,自动处理 成短转移,近转移或远转移程序员可用操作符 short,nearptr 或 far ptr 强制第 2 章 段内转移、相对寻址
JMP label ; IP←IP+ 位移量
位移量是紧接着 JMP指令后的那条指令的偏移地址,
到目标指令的偏移地址的地址位移
当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负
again,dec cx ;标号 again的指令……
jmp again ;转移到 again处继续执行……
jmp output ;转向 output……
output,mov result,al ;标号 output的指令第 2 章 段内转移、间接寻址
JMP r16/m16 ; IP←r 16/m16
将一个 16位寄存器或主存字单元内容送入 IP
寄存器,作为新的指令指针,但不修改 CS寄存器的内容
jmp ax ; IP←AX
jmp word ptr [2000h] ; IP←[ 2000h]
第 2 章 段间转移、直接寻址
JMP far ptr label; IP←label 的偏移地址; CS←label 的段地址
将标号所在段的段地址作为新的 CS值,
标号在该段内的偏移地址作为新的 IP值;这样,程序跳转到新的代码段执行
jmp far ptr otherseg;远转移到代码段 2的 otherseg
第 2 章 段间转移、间接寻址
JMP far ptr mem; IP←[mem],CS←[mem+ 2]
用一个双字存储单元表示要跳转的目标地址 。 这个目标地址存放在主存中连续的两个字单元中的,低位字送 IP寄存器,高位字送
CS寄存器
mov word ptr [bx],0
mov word ptr [bx+2],1500h
JMP far ptr [bx] ;转移到 1500h:0
第 2 章 2.4.2 条件转移指令
指定的条件 cc如果成立,程序转移到由标号 label
指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令
操作数 label是采用相对寻址方式的短转移标号
表示 Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移
距当前 IP地址- 128~+ 127个单元的范围之内
Jcc label;条件满足,发生转移,IP←IP + 8位位移量;条件不满足,顺序执行第 2 章 Jcc指令的分类
Jcc指令不影响标志,但要利用标志
( 表 2.2) 。 根据利用的标志位不同,
16条指令分成 3种情况:
1,判断单个标志位状态
2,比较无符号数高低
3,比较有符号数大小第 2 章 判断单个标志位状态
这组指令单独判断 5个状态标志之一
⑴ JZ/JE和 JNZ/JNE:利用零标志 ZF,判断结果是否为零 ( 或相等 )
⑵ JS和 JNS:利用符号标志 SF,判断结果是正是负
⑶ JO和 JNO:利用溢出标志 OF,判断结果是否产生溢出
⑷ JP/JPE和 JNP/JPO:利用奇偶标志 PF,判断结果中,1”的个数是偶是奇
⑸ JC/JB/JNAE和 JNC/JNB/JAE:利用进位标志 CF,
判断结果是否进位或借位例题 2.38
例题 2.39
例题 2.40
例题 2.41
例题 2.42
第 2 章 比较无符号数高低
无符号数的大小用高 ( Above) 低 ( Below)
表示
利用 CF确定高低,利用 ZF标志确定相等
( Equal)
两数的高低分成 4种关系:
⑴ 低于 ( 不高于等于 ),JB( JNAE)
⑵ 不低于 ( 高于等于 ),JNB( JAE)
⑶ 低于等于 ( 不高于 ),JBE( JNA)
⑷ 不低于等于 ( 高于 ),JNBE( JA)
例 2.43a:比较无符号数
cmp ax,bx ;比较 ax和 bx
jnb next ;若 ax≥ bx,转移
xchg ax,bx ;若 ax< bx,交换
next,...
结果,AX保存较大的 无符号数第 2 章 比较有符号数大小
有符号数的大 ( Greater) 小 ( Less) 需要组合 OF,SF标志,并利用 ZF标志确定相等
( Equal)
两数的大小分成 4种关系:
⑴ 小于 ( 不大于等于 ),JL( JNGE)
⑵ 不小于 ( 大于等于 ),JNL( JGE)
⑶ 小于等于 ( 不大于 ),JLE( JNG)
⑷ 不小于等于 ( 大于 ),JNLE( JG)
例 2.43b:比较有符号数
cmp ax,bx ;比较 ax和 bx
jnl next ;若 ax≥ bx,转移
xchg ax,bx ;若 ax< bx,交换
next,...
结果,AX保存较大的 有符号数第 2 章 2.4.3 循环指令 ( loop)
循环指令默认利用 CX计数器
label操作数采用相对短转移寻址方式
LOOP label ; CX←CX - 1,; CX≠0,循环到标号 label
LOOPZ label; CX←CX - 1,; CX≠0 且 ZF= 1,循环到标号 label
LOOPNZ label ; CX←CX - 1,; CX≠0 且 ZF= 0,循环到标号 label
JCXZ label ; CX= 0,转移到标号 label
例 2.44:记录空格个数
mov cx,count;设置循环次数
mov si,offset string
xor bx,bx ; bx= 0,记录空格数
jcxz done
mov al,20h ;如果长度为 0,退出
again,cmp al,es:[si]
jnz next ; ZF= 0非空格,转移
inc bx ; ZF=1是空格,个数加 1
next,inc si
loop again;字符个数减 1,不为 0继续循环
dec cx
jnz again
cmp cx,0
jz next
第 2 章 2.4.4 子程序指令
子程序是完成特定功能的一段程序
当主程序 ( 调用程序 ) 需要执行这个功能时,
采用 CALL调用指令转移到该子程序的起始处执行
当运行完子程序功能后,采用 RET返回指令回到主程序继续执行演示第 2 章 子程序调用指令
CALL指令分成 4种类型 ( 类似 JMP)
CALL label ;段内调用,相对寻址
CALL r16/m16 ;段内调用,间接寻址
CALL far ptr label ;段间调用,直接寻址
CALL far ptr mem ;段间调用,间接寻址
CALL指令需要保存返回地址:
段内调用 —— 入栈偏移地址 IP
SP←SP - 2,SS:[SP]←IP
段间调用 —— 入栈偏移地址 IP和段地址 CS
SP←SP - 2,SS:[SP]←IP
SP←SP - 2,SS:[SP]←CS
第 2 章 子程序返回指令
根据段内和段间,有无参数,分成 4种类型
RET ;无参数段内返回
RET i16 ;有参数段内返回
RET ;无参数段间返回
RET i16 ;有参数段间返回
需要弹出 CALL指令压入堆栈的返回地址
段内返回 —— 出栈偏移地址 IP
IP←SS,[SP],SP←SP + 2
段间返回 —— 出栈偏移地址 IP和段地址 CS
IP←SS,[SP],SP←SP + 2
CS←SS,[SP],SP←SP + 2
i16参数的作用例 2.45:子程序;主程序 mov al,0fh ;提供参数 AL
call htoasc ;调用子程序
...;子程序,将 AL低 4位的一位 16进制数 转换 成 ASCII码
htoasc:and al,0fh ;只取 al的低 4位
or al,30h ; al高 4位变成 3
cmp al,39h ;是 0~ 9,还是 0Ah~ 0Fh
jbe htoend
add al,7 ;是 0Ah~ 0Fh,加上 7
htoend:ret ;子程序返回第 2 章 2.4.5 中断指令
中断 ( Interrupt ) 是又一种改变程序执行顺序的方法
中断具有多种中断类型
中断的指令有 3条:
INTi8 IRET INTO
本节主要掌握类似子程序调用指令的中断调用指令 INT i8,进而学习使用 DOS
功能调用第 2 章 8086的外部中断
8086可以管理 256个中断
各种中断用一个向量编号来区别
主要分成外部中断和内部中断
外部中断 —— 来自 CPU之外的原因引起的中断,又可以分成
可屏蔽中断,可由 CPU的中断允许标志 IF控制
非屏蔽中断,不受 CPU的中断允许标志 IF控制第 2 章 8086的内部中断
内部中断 —— CPU内部执行程序引起的中断,又可以分成:
除法错中断,执行除法指令,结果溢出产生的
0 号中断
指令中断,执行中断调用指令 INT i8产生的 i8
号中断
断点中断,用于断点调试 ( INT3) 的 3 号中断
溢出中断,执行溢出中断指令,OF= 1产生的
4 号中断
单步中断,TF= 1在每条指令执行后产生的 1
号中断第 2 章 中断指令 INT
INT i8;中断调用指令:产生 i8号中断
IRET;中断返回指令:实现中断返回
INTO;溢出中断指令:;若溢出标志 OF=1,产生 4号中断;否则顺序执行第 2 章 2.4.6 系统功能调用
21H号中断是 DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理,目录管理和文件管理三个方面的功能
ROM-BIOS也以中断服务程序的形式,
向程序员提供系统的基本输入输出程序
汇编语言程序设计需要采用系统的各种功能程序
充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握第 2 章 功能调用的步骤通常按照如下 4个步骤进行:
⑴ 在 AH寄存器中设置系统功能调用号
⑵ 在指定寄存器中设置入口参数
⑶ 执行指令 INT 21H( 或 ROM-BIOS的中断向量号 ) 实现中断服务程序的功能调用
⑷ 根据出口参数分析功能调用执行情况第 2 章 输入输出类功能调用
向显示器输出字符
⒈ 字符的输出
⒉ 字符串的输出
从键盘输入数据
⒊ 字符的输入
⒋ 字符串的输入
⒌ 按键的判断 裸机汇编语言程序第 2 章 字符输出的功能调用
DOS功能调用 INT21H
功能号,AH= 02H
入口参数,DL=字符的 ASCII码
功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置 。 如按 Ctrl-Break或 Ctrl-C则退出例 2.46:显示问号;在当前显示器光标位置显示一个问号
mov ah,02h ;设置功能号,ah← 02h
mov dl,'?' ;提供入口参数,dl←'?'
int 21h ; DOS功能调用:显示进行字符输出时,当输出响铃字符 ( 07H)
以及退格 ( 08H),回车 ( 0DH) 和换 行
( 0AH) 字符时,该功能调用可以自动识别并能进行相应处理第 2 章 字符输出的功能调用
显示器功能调用 INT 10H
功能号,AH= 0EH
入口参数,AL=字符的 ASCII码
BL=字符的颜色值 ( 图形方式 )
BH=页号 ( 字符方式 )
通常使 BX= 0
功能:将字符按原属性在光标处显示,
光标自动移到下一个字符位置第 2 章 字符串输出的功能调用
DOS功能调用 INT21H
功能号,AH= 09H
入口参数:
DS:DX=欲显示字符串在主存中的首地址字符串应以 $( 24H) 结束
功能:在显示器输出指定的字符串
可以输出回车 ( 0DH) 和换行 ( 0AH) 字符产生回车和换行的作用例 2.47:显示字符串
string db 'Hello,Everybody !',0dh,0ah,'$';在数据段定义要显示的字符串
...
mov ah,09h;设置功能号,ah← 09h
mov dx,offset string;提供入口参数,dx← 字符串的偏移地址
int 21h; DOS功能调用:显示第 2 章 字符输入的功能调用
DOS功能调用 INT21H
功能号,AH= 01H
出口参数,AL=字符的 ASCII码
功能:获得按键的 ASCII代码值
调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值例 2.48:判断按键
getkey,mov ah,01h ;功能号,ah← 01h
int 21h ;功能调用
cmp al,’Y’ ;处理出口参数 al
je yeskey ;是,Y”
cmp al,’N’
je nokey ;是,N”
jne getkey
...
yeskey,...
nokey,...
第 2 章 字符输入的功能调用
键盘功能调用 INT16H
功能号,AH= 0
出口参数,AX=键值代码对于标准 ASCII码按键,AL= ASCII码,AH
=扫描码;
对于扩展按键,AL= 00H,AH=键扩展码;
对于 alt+小键盘数字按键,AL= ASCII码,
AH= 00H
此功能类同 DOS功能 01H,会一直等待按键例 2.49:字符输入输出
mov ah,0 ;键盘功能调用 ( int 16h)
int 16h ; al← 按键的 ASCII码
mov bx,0 ;显示功能调用 ( int 10h)
mov ah,0eh
int 10h ;显示第 2 章 字符串输入的功能调用
DOS功能调用 INT21H
功能号,AH= 0AH
入口参数,DS:DX=缓冲区首地址
执行该功能调用时,用户按键,最后用回车确认
本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按 Ctrl+ Break或
Ctrl+ C则中止关键要定义好缓冲区例 2.50:输入字符串
buffer db 81 ;定义缓冲区;第 1个字节填入可能输入的最大字符数
db 0 ;存放实际输入的字符数
db 81 dup(0) ;存放输入的字符串
...
mov dx,seg buffer;伪指令 seg取得 buffer的段地址
mov ds,dx ;设置数据段 DS
mov dx,offset buffer
mov ah,0ah
int 21h
第 2 章 按键判断的功能调用
DOS功能调用 INT21H
功能号,AH= 0BH
出口参数,AL= 0,当前没有按键;
AL= FFH,当前已经按键 。
功能:仅判断当前是否有按下的键,
设置 AL后退出例 2.51:按任意键继续
..,;提示,按任意键继续,
getkey:mov ah,0bh
int 21h
or al,al ; al= 0?
jz getkey; al= 0,没有按键,继续等待;等同于如下功能调用
mov ah,01h
int 21h
第 2 章 按键判断的功能调用
键盘功能调用 INT16H
功能号,AH= 1
出口参数:若标志 ZF= 1,无键按下;
若 ZF= 0,有键按下,且 AX=键值代码
功能:此子功能仅判断是否按键,设置零位标志 ZF后退出
这两个功能调用都不循环等待按键,即使有键按下,键盘缓冲区仍然保留键值并且没有被清空,必要时必须用字符输入功能取走键值清空缓冲区教学提示在学习和应用汇编语言进行程序设计时,有一些经常遇到的问题,例如算术运算,
代码转换等,需要掌握第 2 章 2.5 串操作类指令
串操作指令是 8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,
常用在操作主存连续区域的数据时主要熟悉,MOVS STOS LODS
CMPS SCAS REP
一般了解,REPZ/REPE REPNZ/REPNE
第 2 章 串数据类型
串操作指令的操作数是 主存中连续存放的数据串 ( String) —— 即在连续的主存区域中,字节或字的序列
串操作指令的 操作对象是以字 ( W) 为单位的字串,或是以字节 ( B) 为单位的字节串第 2 章 串寻址方式
源操作数用寄存器 SI寻址,默认在数据段 DS中,
但允许段超越,DS:[SI]
目的操作数用寄存器 DI寻址,默认在附加段 ES中,
不允许段超越,ES:[DI]
每执行一次串操作指令,SI和 DI将自动修改:
± 1( 对于字节串 ) 或 ± 2( 对于字串 )
执行指令 CLD后,DF= 0,地址指针增 1或 2
执行指令 STD后,DF =1,地址指针减 1或 2
第 2 章 串传送 MOVS( move string)
把字节或字操作数从主存的源地址传送至目的地址
MOVSB;字节串传送,ES:[DI]←DS:[SI]; SI←SI ± 1,DI←DI ± 1
MOVSW;字串传送,ES:[DI]←DS:[SI]; SI←SI ± 2,DI←DI ± 2
例 2.52:字节串传送
mov si,offset source
mov di,offset destination
mov cx,100 ; cx← 传送次数
cld ;置 DF=0,地址增加
again,movsb ; 传送一个字节
dec cx ;传送次数减 1
jnz again;判断传送次数 cx是否为 0;不为 0,则到 again位置执行指令;否则,结束
offset是汇编操作符,
求出变量的偏移地址例 2.52:字串传送
mov si,offset source
mov di,offset destination
mov cx,50 ; cx← 传送次数
cld ;置 DF=0,地址增加
again,movsw ; 传送一个字
dec cx ;传送次数减 1
jnz again;判断传送次数 cx是否为 0;不为 0,则到 again位置执行指令;否则,结束第 2 章 串存储 STOS( store string)
把 AL或 AX数据传送至目的地址
STOSB;字节串存储,ES:[DI]←AL; DI←DI ± 1
STOSW;字串存储,ES:[DI]←AX; DI←DI ± 2
例 2.53:串存储
mov ax,0
mov di,0
mov cx,8000h; cx← 传送次数 ( 32× 1024)
cld ; DF=0,地址增加
again,stosw ;传送一个字
dec cx ;传送次数减 1
jnz again ;传送次数 cx是否为 0
可将 CLD改为 STD吗? 如何改用 STOSB?
可不用给 DI赋值吗?
DI为偶数即可第 2 章 串读取 LODS( load string)
把指定主存单元的数据传送给 AL或 AX
LODSB;字节串读取,AL←DS:[SI]; SI←SI ± 1
LODSW;字串读取,AX←DS:[SI]; SI←SI ± 2
例 2.54:串读取- 1
mov si,offset block
mov di,offset dplus
mov bx,offset dminus
mov ax,ds
mov es,ax;数据都在一个段中,所以设置 es=ds
mov cx,count ; cx← 字节数
cld
例 2,54:串读取- 2
go_on,lodsb ;从 block取出一个数据
test al,80h;检测符号位,判断是正是负
jnz minus;符号位为 1,是负数,转向 minus
stosb;符号位为 0,是正数,存入 dplus
jmp again;程序转移到 again处继续执行
jnz go_on ;完成正负数据分离例 2.54:串读取- 3
minus:xchg bx,di
stosb ;把负数存入 dminus
xchg bx,di
again:dec cx ;字节数减 1
jnz go_on ;完成正负数据分离第 2 章 串比较 CMPS
( compare string)
将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系
CMPSB;字节串比较,DS:[SI]- ES:[DI]; SI←SI ± 1,DI←DI ± 1
CMPSW;字串比较,DS:[SI]- ES:[DI]; SI←SI ± 2,DI←DI ± 2
例 2.55:比较字符串
mov si,offset string1
mov di,offset string2
mov cx,count
cld
again,cmpsb ;比较两个字符
jnz unmat ;有不同字符,转移
dec cx
jnz again ;进行下一个字符比较
mov al,0 ;字符串相等,设置 00h
jmp output ;转向 output
unmat,mov al,0ffh ;设置 ffh
output:mov result,al;输出结果标记第 2 章 串扫描 SCAS( scan string)
将 AL/AX减去至目的操作数,以便设置标志,
进而比较 AL/AX与操作数之间的关系
SCASB;字节串扫描,AL- ES:[DI]; DI←DI ± 1
SCASW;字串扫描,AX- ES:[DI]; DI←DI ± 2
例 2.56:查找字符串
mov di,offset string
mov al,20h
mov cx,count
cld
again,scasb ;搜索
jz found ;为 0( ZF=1),发现空格
dec cx ;不是空格
jnz again ;搜索下一个字符
..,;不含空格,则继续执行
found,...
第 2 章 重复前缀指令 ( repeat)
串操作指令执行一次,仅对数据串中的一个字节或字量进行操作 。 但是串操作指令前,
都可以加一个重复前缀,实现串操作的重复执行 。 重复次数隐含在 CX寄存器中
重复前缀分 2类,3条指令:
配合不影响标志的 MOVS,STOS( 和 LODS)
指令的 REP前缀
配合影响标志的 CMPS和 SCAS指令的 REPZ和
REPNZ前缀第 2 章 REP重复前缀指令
REP前缀可以理解为:当数据串没有结束 ( CX≠0),则继续传送
例 2.52和 例 2.53中,程序段的最后 3条指令,可以分别替换为:
REP MOVSB 和 REP STOSW
REP ;每执行一次串指令,CX减 1;直到 CX= 0,重复执行结束第 2 章 REPZ重复前缀指令
REPZ/REPE前缀可以理解为:当数据串没有结束 ( CX≠0),并且串相等 ( ZF= 1),则继续比较
REPZ ;每执行一次串指令,CX减 1;并判断 ZF是否为 0,;只要 CX= 0或 ZF= 0,重复执行结束第 2 章 REPNZ重复前缀指令
REPNZ/REPNE前缀可以理解为:
当数据串没有结束 ( CX≠0),并且串不相等 ( ZF= 0),则继续比较
REPZ ;每执行一次串指令,CX减 1;并判断 ZF是否为 1,;只要 CX= 0或 ZF= 1,重复执行结束例 2.57:比较字符串
mov si,offset string1
mov di,offset string2
mov cx,count
cld
repz cmpsb ;重复比较两个字符
jnz unmat ;字符串不等,转移
mov al,0 ;字符串相等,设置 00h
jmp output ;转向 output
unmat,mov al,0ffh ;设置 ffh
output:mov result,al;输出结果标记解释例 2.58:查找字符串
mov di,offset string
mov al,20h
mov cx,count
cld
repnz scasb ;搜索
jz found ;为 0( ZF=1),发现空格
..,;不含空格,则继续执行
found,...
第 2 章 2.6 处理机控制类指令
对 CPU状态进行控制的指令
NOP CS,SS,DS,ES:
LOCK HLT ESC WAIT
第 2 章 空操作指令
NOP
不执行任何操作,但占用一个字节存储单元,
空耗一个指令执行周期
NOP常用于程序调试
在需要预留指令空间时用 NOP填充
代码空间多余时也可以用 NOP填充
还可以用 NOP实现软件延时
事实上,NOP和 XCHG AX,AX的指令代码一样,都是 90H
第 2 章 段超越前缀指令
在允许段超越的存储器操作数之前,使用段超越前缀指令,将采用指定的段寄存器寻址操作数
CS,;使用代码段的数据
SS,;使用堆栈段的数据
DS,;使用数据段的数据
ES,;使用附加段的数据第 2 章 封锁前缀指令
LOCK ;封锁总线
这是一个指令前缀,可放在任何指令前
这个前缀使得在这个指令执行时间内,
8086 处理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除第 2 章 暂停指令
HLT ;进入暂停状态
暂停指令使 CPU进入暂停状态,这时 CPU
不进行任何操作 。 当 CPU发生复位或来自外部的中断时,CPU脱离暂停状态
HLT指令可用于程序中等待中断 。 当程序中必须等待中断时,可用 HLT,而不必用软件死循环 。 然后,中断使 CPU脱离暂停状态,
返回执行 HLT的下一条指令第 2 章 交权指令
ESC 6位立即数,reg/mem;把浮点指令交给浮点处理器执行
浮点协处理器 8087指令是与 8086的整数指令组合在一起的,当 8086发现是一条浮点指令时,就利用 ESC指令将浮点指令交给 8087执行
实际编写程序时,一般采用易于理解的浮点指令助记符格式
ESC 6,[SI];实数除法指令,FDIVdword ptr [SI]
ESC 20H,AL;整数加法指令,FADDST(0),ST
第 2 章 等待指令
WAIT ;进入等待状态
8086利用 WAIT指令和测试引脚实现与 8087
同步运行
浮点指令经由 8086处理发往 8087,并与
8086本身的整数指令在同一个指令序列;
而 8087执行浮点指令较慢,所以 8086必须与 8087保持同步第 2 章 第 2章 总结
本章详细而完整地介绍了 8086的 16位指令系统的每条指令
希望大家进行一下整理 ( 总结 ),
寻址方式
指令支持的操作数形式
指令对标志的影响
常见编程问题
通过复习整理,形成指令系统的整体概念,
进而掌握常用指令第 2章 教学要求 ( 1)
1,熟悉 8086的基本参数,堆栈工作原理,指令对标志的影响,符号扩展的含义,压缩和非压缩
BCD的格式,串操作寻址特点
2,掌握基本指令,MOV/ XCHG,PUSH/ POP、
LEA; ADD/ ADC/ INC,SUB/ SBB/ DEC
/ CMP/ NEG; AND/ OR/ XOR/ NOT/
TEST,SHL/ SHR/ SAR,ROL/ ROR/ RCL
/ RCR; JMP/ Jcc,JCXZ/ LOOP,CALL
/ RET,INT n,MOVS/ LODS/ STOS,REP
第 2章 教学要求 ( 2)
3,熟悉特色指令,XLAT,IN/ OUT; MUL/
IMUL,DIV / IDIV,CBW/ CWD ; NOP,
CLC/ STC/ STC,CLD/ STD
4,了 解其 他指 令,LAHF/ SAHF/ PUSHF/
POPF,LDS/ LES; DAA/ DAS,AAA/
AAS,AAM / AAD ; IRET,LOOPZ /
LOOPNZ,INTO; CMPS/ SCAS,REPZ/
REPNZ; LOCK/ HLT/ ESC/ WAIT,CLI/
STI
第 2章 教学要求 ( 3)
5,习题
2.1 2.6 2.8 2.10
2.22 2.24 2.26 ⑶ ⑹ ⑺ 2.34
常用传送指令
加减法指令
逻辑运算和移位指令
控制转移指令
字符 ( 串 ) 输入输出功能调用第 2 章 什么是指令系统
计算机的指令系统就是指该计算机能够执行的全部指令的集合
每种计算机都有它支持的指令集合
16位 8086指令系统是 Intel 80x86系列微处理器指令系统的基础
Intel 80x86系列微处理器指令系统:
整数指令
浮点指令
多媒体指令第 2 章 8086指令系统概述
Intel 8086指令系统共有 117条基本指令
可分成 6个功能组
① 数据传送类指令
② 算术运算类指令
③ 位操作类指令
④ 串操作类指令
⑤ 控制转移类指令
⑥ 处理机控制类指令第 2 章 学习指令的注意事项
指令的功能 —— 该指令能够实现何种操作 。
通常指令助记符就是指令功能的英文单词或其缩写形式
指令支持的寻址方式 —— 该指令中的操作数可以采用何种寻址方式
指令对标志的影响 —— 该指令执行后是否对各个标志位有影响,以及如何影响
其他方面 —— 该指令其他需要特别注意的地方,如指令执行时的约定设置,必须预置的参数,隐含使用的寄存器等第 2 章 汇编语言指令格式
由 4部分组成:
标号,指令助记符 目的操作数,源操作数 ; 注释标号 表示该指令在主存中的逻辑地址每个指令 助记符 就代表一种指令目的和源 操作数 表示参与操作的对象注释 是对该指令或程序段功能的说明教学提示全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键第 2 章 2.1 数据传送类指令
数据传送是计算机中最基本,最重要的一种操作
传送指令也是最常使用的一类指令
传送指令把数据从一个位置传送到另一个位置
除标志寄存器传送指令外,均 不影响标志 位
重点掌握
MOV XCHG
PUSH POP
LEA
第 2 章 2.1.1 通用数据传送指令
提供方便灵活的通用传送操作
有 3条指令
MOV
XCHG
XLAT
MOV
XCHG XLAT
第 2 章 1,传送指令 MOV( move)
把一个字节或字的操作数从源地址传送至目的地址
MOV reg/mem,imm;立即数送寄存器或主存例题 2.1
MOV reg/mem/seg,reg;寄存器送(段)寄存器或主存例题 2.2
MOV reg/seg,mem;主存送(段)寄存器例题 2.3
MOV reg/mem,seg;段寄存器送寄存器或主存例题 2.5
第 2 章 MOV指令传送功能
MOV并非任意传送立即数段寄存器
CS DS ES SS
通用寄存器
AX BX CX DX
BP SP SI DI
存储器第 2 章 非法传送种种
两个操作数的类型不一致
例如源操作数是字节,而目的操作数是字;
或相反
两个操作数不能都是存储器
传送指令很灵活,但主存之间的直接传送却不允许
段寄存器的操作有一些限制
段寄存器属专用寄存器,对他们的操作能力有限示例示例示例第 2 章 2,交换指令 XCHG( exchange)
把两个地方的数据进行互换
寄存器与寄存器之间对换数据
寄存器与存储器之间对换数据
不能在存储器与存储器之间对换数据
XCHG reg,reg/mem; reg? reg/mem
例题 2.7
例题 2.6
第 2 章
换码指令执行前:
主存建立一个 字节量表格,含要转换成的目的代码表格首地址 存放于 BX,AL存放相对表格首的 位移量
换码指令执行后:
将 AL寄存器的内容转换为 目标代码
3,换码指令 XLAT( translate)
将 BX指定的缓冲区中,AL指定的位移处的一个字节数据取出赋给 AL
XLAT ; al←ds:[bx+al] 例题 2.8
第 2 章 2.1.2 堆栈操作指令
堆栈:后进先出
FILO,位于堆栈段; SS段寄存器记录其段地址
堆栈只有一个出口,即当前栈顶;
用 堆栈指针寄存器 SP指定第 2 章 堆栈的操作
堆栈只有两种基本操作:进栈和出栈,
对应两条指令 PUSH和 POP
Word 1
Word 2
Word 3
Word 4
Word 5
Stack
PUSH
POP
PUSH ;进栈指令先使堆栈指针 SP减 2,然后把一个字操作数存入堆栈顶部
POP ;出栈指令把栈顶的一个字传送至指定的目的操作数,
然后堆栈指针 SP加 2
第 2 章 1,进栈指令 PUSH
push ax
push [2000h]
PUSH r16/m16/seg; SP←SP - 2; SS:[SP]←r16/m16/seg
Word
Stack
PUSH
SP -2
第 2 章 2,出栈指令 POP
pop ax
pop [2000h]
POP r16/m16/seg; r16/m16/seg←SS:[SP]; SP←SP + 2
Word
Stack
POP
SP
+2
第 2 章 堆栈的特点
堆栈操作的单位是字,进栈和出栈只对字量
字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据
堆栈常用来
临时存放数据
传递参数
保存和恢复寄存器 例题 2.11
第 2 章 2.1.3 标志传送指令
标志寄存器传送指令用来传送标志寄存器 FLAGS的内容
标志位操作指令直接对 CF,DF,IF标志进行复位或置位第 2 章 1,标志寄存器传送
标志寄存器传送指令用来传送标志寄存器 FLAGS的内容,方便进行对各个标志位的直接操作
有 2对 4条指令
低 8位传送,LAHF和 SAHF
16位传送,PUSHF和 POPF
第 2 章 标志低字节进出 AH指令
LAHF; AH←FLAGS 的低字节
LAHF指令将标志寄存器的低字节送寄存器 AH
SF/ZF/AF/PF/CF状态标志位分别送入 AH的第
7/6/4/2/0位,而 AH的第 5/3/1位任意
SAHF; FLAGS的低字节 ← AH
SAHF将 AH寄存器内容送 FLAGS的低字节
用 AH的第 7/6/4/2/0位相应设置 SF/ZF/AF/
PF/CF标志第 2 章 标志寄存器进出堆栈指令
PUSHF; SP←SP - 2; SS:[SP]←FLAGS
PUSHF指令将标志寄存器的内容压入堆栈,
同时栈顶指针 SP减 2
POPF; FLAGS←SS,[SP]; SP←SP + 2
POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针 SP加 2
例题 2.12
第 2 章 2,标志位操作
标志位操作指令直接对 CF,DF,IF标志进行复位或置位,常用于特定的情况
对标志位进行设置的指令
CLC STC CMC
CLD STD
CLI STI
第 2 章 进位标志操作指令
用于任意设置进位标志
CLC ;复位进位标志,CF← 0
STC ;置位进位标志,CF← 1
CMC ;求反进位标志,CF← ~ CF
第 2 章 方向标志操作指令串操作指令中,需要使用
CLD ;复位方向标志,DF← 0
STD ;置位方向标志,DF← 1
第 2 章 中断标志操作指令
在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止
CLI ;复位中断标志,DF← 0
STI ;置位中断标志,DF← 1
第 2 章 2.1.4 地址传送指令
地址传送指令将存储器单元的逻辑地址送至指定的寄存器
有效地址传送指令 LEA
指针传送指令 LDS和 LES
注意不是获取存储器单元的内容第 2 章 有效地址传送指令 LEA( load EA)
将存储器操作数的有效地址传送至指定的 16位寄存器中例题 2.13
LEA r16,mem; r16←mem 的有效地址 EA
第 2 章 指针传送指令
LDS r16,mem; r16←mem,; DS←mem+ 2
LDS指 令 将 主存 中
mem指 定 的 字送 至
r16,并将 mem的下一字送 DS寄存器
LES r16,mem; r16←mem,; ES←mem+ 2
LES指令将主存中
mem指定的字送至
r16,并将 mem的下一字送 ES寄存器例题 2.14
第 2 章 2.1.5 输入输出指令
8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是 端口
( Port) 即 I/O地址
8086用于寻址外设端口的地址线为 16
条,端口最多为 216= 65536( 64K) 个,
端口号为 0000H~ FFFFH
每个端口用于传送一个字节的外设数据第 2 章 输入输出寻址方式
8086的 端口有 64K个,无需分段,设计有两种寻址方式
直接寻址,只用于寻址 00H~ FFH前 256个端口,操作数 i8表示端口号
间接寻址,可用于寻址全部 64K个端口,
DX寄存器的值就是端口号
大于 FFH的端口只能采用间接寻址方式第 2 章 输入指令 IN
将外设数据传送给 CPU内的 AL/AX
IN AL,i8;字节输入,AL←I/O 端口( i8直接寻址)
IN AL,DX;字节输入,AL←I/O 端口( DX间接寻址)
IN AX,i8;字输入,AX←I/O 端口( i8直接寻址)
IN AX,DX;字输入,AX←I/O 端口( DX间接寻址)
例题 2.15
第 2 章 输出指令 OUT
将 CPU内的 AL/AX数据传送给外设
OUT i8,AL;字节输出,I/O端口 ← AL( i8直接寻址)
OUT DX,AL;字节输出,I/O端口 ← AL( DX间接寻址)
OUT i8,AX;字输出,I/O端口 ← AX( i8直接寻址)
OUT DX,AX;字输出,I/O端口 ← AX( DX间接寻址)
例题 2.16
第 2 章 2.2 算术运算类指令
四则运算是计算机经常进行的一种操作 。 算术运算指令实现二进制 ( 和十进制 ) 数据的四则运算
请注意算术运算类指令 对标志的影响
掌握,ADD/ADC/INC,SUB/SBB/DEC/
NEG/CMP
熟悉,MUL/IMUL,DIV/IDIV
理解,CBW/CWD,DAA/DAS,AAA/
AAS/AAM/AAD
第 2 章 加法指令 ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
ADD reg,imm/reg/mem; reg←reg + imm/reg/mem
ADD mem,imm/reg; mem←mem + imm/reg
例题 2.17a
第 2 章 带进位加法指令 ADC
ADC指令将源与目的操作数相加,再加上进位 CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与 ADD配合,实现多精度加法运算
ADC reg,imm/reg/mem; reg←reg + imm/reg/mem+ CF
ADC mem,imm/reg; mem←mem + imm/reg+ CF
例题 2.17b
第 2 章 增量指令 INC( increment)
INC指令对操作数加 1( 增量 )
INC指令不影响进位 CF标志,按定义设置其他状态标志
INC reg/mem; reg/mem←reg/mem + 1
inc bx
inc byte ptr [bx]
第 2 章 减法指令 SUB( subtract)
SUB指令将目的操作数减去源操作数,
结果送到目的操作数
SUB指令按照定义相应设置状态标志
SUB reg,imm/reg/mem; reg←reg - imm/reg/mem
SUB mem,imm/reg; mem←mem - imm/reg
例题 2.18a
第 2 章 带借位减法指令 SBB
SBB指令将目的操作数减去源操作数,再减去借位 CF( 进位 ),结果送到目的操作数 。
SBB指令按照定义相应设置状态标志
SBB指令主要与 SUB配合,实现多精度减法运算
SBB reg,imm/reg/mem; reg←reg - imm/reg/mem- CF
SBB mem,imm/reg; mem←mem - imm/reg- CF
例题 2.18b
第 2 章 减量指令 DEC( decrement)
DEC指令对操作数减 1( 减量 )
DEC指令不影响进位 CF标志,按定义设置其他状态标志
DEC reg/mem; reg/mem←reg/mem - 1
dec cx
dec word ptr [si]
INC指令和 DEC指令都是单操作数指令主要用于对计数器和地址指针的调整第 2 章 求补指令 NEG( negative)
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加 1
NEG指令对标志的影响与用零作减法的 SUB指令一样
NEG reg/mem; reg/mem←0 - reg/mem
例题 2.19
第 2 章 比较指令 CMP( compare)
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
CMP指令执行的功能与 SUB指令,但结果不回送目的操作数
CMP reg,imm/reg/mem; reg- imm/reg/mem
CMP mem,imm/reg; mem- imm/reg
例题 2.20
第 2 章 2.2.3 乘法指令
MUL r8/m8;无符号字节乘法; AX←AL × r8/m8
MUL r16/m16;无符号字乘法; DX.AX←AX × r16/m16
IMUL r8/m8;有符号字节乘法; AX←AL × r8/m8
IMUL r16/m16;有符号字乘法; DX.AX←AX × r16/m16
例题 2.21说明第 2 章 2.2.4 除法指令
DIV r8/m8 ;无符号字节除法:
AL←AX ÷ r8/m8的商,Ah←AX ÷ r8/m8的余数
DIV r16/m16 ;无符号字除法:; AX←DX,AX÷ r16/m16的商,DX←DX,AX÷ r16/m16的余数
IDIV r8/m8 ;有符号字节除法:
AL←AX ÷ r8/m8的商,Ah←AX ÷ r8/m8的余数
IDIV r16/m16 ;有符号字除法:; AX←DX,AX÷ r16/m16的商,DX←DX,AX÷ r16/m16的余数例题 2.22
说明第 2 章 2.2.5 符号扩展指令
CBW ; AL的符号扩展至 AH;如 AL的最高有效位是 0,则 AH= 00; AL的最高有效位为 1,则 AH= FFH。 AL不变
CWD ; AX的符号扩展至 DX;如 AX的最高有效位是 0,则 DX= 00; AX的最高有效位为 1,则 DX= FFFFH。 AX不变
什么是 符号扩展
符号扩展指令常用于获得倍长的数据例题 2.23
例题 2.24
第 2 章 2.2.6 十进制调整指令
压缩 BCD码就是通常的 8421码;它用
4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即 00~
99
非压缩 BCD码用 8
个二进制位表示一个十进制位,只用低 4个二进制位表示一个十进制位
0~ 9,高 4位任意,
通常默认为 0
十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果
分成压缩 BCD码和非压缩 BCD码调整第 2 章 BCD码 ( Binary Coded Decimal)
二进制编码的十进制数:一位十进制数用 4位二进制编码来表示
8086支持压缩 BCD码和非压缩 BCD码的调整运算真值 8 64
二进制编码 08H 40H
压缩 BCD码 08H 64H
非压缩 BCD码 08H 0604H
第 2 章 压缩 BCD码加、减调整指令
( ADD AL,i8/r8/m8)
( ADC AL,i8/r8/m8)
DAA; AL← 将 AL的加和调整为压缩 BCD码
( SUB AL,i8/r8/m8)
( SBB AL,i8/r8/m8)
DAS; AL← 将 AL的减差调整为压缩 BCD码
使用 DAA或 DAS指令前,应先执行以 AL为目的操作数的加法或减法指令
DAA和 DAS指令对 OF标志无定义,按结果影响其他标志,例如 CF反映压缩 BCD码相加或减的进位或借位状态例题 2.25a 例题 2.25b
例题 2.26
第 2 章 非压缩 BCD码加、减调整指令
( ADD AL,i8/r8/m8)
( ADC AL,i8/r8/m8)
AAA; AL← 将 AL的加和调整为非压缩 BCD码; AH←AH +调整的进位
( SUB AL,i8/r8/m8)
( SBB AL,i8/r8/m8)
AAS; AL← 将 AL的减差调整为非压缩 BCD码; AH←AH -调整的借位
使用 AAA或 AAS指令前,应先执行以 AL为目的操作数的加法或减法指令
AAA和 AAS指令在调整中产生了进位或借位,则
AH要加上进位或减去借位,同时 CF=AF=1,否则
CF=AF=0;它们对其他标志无定义例题 2.27a 例题 2.27b
第 2 章 非压缩 BCD码乘、除调整指令
( MUL r8/m8)
AAM; AX← 将 AX的乘积调整为非压缩 BCD码
AAD; AX← 将 AX中非压缩 BCD
码扩展成二进制数
( DIV r8/m8)
AAM指令跟在字节乘 MUL之后,将乘积调整为非压缩 BCD码
AAD指令跟在字节除 DIV之前,先将非压缩 BCD
码的被除数调整为二进制数
AAM和 AAD指令 根据结果设置 SF,ZF和 PF,但对
OF,CF和 AF无定义例题 2.27c 例题 2.27d
第 2 章 习题 2.9
设 X,Y,Z,V均为 16位带符号数,分别存放在 X、
Y,Z,V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?
V
Z
Y
X
65
F3
02
00
24
E0
05
00
习题 2.9:算术运算 1
mov ax,X
imul Y ; DX.AX= X× Y
mov cx,ax
mov bx,dx ; BX.CX= X× Y
mov ax,Z
cwd
add cx,ax
adc bx,dx ; BX.CX= X× Y+ Z
习题 2.9:算术运算 2
sub cx,540
sbb bx,0; BX.CX= X× Y+ Z- 540
mov ax,V
cwd
sub ax,cx
sbb dx,bx; DX.AX= V- ( X× Y+ Z- 540)
idiv X; DX.AX= ( V- ( X× Y+ Z- 540)) ÷ X
教学提示在正确理解每条指令的功能基础上,可以阅读和编写有实际意义的程序段第 2 章 2.3 位操作类指令
位操作类指令以二进制位为基本单位进行数据的操作
这是一类常用的指令,都应该掌握
注意这些指令对标志位的影响
1,逻辑运算指令
AND OR XOR NOT TEST
2,移位指令
SHL SHR SAR
3,循环移位指令
ROL ROR RCL RCR
第 2 章 逻辑与指令 AND
对两个操作数执行逻辑与运算,结果送到目的操作数
AND指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
AND reg,imm/reg/mem ; reg←reg ∧ imm/reg/mem
AND mem,imm/reg ; mem←mem ∧ imm/reg
只有相,与,的两位都是 1,结果才是 1;否则,,与,的结果为
0
第 2 章 逻辑或指令 OR
对两个操作数执行逻辑或运算,结果送到目的操作数
OR指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
OR reg,imm/reg/mem ; reg←reg ∨ imm/reg/mem
OR mem,imm/reg ; mem←mem ∨ imm/reg
只要相,或,的两位有一位是 1,
结果就是 1;否则,结果为 0
第 2 章 逻辑异或指令 XOR
对两个操作数执行逻辑异或运算,结果送到目的操作数
XOR指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
XOR reg,imm/reg/mem ; reg←reg ⊕ imm/reg/mem
XOR mem,imm/reg ; mem←mem ⊕ imm/reg
只有相,异或,的两位不相同,
结果才是 1;否则,结果为 0
第 2 章 逻辑非指令 NOT
对一个操作数执行逻辑非运算
NOT指令是一个单操作数指令
NOT指令不影响标志位
NOT reg/mem ; reg/mem← ~ reg/mem
按位取反,原来是,0”的位变为,1”;原来是,1”的位变为,0”
例题:逻辑运算
mov al,45h ;逻辑与 al=01h
and al,31h ; CF=OF=0,SF=0,ZF=0,PF=0
mov al,45h ;逻辑或 al=75h
or al,31h ; CF=OF=0,SF=0,ZF=0,PF=0
mov al,45h ;逻辑异或 al=74h
xor al,31h ; CF=OF=0,SF=0,ZF=0,PF=1
mov al,45h ;逻辑非 al=0bah
not al ;标志不变例题:逻辑指令应用; AND指令可用于复位某些位 ( 同 0相与 ),不影响其他位:将 BL中 D3和 D0位清 0,其他位不变
and bl,11110110B; OR指令可用于置位某些位 ( 同 1相或 ),不影响其他位:将 BL中 D3和 D0位置 1,其他位不变
or bl,00001001B; XOR指令可用于求反某些位 ( 同 1相异或 ),
不影响其他位:将 BL中 D3和 D0位求反,其他不变
xor bl,00001001B
第 2 章 测试指令 TEST
对两个操作数执行逻辑与运算,结果不回送到目的操作数
TEST指令设置 CF = OF = 0,根据结果设置 SF,ZF和 PF状态,而对 AF未定义
TEST reg,imm/reg/mem ; reg∧ imm/reg/mem
TEST mem,imm/reg ; mem∧ imm/reg
只有相,与,的两位都是 1,结果才是 1;否则,,与,的结果为
0
例 2.32:测试为 0或 1
test al,01h ;测试 AL的最低位 D0
jnz there ;标志 ZF=0,即 D0=1;则程序转移到 there
..,;否则 ZF=1,即 D0=0,顺序执行
there,...
TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况
TEST
第 2 章 移位指令 ( shift)
将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作
SHL reg/mem,1/CL;逻辑左移,最高位进入 CF,最低位补 0SHR reg/mem,1/CL;逻辑右移,最低位进入 CF,最高位补 0SAL reg/mem,1/CL;算术左移,最高位进入 CF,最低位补 0SAR reg/mem,1/CL;算术右移,最低位进入 CF,最高位不变
SAL与 SHL相同第 2 章 移位指令的操作数
移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元
后一个操作数表示移位位数,该操作数为 1,表示移动一位;当移位位数 大于
1时,则用 CL寄存器值表示,该操作数表达为 CL
第 2 章 移位指令对标志的影响
按照移入的位设置进位标志 CF
根据移位后的结果影响 SF,ZF,PF
对 AF没有定义
如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移位前的操作数最高位与移位后操作数的最高位不同 ( 有变化 ),则 OF = 1;否则
OF = 0。 当移位次数大于 1时,OF不确定例 2.33:移位指令
mov cl,4
mov al,0f0h ; al=f0h
shl al,1 ; al=e0h; CF=1,SF=1,ZF=0,PF=0,OF=0
shr al,1 ; al=70h; CF=0,SF=0,ZF=0,PF=0,OF=1
sar al,1 ; al=38h; CF=0,SF=0,ZF=0,PF=0,OF=0
sar al,cl ; al=03h; CF=1,SF=0,ZF=0,PF=1
第 2 章 循环移位指令 ( rotate)
将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作
ROL reg/mem,1/CL ;不带进位循环左移
ROR reg/mem,1/CL ;不带进位循环右移
RCL reg/mem,1/CL ;带进位循环左移
RCR reg/mem,1/CL ;带进位循环右移第 2 章 循环移位指令对标志的影响
按照指令功能设置进位标志 CF
不影响 SF,ZF,PF,AF
如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移位前的操作数最高位与移位后操作数的最高位不同 ( 有变化 ),则 OF = 1;否则
OF = 0。 当移位次数大于 1时,OF不确定例 2.35,32位数移位;将 DX.AX中 32位数值左移一位
shl ax,1
rcl dx,1
DX AXCF
0
例 2.36:位传送;把 AL最低位送 BL最低位,保持 AL不变
ror bl,1
ror al,1
rcl bl,1
rol al,1
AL,BL CF
BL CF
ALCF
AL之 D0
例 2.37,BCD码合并; AH.AL分别存放着非压缩 BCD码的两位;将它们合并成为一个压缩 BCD码存 AL
and ax,0f0fh ;保证高 4位为 0
mov cl,4
rol ah,cl ;也可以用 shl ah,cl
add al,ah ;也可以用 or al,ah
第 2 章 2.4 控制转移类指令
控制转移类指令 用于实现分支,循环,过程等程序结构,是仅次于传送 指令的常用指令重点掌握,JMP/Jcc/LOOP CALL/RET
INTn/IRET 常用系统功能调用一般了解,LOOPZ/LOOPNZ INTO
控制转移类指令通过 改变 IP( 和 CS)
值,实现程序执行顺序的改变第 2 章 2.4.1 无条件转移指令
只要执行无条件转移指令 JMP,就使程序转到指定的目标地址处,从目标地址处开始执行指令
操作数 label是要转移到的 目标地址 ( 目的地址,
转移地址 )
JMP指令分成 4种类型:
⑴ 段内转移,相对寻址
⑵ 段内转移,间接寻址
⑶ 段间转移,直接寻址
⑷ 段间转移,间接寻址
JMP label ;程序转向 label标号指定的地址第 2 章 目标地址的寻址方式
相对寻址方式
相对寻址方式以当前 IP为基地址,加上位移量构成目标地址
直接寻址方式
转移地址象立即数一样,直接在指令的机器代码中
间接寻址方式
转移地址在寄存器或主存单元中用标号表达用寄存器或存储器操作数表达用标号表达第 2 章 目标地址的范围:段内
段内转移 —— 近转移 ( near)
在当前代码段 64KB范围内转移
( ± 32KB范围 )
不需要更改 CS段地址,只要改变 IP偏移地址
段内转移 —— 短转移 ( short)
转移范围可以用一个字节表达,
在段内- 128~+ 127范围的转移代码段代码段第 2 章 目标地址的范围:段间
段间转移 —— 远转移 ( far)
从当前代码段跳转到另一个代码段,可以在 1MB范围
更改 CS段地址和 IP偏移地址
目标地址必须用一个 32位数表达,叫做 32位远指针,它就是逻辑地址代码段代码段实际编程时,MASM汇编程序会根据目标地址的距离,自动处理 成短转移,近转移或远转移程序员可用操作符 short,nearptr 或 far ptr 强制第 2 章 段内转移、相对寻址
JMP label ; IP←IP+ 位移量
位移量是紧接着 JMP指令后的那条指令的偏移地址,
到目标指令的偏移地址的地址位移
当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负
again,dec cx ;标号 again的指令……
jmp again ;转移到 again处继续执行……
jmp output ;转向 output……
output,mov result,al ;标号 output的指令第 2 章 段内转移、间接寻址
JMP r16/m16 ; IP←r 16/m16
将一个 16位寄存器或主存字单元内容送入 IP
寄存器,作为新的指令指针,但不修改 CS寄存器的内容
jmp ax ; IP←AX
jmp word ptr [2000h] ; IP←[ 2000h]
第 2 章 段间转移、直接寻址
JMP far ptr label; IP←label 的偏移地址; CS←label 的段地址
将标号所在段的段地址作为新的 CS值,
标号在该段内的偏移地址作为新的 IP值;这样,程序跳转到新的代码段执行
jmp far ptr otherseg;远转移到代码段 2的 otherseg
第 2 章 段间转移、间接寻址
JMP far ptr mem; IP←[mem],CS←[mem+ 2]
用一个双字存储单元表示要跳转的目标地址 。 这个目标地址存放在主存中连续的两个字单元中的,低位字送 IP寄存器,高位字送
CS寄存器
mov word ptr [bx],0
mov word ptr [bx+2],1500h
JMP far ptr [bx] ;转移到 1500h:0
第 2 章 2.4.2 条件转移指令
指定的条件 cc如果成立,程序转移到由标号 label
指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令
操作数 label是采用相对寻址方式的短转移标号
表示 Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移
距当前 IP地址- 128~+ 127个单元的范围之内
Jcc label;条件满足,发生转移,IP←IP + 8位位移量;条件不满足,顺序执行第 2 章 Jcc指令的分类
Jcc指令不影响标志,但要利用标志
( 表 2.2) 。 根据利用的标志位不同,
16条指令分成 3种情况:
1,判断单个标志位状态
2,比较无符号数高低
3,比较有符号数大小第 2 章 判断单个标志位状态
这组指令单独判断 5个状态标志之一
⑴ JZ/JE和 JNZ/JNE:利用零标志 ZF,判断结果是否为零 ( 或相等 )
⑵ JS和 JNS:利用符号标志 SF,判断结果是正是负
⑶ JO和 JNO:利用溢出标志 OF,判断结果是否产生溢出
⑷ JP/JPE和 JNP/JPO:利用奇偶标志 PF,判断结果中,1”的个数是偶是奇
⑸ JC/JB/JNAE和 JNC/JNB/JAE:利用进位标志 CF,
判断结果是否进位或借位例题 2.38
例题 2.39
例题 2.40
例题 2.41
例题 2.42
第 2 章 比较无符号数高低
无符号数的大小用高 ( Above) 低 ( Below)
表示
利用 CF确定高低,利用 ZF标志确定相等
( Equal)
两数的高低分成 4种关系:
⑴ 低于 ( 不高于等于 ),JB( JNAE)
⑵ 不低于 ( 高于等于 ),JNB( JAE)
⑶ 低于等于 ( 不高于 ),JBE( JNA)
⑷ 不低于等于 ( 高于 ),JNBE( JA)
例 2.43a:比较无符号数
cmp ax,bx ;比较 ax和 bx
jnb next ;若 ax≥ bx,转移
xchg ax,bx ;若 ax< bx,交换
next,...
结果,AX保存较大的 无符号数第 2 章 比较有符号数大小
有符号数的大 ( Greater) 小 ( Less) 需要组合 OF,SF标志,并利用 ZF标志确定相等
( Equal)
两数的大小分成 4种关系:
⑴ 小于 ( 不大于等于 ),JL( JNGE)
⑵ 不小于 ( 大于等于 ),JNL( JGE)
⑶ 小于等于 ( 不大于 ),JLE( JNG)
⑷ 不小于等于 ( 大于 ),JNLE( JG)
例 2.43b:比较有符号数
cmp ax,bx ;比较 ax和 bx
jnl next ;若 ax≥ bx,转移
xchg ax,bx ;若 ax< bx,交换
next,...
结果,AX保存较大的 有符号数第 2 章 2.4.3 循环指令 ( loop)
循环指令默认利用 CX计数器
label操作数采用相对短转移寻址方式
LOOP label ; CX←CX - 1,; CX≠0,循环到标号 label
LOOPZ label; CX←CX - 1,; CX≠0 且 ZF= 1,循环到标号 label
LOOPNZ label ; CX←CX - 1,; CX≠0 且 ZF= 0,循环到标号 label
JCXZ label ; CX= 0,转移到标号 label
例 2.44:记录空格个数
mov cx,count;设置循环次数
mov si,offset string
xor bx,bx ; bx= 0,记录空格数
jcxz done
mov al,20h ;如果长度为 0,退出
again,cmp al,es:[si]
jnz next ; ZF= 0非空格,转移
inc bx ; ZF=1是空格,个数加 1
next,inc si
loop again;字符个数减 1,不为 0继续循环
dec cx
jnz again
cmp cx,0
jz next
第 2 章 2.4.4 子程序指令
子程序是完成特定功能的一段程序
当主程序 ( 调用程序 ) 需要执行这个功能时,
采用 CALL调用指令转移到该子程序的起始处执行
当运行完子程序功能后,采用 RET返回指令回到主程序继续执行演示第 2 章 子程序调用指令
CALL指令分成 4种类型 ( 类似 JMP)
CALL label ;段内调用,相对寻址
CALL r16/m16 ;段内调用,间接寻址
CALL far ptr label ;段间调用,直接寻址
CALL far ptr mem ;段间调用,间接寻址
CALL指令需要保存返回地址:
段内调用 —— 入栈偏移地址 IP
SP←SP - 2,SS:[SP]←IP
段间调用 —— 入栈偏移地址 IP和段地址 CS
SP←SP - 2,SS:[SP]←IP
SP←SP - 2,SS:[SP]←CS
第 2 章 子程序返回指令
根据段内和段间,有无参数,分成 4种类型
RET ;无参数段内返回
RET i16 ;有参数段内返回
RET ;无参数段间返回
RET i16 ;有参数段间返回
需要弹出 CALL指令压入堆栈的返回地址
段内返回 —— 出栈偏移地址 IP
IP←SS,[SP],SP←SP + 2
段间返回 —— 出栈偏移地址 IP和段地址 CS
IP←SS,[SP],SP←SP + 2
CS←SS,[SP],SP←SP + 2
i16参数的作用例 2.45:子程序;主程序 mov al,0fh ;提供参数 AL
call htoasc ;调用子程序
...;子程序,将 AL低 4位的一位 16进制数 转换 成 ASCII码
htoasc:and al,0fh ;只取 al的低 4位
or al,30h ; al高 4位变成 3
cmp al,39h ;是 0~ 9,还是 0Ah~ 0Fh
jbe htoend
add al,7 ;是 0Ah~ 0Fh,加上 7
htoend:ret ;子程序返回第 2 章 2.4.5 中断指令
中断 ( Interrupt ) 是又一种改变程序执行顺序的方法
中断具有多种中断类型
中断的指令有 3条:
INTi8 IRET INTO
本节主要掌握类似子程序调用指令的中断调用指令 INT i8,进而学习使用 DOS
功能调用第 2 章 8086的外部中断
8086可以管理 256个中断
各种中断用一个向量编号来区别
主要分成外部中断和内部中断
外部中断 —— 来自 CPU之外的原因引起的中断,又可以分成
可屏蔽中断,可由 CPU的中断允许标志 IF控制
非屏蔽中断,不受 CPU的中断允许标志 IF控制第 2 章 8086的内部中断
内部中断 —— CPU内部执行程序引起的中断,又可以分成:
除法错中断,执行除法指令,结果溢出产生的
0 号中断
指令中断,执行中断调用指令 INT i8产生的 i8
号中断
断点中断,用于断点调试 ( INT3) 的 3 号中断
溢出中断,执行溢出中断指令,OF= 1产生的
4 号中断
单步中断,TF= 1在每条指令执行后产生的 1
号中断第 2 章 中断指令 INT
INT i8;中断调用指令:产生 i8号中断
IRET;中断返回指令:实现中断返回
INTO;溢出中断指令:;若溢出标志 OF=1,产生 4号中断;否则顺序执行第 2 章 2.4.6 系统功能调用
21H号中断是 DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理,目录管理和文件管理三个方面的功能
ROM-BIOS也以中断服务程序的形式,
向程序员提供系统的基本输入输出程序
汇编语言程序设计需要采用系统的各种功能程序
充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握第 2 章 功能调用的步骤通常按照如下 4个步骤进行:
⑴ 在 AH寄存器中设置系统功能调用号
⑵ 在指定寄存器中设置入口参数
⑶ 执行指令 INT 21H( 或 ROM-BIOS的中断向量号 ) 实现中断服务程序的功能调用
⑷ 根据出口参数分析功能调用执行情况第 2 章 输入输出类功能调用
向显示器输出字符
⒈ 字符的输出
⒉ 字符串的输出
从键盘输入数据
⒊ 字符的输入
⒋ 字符串的输入
⒌ 按键的判断 裸机汇编语言程序第 2 章 字符输出的功能调用
DOS功能调用 INT21H
功能号,AH= 02H
入口参数,DL=字符的 ASCII码
功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置 。 如按 Ctrl-Break或 Ctrl-C则退出例 2.46:显示问号;在当前显示器光标位置显示一个问号
mov ah,02h ;设置功能号,ah← 02h
mov dl,'?' ;提供入口参数,dl←'?'
int 21h ; DOS功能调用:显示进行字符输出时,当输出响铃字符 ( 07H)
以及退格 ( 08H),回车 ( 0DH) 和换 行
( 0AH) 字符时,该功能调用可以自动识别并能进行相应处理第 2 章 字符输出的功能调用
显示器功能调用 INT 10H
功能号,AH= 0EH
入口参数,AL=字符的 ASCII码
BL=字符的颜色值 ( 图形方式 )
BH=页号 ( 字符方式 )
通常使 BX= 0
功能:将字符按原属性在光标处显示,
光标自动移到下一个字符位置第 2 章 字符串输出的功能调用
DOS功能调用 INT21H
功能号,AH= 09H
入口参数:
DS:DX=欲显示字符串在主存中的首地址字符串应以 $( 24H) 结束
功能:在显示器输出指定的字符串
可以输出回车 ( 0DH) 和换行 ( 0AH) 字符产生回车和换行的作用例 2.47:显示字符串
string db 'Hello,Everybody !',0dh,0ah,'$';在数据段定义要显示的字符串
...
mov ah,09h;设置功能号,ah← 09h
mov dx,offset string;提供入口参数,dx← 字符串的偏移地址
int 21h; DOS功能调用:显示第 2 章 字符输入的功能调用
DOS功能调用 INT21H
功能号,AH= 01H
出口参数,AL=字符的 ASCII码
功能:获得按键的 ASCII代码值
调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值例 2.48:判断按键
getkey,mov ah,01h ;功能号,ah← 01h
int 21h ;功能调用
cmp al,’Y’ ;处理出口参数 al
je yeskey ;是,Y”
cmp al,’N’
je nokey ;是,N”
jne getkey
...
yeskey,...
nokey,...
第 2 章 字符输入的功能调用
键盘功能调用 INT16H
功能号,AH= 0
出口参数,AX=键值代码对于标准 ASCII码按键,AL= ASCII码,AH
=扫描码;
对于扩展按键,AL= 00H,AH=键扩展码;
对于 alt+小键盘数字按键,AL= ASCII码,
AH= 00H
此功能类同 DOS功能 01H,会一直等待按键例 2.49:字符输入输出
mov ah,0 ;键盘功能调用 ( int 16h)
int 16h ; al← 按键的 ASCII码
mov bx,0 ;显示功能调用 ( int 10h)
mov ah,0eh
int 10h ;显示第 2 章 字符串输入的功能调用
DOS功能调用 INT21H
功能号,AH= 0AH
入口参数,DS:DX=缓冲区首地址
执行该功能调用时,用户按键,最后用回车确认
本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按 Ctrl+ Break或
Ctrl+ C则中止关键要定义好缓冲区例 2.50:输入字符串
buffer db 81 ;定义缓冲区;第 1个字节填入可能输入的最大字符数
db 0 ;存放实际输入的字符数
db 81 dup(0) ;存放输入的字符串
...
mov dx,seg buffer;伪指令 seg取得 buffer的段地址
mov ds,dx ;设置数据段 DS
mov dx,offset buffer
mov ah,0ah
int 21h
第 2 章 按键判断的功能调用
DOS功能调用 INT21H
功能号,AH= 0BH
出口参数,AL= 0,当前没有按键;
AL= FFH,当前已经按键 。
功能:仅判断当前是否有按下的键,
设置 AL后退出例 2.51:按任意键继续
..,;提示,按任意键继续,
getkey:mov ah,0bh
int 21h
or al,al ; al= 0?
jz getkey; al= 0,没有按键,继续等待;等同于如下功能调用
mov ah,01h
int 21h
第 2 章 按键判断的功能调用
键盘功能调用 INT16H
功能号,AH= 1
出口参数:若标志 ZF= 1,无键按下;
若 ZF= 0,有键按下,且 AX=键值代码
功能:此子功能仅判断是否按键,设置零位标志 ZF后退出
这两个功能调用都不循环等待按键,即使有键按下,键盘缓冲区仍然保留键值并且没有被清空,必要时必须用字符输入功能取走键值清空缓冲区教学提示在学习和应用汇编语言进行程序设计时,有一些经常遇到的问题,例如算术运算,
代码转换等,需要掌握第 2 章 2.5 串操作类指令
串操作指令是 8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,
常用在操作主存连续区域的数据时主要熟悉,MOVS STOS LODS
CMPS SCAS REP
一般了解,REPZ/REPE REPNZ/REPNE
第 2 章 串数据类型
串操作指令的操作数是 主存中连续存放的数据串 ( String) —— 即在连续的主存区域中,字节或字的序列
串操作指令的 操作对象是以字 ( W) 为单位的字串,或是以字节 ( B) 为单位的字节串第 2 章 串寻址方式
源操作数用寄存器 SI寻址,默认在数据段 DS中,
但允许段超越,DS:[SI]
目的操作数用寄存器 DI寻址,默认在附加段 ES中,
不允许段超越,ES:[DI]
每执行一次串操作指令,SI和 DI将自动修改:
± 1( 对于字节串 ) 或 ± 2( 对于字串 )
执行指令 CLD后,DF= 0,地址指针增 1或 2
执行指令 STD后,DF =1,地址指针减 1或 2
第 2 章 串传送 MOVS( move string)
把字节或字操作数从主存的源地址传送至目的地址
MOVSB;字节串传送,ES:[DI]←DS:[SI]; SI←SI ± 1,DI←DI ± 1
MOVSW;字串传送,ES:[DI]←DS:[SI]; SI←SI ± 2,DI←DI ± 2
例 2.52:字节串传送
mov si,offset source
mov di,offset destination
mov cx,100 ; cx← 传送次数
cld ;置 DF=0,地址增加
again,movsb ; 传送一个字节
dec cx ;传送次数减 1
jnz again;判断传送次数 cx是否为 0;不为 0,则到 again位置执行指令;否则,结束
offset是汇编操作符,
求出变量的偏移地址例 2.52:字串传送
mov si,offset source
mov di,offset destination
mov cx,50 ; cx← 传送次数
cld ;置 DF=0,地址增加
again,movsw ; 传送一个字
dec cx ;传送次数减 1
jnz again;判断传送次数 cx是否为 0;不为 0,则到 again位置执行指令;否则,结束第 2 章 串存储 STOS( store string)
把 AL或 AX数据传送至目的地址
STOSB;字节串存储,ES:[DI]←AL; DI←DI ± 1
STOSW;字串存储,ES:[DI]←AX; DI←DI ± 2
例 2.53:串存储
mov ax,0
mov di,0
mov cx,8000h; cx← 传送次数 ( 32× 1024)
cld ; DF=0,地址增加
again,stosw ;传送一个字
dec cx ;传送次数减 1
jnz again ;传送次数 cx是否为 0
可将 CLD改为 STD吗? 如何改用 STOSB?
可不用给 DI赋值吗?
DI为偶数即可第 2 章 串读取 LODS( load string)
把指定主存单元的数据传送给 AL或 AX
LODSB;字节串读取,AL←DS:[SI]; SI←SI ± 1
LODSW;字串读取,AX←DS:[SI]; SI←SI ± 2
例 2.54:串读取- 1
mov si,offset block
mov di,offset dplus
mov bx,offset dminus
mov ax,ds
mov es,ax;数据都在一个段中,所以设置 es=ds
mov cx,count ; cx← 字节数
cld
例 2,54:串读取- 2
go_on,lodsb ;从 block取出一个数据
test al,80h;检测符号位,判断是正是负
jnz minus;符号位为 1,是负数,转向 minus
stosb;符号位为 0,是正数,存入 dplus
jmp again;程序转移到 again处继续执行
jnz go_on ;完成正负数据分离例 2.54:串读取- 3
minus:xchg bx,di
stosb ;把负数存入 dminus
xchg bx,di
again:dec cx ;字节数减 1
jnz go_on ;完成正负数据分离第 2 章 串比较 CMPS
( compare string)
将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系
CMPSB;字节串比较,DS:[SI]- ES:[DI]; SI←SI ± 1,DI←DI ± 1
CMPSW;字串比较,DS:[SI]- ES:[DI]; SI←SI ± 2,DI←DI ± 2
例 2.55:比较字符串
mov si,offset string1
mov di,offset string2
mov cx,count
cld
again,cmpsb ;比较两个字符
jnz unmat ;有不同字符,转移
dec cx
jnz again ;进行下一个字符比较
mov al,0 ;字符串相等,设置 00h
jmp output ;转向 output
unmat,mov al,0ffh ;设置 ffh
output:mov result,al;输出结果标记第 2 章 串扫描 SCAS( scan string)
将 AL/AX减去至目的操作数,以便设置标志,
进而比较 AL/AX与操作数之间的关系
SCASB;字节串扫描,AL- ES:[DI]; DI←DI ± 1
SCASW;字串扫描,AX- ES:[DI]; DI←DI ± 2
例 2.56:查找字符串
mov di,offset string
mov al,20h
mov cx,count
cld
again,scasb ;搜索
jz found ;为 0( ZF=1),发现空格
dec cx ;不是空格
jnz again ;搜索下一个字符
..,;不含空格,则继续执行
found,...
第 2 章 重复前缀指令 ( repeat)
串操作指令执行一次,仅对数据串中的一个字节或字量进行操作 。 但是串操作指令前,
都可以加一个重复前缀,实现串操作的重复执行 。 重复次数隐含在 CX寄存器中
重复前缀分 2类,3条指令:
配合不影响标志的 MOVS,STOS( 和 LODS)
指令的 REP前缀
配合影响标志的 CMPS和 SCAS指令的 REPZ和
REPNZ前缀第 2 章 REP重复前缀指令
REP前缀可以理解为:当数据串没有结束 ( CX≠0),则继续传送
例 2.52和 例 2.53中,程序段的最后 3条指令,可以分别替换为:
REP MOVSB 和 REP STOSW
REP ;每执行一次串指令,CX减 1;直到 CX= 0,重复执行结束第 2 章 REPZ重复前缀指令
REPZ/REPE前缀可以理解为:当数据串没有结束 ( CX≠0),并且串相等 ( ZF= 1),则继续比较
REPZ ;每执行一次串指令,CX减 1;并判断 ZF是否为 0,;只要 CX= 0或 ZF= 0,重复执行结束第 2 章 REPNZ重复前缀指令
REPNZ/REPNE前缀可以理解为:
当数据串没有结束 ( CX≠0),并且串不相等 ( ZF= 0),则继续比较
REPZ ;每执行一次串指令,CX减 1;并判断 ZF是否为 1,;只要 CX= 0或 ZF= 1,重复执行结束例 2.57:比较字符串
mov si,offset string1
mov di,offset string2
mov cx,count
cld
repz cmpsb ;重复比较两个字符
jnz unmat ;字符串不等,转移
mov al,0 ;字符串相等,设置 00h
jmp output ;转向 output
unmat,mov al,0ffh ;设置 ffh
output:mov result,al;输出结果标记解释例 2.58:查找字符串
mov di,offset string
mov al,20h
mov cx,count
cld
repnz scasb ;搜索
jz found ;为 0( ZF=1),发现空格
..,;不含空格,则继续执行
found,...
第 2 章 2.6 处理机控制类指令
对 CPU状态进行控制的指令
NOP CS,SS,DS,ES:
LOCK HLT ESC WAIT
第 2 章 空操作指令
NOP
不执行任何操作,但占用一个字节存储单元,
空耗一个指令执行周期
NOP常用于程序调试
在需要预留指令空间时用 NOP填充
代码空间多余时也可以用 NOP填充
还可以用 NOP实现软件延时
事实上,NOP和 XCHG AX,AX的指令代码一样,都是 90H
第 2 章 段超越前缀指令
在允许段超越的存储器操作数之前,使用段超越前缀指令,将采用指定的段寄存器寻址操作数
CS,;使用代码段的数据
SS,;使用堆栈段的数据
DS,;使用数据段的数据
ES,;使用附加段的数据第 2 章 封锁前缀指令
LOCK ;封锁总线
这是一个指令前缀,可放在任何指令前
这个前缀使得在这个指令执行时间内,
8086 处理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除第 2 章 暂停指令
HLT ;进入暂停状态
暂停指令使 CPU进入暂停状态,这时 CPU
不进行任何操作 。 当 CPU发生复位或来自外部的中断时,CPU脱离暂停状态
HLT指令可用于程序中等待中断 。 当程序中必须等待中断时,可用 HLT,而不必用软件死循环 。 然后,中断使 CPU脱离暂停状态,
返回执行 HLT的下一条指令第 2 章 交权指令
ESC 6位立即数,reg/mem;把浮点指令交给浮点处理器执行
浮点协处理器 8087指令是与 8086的整数指令组合在一起的,当 8086发现是一条浮点指令时,就利用 ESC指令将浮点指令交给 8087执行
实际编写程序时,一般采用易于理解的浮点指令助记符格式
ESC 6,[SI];实数除法指令,FDIVdword ptr [SI]
ESC 20H,AL;整数加法指令,FADDST(0),ST
第 2 章 等待指令
WAIT ;进入等待状态
8086利用 WAIT指令和测试引脚实现与 8087
同步运行
浮点指令经由 8086处理发往 8087,并与
8086本身的整数指令在同一个指令序列;
而 8087执行浮点指令较慢,所以 8086必须与 8087保持同步第 2 章 第 2章 总结
本章详细而完整地介绍了 8086的 16位指令系统的每条指令
希望大家进行一下整理 ( 总结 ),
寻址方式
指令支持的操作数形式
指令对标志的影响
常见编程问题
通过复习整理,形成指令系统的整体概念,
进而掌握常用指令第 2章 教学要求 ( 1)
1,熟悉 8086的基本参数,堆栈工作原理,指令对标志的影响,符号扩展的含义,压缩和非压缩
BCD的格式,串操作寻址特点
2,掌握基本指令,MOV/ XCHG,PUSH/ POP、
LEA; ADD/ ADC/ INC,SUB/ SBB/ DEC
/ CMP/ NEG; AND/ OR/ XOR/ NOT/
TEST,SHL/ SHR/ SAR,ROL/ ROR/ RCL
/ RCR; JMP/ Jcc,JCXZ/ LOOP,CALL
/ RET,INT n,MOVS/ LODS/ STOS,REP
第 2章 教学要求 ( 2)
3,熟悉特色指令,XLAT,IN/ OUT; MUL/
IMUL,DIV / IDIV,CBW/ CWD ; NOP,
CLC/ STC/ STC,CLD/ STD
4,了 解其 他指 令,LAHF/ SAHF/ PUSHF/
POPF,LDS/ LES; DAA/ DAS,AAA/
AAS,AAM / AAD ; IRET,LOOPZ /
LOOPNZ,INTO; CMPS/ SCAS,REPZ/
REPNZ; LOCK/ HLT/ ESC/ WAIT,CLI/
STI
第 2章 教学要求 ( 3)
5,习题
2.1 2.6 2.8 2.10
2.22 2.24 2.26 ⑶ ⑹ ⑺ 2.34