1
? 数据传送指令
? 算术指令
? 逻辑指令
? 串处理指令
? 控制转移指令
? 处理机控制与杂项操作指令
2,8086 的指令系统
2
重点关注,
? 指令的汇编格式
? 指令的基本功能
? 指令支持的寻址方式
? 指令的执行对标志位的影响
? 指令的特殊要求
3
数据传送指令,
? 通用数据传送指令
MOV,PUSH,POP,XCHG
? 累加器专用传送指令
IN,OUT,XLAT
? 地址传送指令
LEA,LDS,LES
? 标志寄存器传送指令
LAHF,SAHF,PUSHF,POPF
? 类型转换指令
CBW,CWD
4
传送指令,MOV DST,SRC
执行操作,( DST ) ? ( SRC )
注意,
* DST 不能是 CS
* DST,SRC 不能同时为段寄存器 MOV DS,ES ?
* 立即数不能直接送段寄存器 MOV DS,2000H ?
* DST 不能是立即数
* DST,SRC 不能同时为存储器寻址
? 通用数据传送指令
5
进栈指令,PUSH SRC
执行操作,( SP ) ? ( SP ) – 2
( ( SP ) + 1,( SP ) ) ? ( SRC )
出栈指令,POP DST
执行操作,( DST ) ? ( ( SP ) + 1,( SP ) )
( SP ) ? ( SP ) + 2
堆栈,‘ 先进后出 ’ 的存储区, 存在于堆栈段, 任何时候 SP都指向 栈
顶 。
注意,
* 堆栈操作必须以字为单位
* 不影响标志位
* 不能用立即寻址方式 PUSH 1234H ?
* DST 不能是 CS POP CS ?
6
例:假设 ( AX ) = 2107 H,执行 PUSH AX
* *
* *
* *
* *
( SP) ?
PUSH AX 执行前
( SP) ?
* *
* *
* *
* *
07H
21H
低地址
高地址
PUSH AX 执行后
进栈方向
7
( SP) ?
* *
* *
* *
* *
07H
21H
POP BX 执行 前
( SP) ? * *
* *
* *
* *
07H
21H
低地址
高地址
POP BX 执行后
( BX ) = 2107H
例,POP BX
出栈方向
8
例,PUSH DS
SUB AX,AX
PUSH AX
……
……
RET
例,PUSH AX
PUSH BX
PUSH CX
…… ;其间用到 AX,BX,CX
POP CX
POP BX
POP AX
9
交换指令,XCHG OPR1,OPR2
执行操作,( OPR1 ) ? ( OPR2 )
注意,
* 不影响标志位
* 不允许使用段寄存器
例,XCHG BX,[ BP + SI ]
XCHG AL,BH
10
? 累加器专用传送指令 ( 只限使用 AX 或 AL )
输入指令 ( I / O ? CPU )
长格式,IN AL,PORT ( 字节 )
IN AX,PORT ( 字 )
执行操作,( AL ) ? ( PORT ) ( 字节 )
( AX ) ? ( PORT + 1,PORT ) ( 字 )
短格式,IN AL,DX (字节)
IN AX,DX (字)
执行操作,( AL ) ? ( ( DX ) ) (字节)
( AX ) ? ( ( DX ) + 1,( DX ) ) (字)
11
输出指令( CPU ? I / O )
长格式,OUT PORT,AL (字节)
OUT PORT,AX (字)
执行操作,( PORT ) ? ( AL ) (字节)
( PORT + 1,PORT ) ? ( AX ) (字)
短格式,OUT DX,AL (字节)
OUT DX,AX (字)
执行操作,( ( DX ) ) ? ( AL ) (字节)
( ( DX ) + 1,( DX ) ) ? ( AX ) (字)
注意, * 不影响标志位
* 前 256个端口号 00H ~ FFH 可直接在指令中指定(长格式)
* 如果 端口号 ? 256,端口号 ? DX(短格式)
12
例,IN AX,28H ; MOV DX,28H; IN AX,DX
MOV DATA_WORD,AX
例,MOV DX,3FCH
IN AX,DX
例,OUT 5,AL
例:测试某状态寄存器(端口号 27H)的第 2 位是否为 1
IN AL,27H
TEST AL,00000100 B
JNZ ERROR ; 若 第 2 位为 1,转 ERROR 处理
13
例,Sound 程序
mov dx,100
in al,61h
and al,11111100 b
sound,xor al,2
out 61h,al
mov cx,140h
wait1,loop wait1
dec dx
jne sound
设备控制寄存器
端口 61H 1 / 0 0
控制其它外部设备

门 放大器
2号定时器门控
1 0
14
( BX ) ? 30 H F0040
31 H F0041
( AL ) = 3 32 H F0042
33 H F0043
TABLE
( DS ) = F000H
换码指令,XLAT 或 XLAT OPR
执行操作,( AL ) ? ( ( BX ) + ( AL ) )
例,MOV BX,OFFSET TABLE ; ( BX ) = 0040H
MOV AL,3
XLAT TABLE
指令执行后 ( AL ) = 33H
注意,
* 不影响标志位
* 字节表格 (长度不超过 256)
首地址 ? ( BX )
* 需转换代码 ? ( AL )
15
? 地址传送指令
有效地址送寄存器指令,LEA REG,SRC
执行操作,( REG ) ? SRC
指针送寄存器和 DS指令,LDS REG,SRC
执行操作,( REG ) ? ( SRC )
( DS ) ? ( SRC + 2 )
4个相继字节 ? 寄存器 ( 通常是 SI), DS
指针送寄存器和 ES指令,LES REG,SRC
执行操作,( REG ) ? ( SRC )
( ES ) ? ( SRC + 2 )
4个相继字节 ? 寄存器(通常是 DI),ES
16
40 H
00 H
00 H
30 H
TABLE ?
( DS ), 1000H
MOV BX,TABLE ; ( BX ) = 0040H
MOV BX,OFFSET TABLE ; ( BX ) = 1000H
LEA BX,TABLE ; ( BX ) = 1000H
LDS BX,TABLE ; ( BX ) = 0040H; ( DS ) = 3000H
LES BX,TABLE ; ( BX ) = 0040H; ( ES ) = 3000H
注意,
* 不影响标志位
* REG 不能是 段寄存器
* SRC 必须为存储器寻址方式
例,LEA BX,[ BX + SI + 0F62H ]
LDS SI,[ 10H ]
LES DI,[ BX ]
17
? 标志寄存器传送指令
标志送 AH 指令,LAHF
执行操作,( AH ) ? ( PSW 的低字节 )
AH 送标志寄存器指令,SAHF
执行操作,( PSW 的低字节 ) ? ( AH )
标志进栈指令,PUSHF
执行操作,( SP ) ? ( SP ) - 2
( ( SP ) + 1,( SP ) ) ? ( PSW )
标志出栈 指令,POPF
执行操作,( PSW ) ? ( ( SP ) + 1,( SP ) )
( SP ) ? ( SP ) + 2
* 影响标志位
18
? 类型转换指令
CBW AL ? AX
执行操作,若 (AL) 的最高有效位为 0,则 ( AH ) = 00H
若 (AL) 的最高有效位为 1,则 ( AH ) = 0FFH
CWD AX ? ( DX,AX )
执行操作:若 (AX) 的最高有效位为 0,则 ( DX ) = 0000H
若 (AX) 的最高有效位为 1,则 ( DX ) = 0FFFFH
例,( AX ) = 0BA45H
CBW ; ( AX ) = 0045H
CWD ; ( DX ) = 0FFFFH ( AX ) = 0BA45H
注意, * 无操作数指令
* 隐含对 AL 或 AX 进行符号扩展
* 不影响 条件标志位
19
算术指令,
? 加法指令
ADD,ADC,INC
? 减法指令
SUB,SBB,DEC,NEG,CMP
? 乘法指令
MUL,IMUL
? 除法指令
DIV,IDIV
? 十进制调整指令
DAA,DAS,AAA,AAS,AAM,AAD
20
? 加法指令
加法指令,ADD DST,SRC
执行操作,( DST ) ? ( SRC ) + ( DST )
带进位加法指令,ADC DST,SRC
执行操作,( DST ) ? ( SRC ) + ( DST ) + CF
加 1指令,INC OPR
执行操作,( OPR ) ? ( OPR ) + 1
注意,
* 除 INC 指令 不影响 CF 标志外,均对条件标志位有影响。
21
加法指令对 条件标志位 ( CF / OF / ZF / SF ) 的影响,
CF 位为 1 表示 无符号数 加法的溢出。
OF 位为 1 表示 带符号数 加法的溢出。
1 结果为负
0 否则 SF =
1 结果为 0
0 否则 ZF =
1 和的最高有效位 有 向高位的进位
0 否则 CF =
1 两个操作数符号相同,而结果符号与之相反
0 否则 OF =
22
n = 8bit 带符号数 ( -128 ~ 127 ) 无符号数 ( 0 ~ 255 )
0 0 0 0 0 1 0 0
+ 0 0 0 0 1 0 1 1
0 0 0 0 1 1 1 1
带,( +4 ) + ( +11 ) = +15 OF = 0
无,4 + 11 = 15 CF = 0
带符号数和无符号数都不溢出
0 0 0 0 1 0 0 1
+ 0 1 1 1 1 1 0 0
1 0 0 0 0 1 0 1
带, ( +9 ) + ( +124 ) = -123 OF = 1
无, 9 + 124 = 133 CF = 0
带符号数溢出 无符号数溢出
0 0 0 0 0 1 1 1
+ 1 1 1 1 1 0 1 1
0 0 0 0 0 0 1 0
带,( +7 ) + ( -5 ) = +2 OF = 0
无,7 + 251 = 2 CF = 1
带符号数和无符号数都溢出
1 0 0 0 0 1 1 1
+ 1 1 1 1 0 1 0 1
0 1 1 1 1 1 0 0
带,( -121 ) + ( -11 ) = +124 OF = 1
无,135 + 245 = 124 CF = 1
23
24
25
例:双精度数的加法
( DX ) = 0002H ( AX ) = 0F365H
( BX ) = 0005H ( CX ) = 0E024H
指令序列,ADD AX,CX ; (1)
ADC DX,BX ; (2)
(1) 执行后, ( AX ) = 0D389H
CF = 1 OF = 0 SF = 1 ZF = 0
(2) 执行后, ( DX ) = 0008H
CF = 0 OF = 0 SF = 0 ZF = 0
26
? 减法指令
减法指令,SUB DST,SRC
执行操作,( DST ) ? ( DST ) - ( SRC )
带借位减法指令,SBB DST,SRC
执行操作,( DST ) ? ( DST ) - ( SRC ) - CF
减 1 指令,DEC OPR
执行操作,( OPR ) ? ( OPR ) - 1
求补指令,NEG OPR
执行操作,( OPR ) ? - ( OPR )
比较指令,CMP OPR1,OPR2
执行操作,( OPR1 ) - ( OPR2 )
注意,
* 除 DEC 指令 不影响 CF 标志外,
均对条件标志位有影响。
27
减法指令对 条件标志位 ( CF / OF / ZF / SF) 的影响,
CF 位为 1 表示 无符号数 减法的溢出。
OF 位为 1 表示 带符号数 减法的溢出。
1 被减数的最高有效位 有 向高位的借位
0 否则 CF =
1 两个操作数符号相反,而结果的符号与减数相同
0 否则 OF =
1 减法转换为加法运算时 无 进位
0 否则 CF =

28
NEG 指令对 CF / OF 的影响,
0 操作数为 0
1 否则 CF =
1 操作数为 -128 (字节运算)或
操作数为 -32768 (字运算)
0 否则
OF =
29
例,x,y,z 均为双精度数, 分别存放在地址为 X,X+2;
Y,Y+2 ; Z,Z+2 的存储单元中, 用指令序列实现
w ? x + y + 24 - z, 并用 W,W+2 单元存放 w
MOV AX,X
MOV DX,X + 2
ADD AX,Y
ADC DX,Y + 2 ; x+y
ADD AX,24
ADC DX,0 ; x+y+24
SUB AX,Z
SBB DX,Z + 2 ; x+y+24-z
MOV W,AX
MOV W+2,DX ; 结果存入 W,W+2 单元
30
? 乘法指令
无符号数乘法指令,MUL SRC
执行操作,
字节操作数 ( AX ) ? ( AL ) * ( SRC )
字操作数 ( DX,AX ) ? ( AX ) * ( SRC )
带符号数乘法指令,IMUL SRC
注意,
* AL ( AX ) 为隐含的乘数寄存器。
* AX ( DX,AX ) 为隐含的乘积寄存器。
* SRC 不能为立即数。
* 除 CF 和 OF 外,对条件标志位 无定义 。
31
乘法指令对 CF / OF 的影响,
例,( AX ) = 16A5H, ( BX ) = 0611H
(1) IMUL BL ; ( AX ) ? ( AL ) * ( BL ); A5 * 11 ? 5B * 11 = 060B ? F9F5; ( AX ) = 0F9F5H CF = OF = 1
(2) MUL BX ; ( DX,AX ) ? ( AX ) * ( BX ); 16A5 * 0611 = 0089 5EF5; ( DX ) = 0089H ( AX ) = 5EF5H CF = OF = 1
0 0 乘积的高一半为零
1 1 否则 MUL 指令, CF / OF =
0 0 乘积的高一半是低一半的符号扩展
1 1 否则 IMUL 指令, CF / OF =
32
? 除法指令
无符号数除法指令,DIV SRC
执行操作,
字节操作 ( AL ) ? ( AX ) / ( SRC ) 的商
( AH ) ? ( AX ) / ( SRC ) 的余数
字操作 ( AX ) ? ( DX,AX ) / ( SRC ) 的商
( DX ) ? ( DX,AX ) / ( SRC ) 的余数
带符号数除法指令,IDIV SRC
注意,
* AX ( DX,AX ) 为隐含的被除数寄存器。
* AL ( AX ) 为隐含的商寄存器。
* AH ( DX ) 为隐含的余数寄存器。
* SRC 不能为立即数。
* 对所有条件标志位均 无定义 。
33
例,x,y,z,v 均为 16 位带符号数, 计算
( v - ( x * y + z – 540 ) ) / x
MOV AX,X
IMUL Y ; x*y
MOV CX,AX
MOV BX,DX
MOV AX,Z
CWD
ADD CX,AX
ADC BX,DX ; x*y+z
SUB CX,540
SBB BX,0 ; x*y+z-540
MOV AX,V
CWD
SUB AX,CX
SBB DX,BX ; v-(x*y+z-540)
IDIV X ; (v-(x*y+z-540))/x
34
? 十进制调整指令
BCD,用二进制编码的十进制数,又称 二 --- 十进制数
BCD 码, 8421 码
压缩的 BCD 码:用 4 位二进制数表示 1 位十进制数
例,( 59 ) 10 = ( 0101 1001 ) BCD
非压缩的 BCD 码:用 8 位二进制数表示 1 位十进制数
例,( 59 ) 10 = ( 0000 0101 0000 1001 ) BCD
数字的 ASCII 码是一种 非压缩的 BCD 码
DIGIT ASCII BCD
0 30H 0011 0000
1 31H 0011 0001
2 32H 0011 0010
… … …
9 39H 0011 1001
35
例:写出 ( 3590 ) 10 的压缩 BCD 码和非压缩 BCD 码,并分别
把它们存入数据区 PAKED 和 UNPAK
压缩 BCD,( 3590 ) 10 = ( 0011 0101 1001 0000 ) BCD
非压缩 BCD,
( 3590 ) 10 = ( 00000011 00000101 00001001 00000000 ) BCD
PAKED 90H
35H
UNPAK 00H
09H
05H
03H
36
问题的提出,
十进制调整指令
1 9 压缩 BCD, 0001 1001
2 7 0010 0001 + 110
+ 0 8 + 0000 1000
( 0010 0111 ) BCD AF=1
DAA,DAS,AAA,AAS,AAM,AAD
37
作业,
p109 3.13 3.14 3.15 3.16
3.17 (1) (2) (3)
3.21