教学提示全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键第 2 章 2.3 数据传送类指令
数据传送是计算机中最基本,最重要的一种操作
传送指令也是最常使用的一类指令
传送指令把数据从一个位置传送到另一个位置
除标志寄存器传送指令外,均 不影响标志 位
重点掌握
MOV XCHG XLAT PUSH POP LEA
第 2 章 2.3.1 通用数据传送指令
提供方便灵活的通用传送操作
有 3条指令
MOV
XCHG
XLAT
MOV
XCHG XLAT
第 2 章 传送指令 MOV( move)
把一个字节或字的操作数从源地址传送至目的地址
MOV reg/mem,imm;立即数送寄存器或主存
MOV
例题 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 章 交换指令 XCHG( exchange)
把两个地方的数据进行互换
寄存器与寄存器之间对换数据
寄存器与存储器之间对换数据
不能在存储器与存储器之间对换数据
XCHG
XCHG reg,reg/mem; reg? reg/mem
例题 2.7
例题 2.6
第 2 章
换码指令执行前:
在主存建立一个 字节量表格,内含要转换成的目的代码表格首地址 存放于 BX,AL存放相对表格首地址的 位移量
换码指令执行后:
将 AL寄存器的内容转换为 目标代码换码指令 XLAT( translate)
将 BX指定的缓冲区中,AL指定的位移处的一个字节数据取出赋给 AL
XLAT
XLAT ; al←ds:[bx+al] 例题 2.8
2.3.2 堆栈操作指令
堆栈是一个,后进先出
FILO”( 或说,先进后出 FILO”) 的主存区域,
位于堆栈段中; SS段寄存器 记录其段地址
堆栈只有一个出口,即当前栈顶;用 堆栈指针寄存器 SP指定
栈顶是地址较小的一端
( 低端 ),栈底不变第 2 章第 2 章 堆栈的操作
堆栈只有两种基本操作:进栈和出栈,对应两条指令 PUSH和 POP
PUSH;进栈指令先使堆栈指针 SP减 2,
然后把一个字操作数存入堆栈顶部
POP;出栈指令把栈顶的一个字传送至指定的目的操作数,
然后堆栈指针 SP加 2
第 2 章 进栈指令 PUSH
push ax
push [2000h]
PUSH r16/m16/seg; SP←SP - 2; SS:[SP]←r16/m16/seg
PUSH
第 2 章 出栈指令 POP
pop ax
pop [2000h]
POP r16/m16/seg; r16/m16/seg←SS:[SP]; SP←SP + 2
POP
第 2 章 堆栈的特点
堆栈操作的单位是字,进栈和出栈只对字量
字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据
堆栈常用来
临时存放数据
传递参数
保存和恢复寄存器例题 2.11
第 2 章 2.3.3 标志寄存器传送指令
标志寄存器传送指令用来传送标志寄存器 FLAGS的内容,方便进行对各个标志位的直接操作
有 2对 4条指令
低 8位传送,LAHF和 SAHF
16位传送,PUSHF和 POPF
标志低字节进出 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 章 2.3.4 地址传送指令
地址传送指令将存储器单元的逻辑地址送至指定的寄存器
有效地址传送指令 LEA
指针传送指令 LDS和 LES
注意不是获取存储器单元的内容第 2 章 有效地址传送指令 LEA( loadEA)
将存储器操作数的有效地址传送至指定的 16位寄存器中例题 2.13
LEA r16,mem; r16←mem 的有效地址 EA
LEA
指针传送指令
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 章 2.3.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间接寻址)
IN
例题 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间接寻址)
OUT
例题 2.16
演示第 2 章 2.4 算术运算类指令
四则运算是计算机经常进行的一种操作 。 算术运算指令实现二进制 ( 和十进制 ) 数据的四则运算
请注意算术运算类指令 对标志的影响
掌握,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
ADD reg,imm/reg/mem; reg←reg + imm/reg/mem
ADD mem,imm/reg; mem←mem + imm/reg
例题 2.17
第 2 章 带进位加法指令 ADC
ADC指令将源与目的操作数相加,再加上进位 CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与 ADD配合,实现多精度加法运算
ADC
ADC reg,imm/reg/mem; reg←reg + imm/reg/mem+ CF
ADC mem,imm/reg; mem←mem + imm/reg+ CF
例题 2.18
第 2 章 增量指令 INC( increment)
INC指令对操作数加 1( 增量 )
INC指令不影响进位 CF标志,按定义设置其他状态标志
INC
INC reg/mem; reg/mem←reg/mem + 1
inc bx
inc byte ptr [bx]
第 2 章 减法指令 SUB( subtract)
SUB指令将目的操作数减去源操作数,
结果送到目的操作数
SUB指令按照定义相应设置状态标志
SUB
SUB reg,imm/reg/mem; reg←reg - imm/reg/mem
SUB mem,imm/reg; mem←mem - imm/reg
例题 2.17
第 2 章 带借位减法指令 SBB
SBB指令将目的操作数减去源操作数,再减去借位 CF( 进位 ),结果送到目的操作数 。
SBB指令按照定义相应设置状态标志
SBB指令主要与 SUB配合,实现多精度减法运算
SBB
SBB reg,imm/reg/mem; reg←reg - imm/reg/mem- CF
SBB mem,imm/reg; mem←mem - imm/reg- CF
例题 2.18
第 2 章 减量指令 DEC( decrement)
DEC指令对操作数减 1( 减量 )
DEC指令不影响进位 CF标志,按定义设置其他状态标志
DEC
DEC reg/mem; reg/mem←reg/mem - 1
dec cx
dec word ptr [si]
INC指令和 DEC指令都是单操作数指令主要用于对计数器和地址指针的调整第 2 章 求补指令 NEG( negative)
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加 1
NEG指令对标志的影响与用零作减法的 SUB指令一样
NEG
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
CMP
2.4.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.4.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.4.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.4.6 十进制调整指令
压缩 BCD码就是通常的 8421码;它用 4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,
即 00~ 99
非压缩 BCD码用 8个二进制位表示一个十进制位,只用低 4个二进制位表示一个十进制位 0~ 9,高 4位任意,通常默认为 0
十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果
分成压缩 BCD码和非压缩 BCD码调整第 2 章第 2 章 BCD码 ( Binary Coded Decimal)
二进制编码的十进制数:一位十进制数用 4位二进制编码来表示
8086支持压缩 BCD码和非压缩
BCD码的调整运算真值 8 64
二进制编码 08H 40H
压缩 BCD码 08H 64H
非压缩 BCD码 08H 0604H
压缩 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 章例题 2.25a 例题 2.25b
例题 2.26
非压缩 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 章例题 2.27a 例题 2.27b
非压缩 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 章例题 2.27c 例题 2.27d
第 2 章 习题 2.19( p72)
设 X,Y,Z,V均为
16位带符号数,分别存放在 X,Y,Z、
V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处?
X
Y
Z
V
65
F3
02
00
24
E0
05
00
习题 2.19:算术运算 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.19:算术运算 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)
1,熟悉 8086的基本参数,堆栈工作原理,指令对标志的影响,符号扩展的含义,压缩和非压缩 BCD的格式
2,掌 握基 本指 令,MOV/ XCHG/ XLAT、
PUSH/ POP,LEA; CLC/ STC/ STC、
CLD/ STD; ADD/ ADC/ INC,SUB/
SBB/ DEC/ CMP/ NEG,CBW/ CWD
第 2章 教学要求 ( 3)
3,熟悉特色指令,IN/ OUT ; CLI/ STI; MUL
/ IMUL,DIV/ IDIV,DAA/ DAS,AAA/
AAS
4,了解不常使用的指令,LAHF/ SAHF/
PUSHF/ POPF,LDS/ LES; AAM/ AAD;
5,习题 2( p71)
2.15~ 2.18 2.20
课间休息