nullnull3.1 8086的寻址方式
3.2 8086的指令系统第3章 8086指令系统 8086 CPU的指令系统的基本指令 8086 CPU的指令系统的基本指令 包括数据传送类指令
算术运算类指令
位操作类指令
串操作类指令
控制转移类指令
处理机控制类指令
后几节将分别介绍这些指令的语句格式和功能。 8086CPU的指令的共同的规律 8086CPU的指令的共同的规律 指令语句的一般格式如下:
[标号:] 指令助记符 操作数 [;注释]
1.标号:标号是机器指令语句存放地址的符号
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示,代表该
指令目标代码的第一个字节地址,后面必须紧跟冒
号“:” 。如: tt: mov ax,bx
2.指令助记符:指令助记符为语句的核心成分,表示了该
语句的操作类型。
3.操作数:操作数表示指令助记符的操作对象。
4.注释:注释均以分号开始,它可占一行或多行,一般放
在一条语句的后面。 null伪指令语句格式如下:
[符号名] 伪指令符 操作数 ;[注释]
1.符号名:符号名是伪指令语句的一个可选项,也是一个地址。
2.伪指令(伪操作)符:伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。
3.操作数:伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。
4.注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。
3.1 8086的寻址方式3.1 8086的寻址方式3.1.1 数据的寻址方式
3.1.2 程序转移地址的寻址方式
3.1.3 对端口的寻址方式 3.1.1 数据的寻址方式3.1.1 数据的寻址方式1. 立即寻址
2. 寄存器寻址
3. 直接寻址
4. 寄存器间接寻址
5. 寄存器相对寻址
6. 基址变址寻址
7. 相对基址变址寻址
8. 跨段问题
1.立即寻址1.立即寻址
立即寻址方式中,指令操作码和操作数都在存储器代码段中。
汇编格式:n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)
功能:操作数存放在指令代码中,指令下一单元的内容为立即操作数n。
图形表示:
【例3.1.1】MOV AX, 10
执行后(AX)=?
该例中源操作数为立即寻址方式,立即数为10,存放在指令的下一单元。
图形表示:
执行:10→AX
执行后:(AX)=000AH
2 寄存器寻址2 寄存器寻址寄存器寻址方式的操作数在指令指明的寄存器中。
汇编格式:R 其中R表示寄存器名。
功能:操作数直接存放在寄存器R中。
图形表示:
R
指令→操作数【例3.1.2】 【例3.1.2】 下列程序执行后,(AX)=?,(BX)=?
MOV AX,1234H
MOV BX,5678H
ADD AX,BX
该程序中MOV指令为数据传送指令操作符,ADD指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令AX、BX皆为目的操作数地址,为寄存器寻址方式。第三条指令中,AX为目的操作数地址,BX为源操作数地址。源地址和目的地址皆为寄存器寻址方式。null图形表示:
执行:1234H→AX
5678H→BX
(AX)+(BX)→AX
执行后:(AX)=68ACH,(BX)=5678H3 直接寻址3 直接寻址汇编格式:
①含有变量的地址表达式。
②段寄存器名:[EA] 。
功能:指令下一字单元的内容是操作数的偏移地址EA。
图形表示:
【例3.1.3】 【例3.1.3】 寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。
执行指令:MOV AX ,BUF
执行后:(AX)=?
图形表示:
执行:(32000H)→AX
执行后:(AX)=4545H4 寄存器间接寻址4 寄存器间接寻址寄存器的内容为操作数的偏移地址EA,操作数在存储器中。
汇编格式:[R]
功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。
null偏移地址EA计算方法如下:EA=[SI] SI作间址寄存器。
[DI] DI作间址寄存器。
[BX] BX作间址寄存器。
[BP] BP作间址寄存器。null执行指令:MOV AX ,[BP]
执行后:(AX)=?,(BP)=?,(SS)=?,(20030H)=?
(AX)=1234H,(BP)=0030H,
(SS)=2000H,(20030H)=1234H
图形表示如下: 【例3.1.4】寄存器和存储器内容分别为:
(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H5 寄存器相对寻址5 寄存器相对寻址操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。
汇编格式:X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)
功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。
图形表示如下:null偏移地址EA计算方法如下:【例3.1.5】 【例3.1.5】 设执行前:(AX)=0040H,
(BX)=0030H,
(DS)=2000H,
(20036H)=0050H
执行指令:ADD 6[BX],AX
执行后:(AX)=?,(BX)=?
(DS)=?,(20036H)=?
图形表示如下: null 执行:(20036H)+(AX) →20036H
执行后: (AX)=0040H,
(BX)=0030H,
(DS)=2000H,
(20036H)=0090H。6.基址变址寻址6.基址变址寻址操作数的偏移地址EA为指令中基址寄存器(BR)内容、变址寄存器(IR)内容之和,操作数在内存中。在80X86微处理器中,一般约定基址寄存器用BR表示,变址寄存器用IR表示
汇编格式:[BR][IR]
功能:操作数在存储器中,BR的内容加IR的内容形成操作数的偏移地址EA。
有效地址EA = +
MOV AX, [BX][DI] PA=(DS)×24+(BX)+(DI)
或 MOV AX, [BP+DI] PA=(SS)×24+(BX)+(DI)
MOV AX, ES:[BX][SI] PA=(ES)×24+(BX)+(SI)
基址变址寻址方式适于数组、字符串、表格的处理,它必须是一个基址寄存器和一个变址寄存器的组合,下面两种形式是错误的:
MOV AX, [BX][BP]
MOV AX, [SI][DI]
(SI)
(DI)(BX)
(BP)7 相对基址变址寻址7 相对基址变址寻址操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项之和,操作数在存储器中。
汇编格式:X [BR+IR]
功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。
图形表示:null操作数偏移地址EA计算方法如下8 跨段问题8 跨段问题按前述
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
:若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。
该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。
汇编格式:段寄存器名:操作数地址。
功能:段寄存器名指明操作数属哪个段。 【例3.1.6】跨段前缀示例。 【例3.1.6】跨段前缀示例。 MOV AX,DS:[BP]
MOV CX,SS:[SI]
该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:
PA1 =(DS)左移4位+[BP]
PA2 =(SS)左移4位+[SI3.1.2 程序转移地址的寻址方式3.1.2 程序转移地址的寻址方式 用来确定 转移指令 及 CALL指令 的转向地址。段内寻址
段间寻址段内直接寻址
段内间接寻址段间直接寻址
段间间接寻址段内:转移指令与转向的目标指令在同一代码段中,(CS)不变。
段间:转移指令与转向的目标指令在两个代码段中,(CS)变化。null表示转移距离(称为位移量)的操作符:
SHORT 短转移,位移量在-128~127字节之间。 (带符号1字节)
JMP SHORT NEXT
NEAR 近转移,在同一段内转移,位移量在-32768~32767字
节范围内。(带符号2字节,即:±32K)
JMP NEAR PTR AGAIN
FAR 远转移,表示转移距离超过±32K字节,或是在不同段
之间转移。
JMP FAR PTR WAIT1. 段内直接寻址1. 段内直接寻址
转向的有效地址EA =
转向地址 = 16d (CS) + (IP)新 (IP)当前
+
位移量( 8bit / 16bit )(IP)新例: 段内直接寻址方式的示例
1060:000D EB04 JMP SHORT NEXT
IP当前值→ 1060:000F … …
1060:0011 … …
1060:0013 0207 NEXT: ADD AL,[BX] null1. 段内直接寻址
采用这种寻址方式时,应在指令中指明一个8位或16位的相对地址偏移量disp。由于转向的有效地址EA = 当前IP值 + disp,则转移的物理地址为代码段寄存器CS的内容加上转移的有效地址。 应注意,上述指令在汇编后,指令的机器码中不会直接出现L1或PROGRAM的转向地址,而是出现相对于当前IP的位移量disp 。因而段内直接寻址也称段内相对寻址。
null2. 段内间接寻址
在这种寻址方式中,转向的有效地址(即目标地址的段内偏移量)是一个16位的寄存器的内容或存储器中两个连续单元的内容。存放偏移地址的寄存器或存储器的地址将按指令码中规定的寻址操作数的方法给出。此时寻址所得到的不是操作数,而是转移地址。由于此寻址方式仅能修改IP的内容,所以这种寻址方式只能在段内进行程序转移。 JMP BX ;寄存器间接寻址,目标地址在当前代码段(CS)内,;目标地址的偏
移量存放在寄存器中
JMP WORD PTR [BX] ;存储器寻址,目标地址在当前代码段内,偏移地址在
数据段内.
以上两条指令的执行情况分别如图4-10和图4-11所示。 2. 段内间接寻址2. 段内间接寻址 转向的有效地址EA是一个寄存器或存储单元的内容。
(可用除立即数以外的任何一种数据寻址方式得到)
物理地址 = 16 d (CS) + EA
例: (BX)=1256H (SI)=528EH TABLE=20A2H
(DS)=2000H (232F8H)=3280H (264E4H)=2450H
JMP BX ; (IP)←1256H
JMP TABLE[BX]
JMP WORD PTR TABLE[BX] ; (IP)←3280H
;232F8H= (DS)X16+(BX)+TABLE=20000H+1256H+ 20A2H
JMP [BX][SI]
JMP WORD PTR [BX][SI] ; (IP)←2450H
;264E4H= (DS)X16+(BX)+ (SI) =20000H+1256H+528EH 3. 段间直接寻址3. 段间直接寻址
用指令中提供的转向段地址和偏移地址取代CS和IP
物理地址 = 16d (CS) + (IP)
例:
code1 segment
……
EA 0250 2000 jmp far ptr next
……
code1 ends code2 segment
……
next: …...
……
code2 endsnull3. 段间直接寻址
与段内直接寻址方式不同,段间直接寻址须在指令码中直接给出目标地址的16位段基址和16位段内偏移地址。
JMP FAR PTR P1 ;段间直接寻址方式中, 要转移至的标号或过程名必须具备FAR属性.
该指令的执行情况如图4-12所示。在执行 这条段间直接寻址指令时,指令操作码后的第 二个字将赋于代码段寄存器CS,第一个字赋于 指令指针寄存器IP。4. 段间间接寻址
用存储器中的两个连续字的内容取代CS和IP。
(存储单元的地址可用除立即数和寄存器以外的任何一种
数据寻址方式得到)
物理地址 = 16 (DS) + EA
例: JMP DWORD PTR [INTERS+BX]
存储器IP
CS4. 段间间接寻址null4. 段间间接寻址
该寻址方式和段内间接寻址相似,只是转移地址的确定需要32位信息,即目标
地址存放在4个连续存储单元中,其中前两个单元存放16位的段内偏移地址,后
两个单元存放16位的段地址。
JMP DWORD PTR [BX + 020AH]
指令说明:上述指令中,[BP + 020AH]说明数据采用寄存器相对寻址方式,而 DWORD PTR可以是除立即寻址和寄存器寻址方式外的任何一种数据寻址方式。
上述指令的编码格式和执行情况如图4-13所示:
020AH21400H4000H320EH3.1.3 对端口的寻址方式 3.1.3 对端口的寻址方式 计算机中主要有两种I/O寻址方式:
独立编址和统一编址
独立编址的特点是:存储器和I/O端口在两个独立的地址空间中,访问I/O端口用专用的命令。
统一编址的特点是:存储器和I/O端口共用统一的地址空间,I/O端口作为存储器的某些存储单元,所有访问存储器的指令都可用于I/O端口。8086/8088一般对I/O端口采用独立编址管理,CPU用16位地址去访问端口空间,端口空间的大小为64KB。对端口的寻址方式有两种:直接寻址和间接寻址。
1.直接寻址
是由指令直接给出所要找的端口地址,端口的直接寻址方式所提供的直接地址是8位的,即寻址范围仅为0~255。端口的直接地址不能用任何括号括起,不能理解为立即数。
2.间接寻址
必须把16位的端口地址放在寄存器DX中,用DX进行端口的间接寻址,端口的间接寻址只能使用DX寄存器进行,并且对端口的间接寻址所用的寄存器DX是不加任何括号的,不能理解为寄存器寻址。 3.2 8086的指令系统 3.2 8086的指令系统 3.2.1 数据传送类指令
3.2.2 算术运算类指令
3.2.3 位操作类指令
3.2.4 串操作类指令
3.2.5 控制转移类指令
3.2.6 处理机控制类指令 null8086的指令系统格式分三种:
(1)双操作数形式:OPR OPD,OPS
(2)单操作数形式:OPR OPD
(3)无操作数形式:OPR
其中:
OPR---表示为指令操作码
OPD---表示为目的操作数
OPS ---表示为源操作数
3.2.1 数据传送类指令3.2.1 数据传送类指令3.2.1.1 通用数据传送指令
3.2.1.2 堆栈操作指令
3.2.1.3 标志寄存器传送指令
3.2.1.4 地址传送指令
3.2.1.5 输入输出指令
3.2.1.1 通用数据传送指令3.2.1.1 通用数据传送指令1.传送指令MOV
2.数据交换指令XCHG
3.查表转换指令 XLAT
null1.传送指令MOV
语句格式:MOV OPD,OPS
功能:将源操作数传送入目的地址,源地址
内容不变。
即:(OPS)→OPD。
图3-1描述了MOV指令在传送数据时允许传送的路径及类型。
null图3-1 MOV指令所允许的数据传送路径及类型【例3-11】存储器与寄存器间数据传送。【例3-11】存储器与寄存器间数据传送。MOV AX,BUF ;BUF是变量,源操作数为直接寻址
MOV BH,[DI] ;源操作数为寄存器间接寻址
MOV DI,ES:3[SI] ;源操作数为变址寻址,使用跨段前缀
MOV BP,3[BX+SI] ;源操作数为基址加变址寻址
MOV BUFA,DL ;BUFA是一字节变量
MOV [BP],AX ;使用SS段寄存器
MOV DS:[BP],DL ;使用跨段前缀
MOV BUF,DS ;BUF是个字变量
MOV ES ,BUF2.数据交换指令XCHG2.数据交换指令XCHG 语句格式:XCHG OPD,OPS
功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。
【例3-12】寄存器与存储器之间数据交换。
MOV AX,5678H ;(AX)=5678H
MOV BX,0FFFFH ;(BX)=0FFFFH
XCHG AX,BX ;(AX)=0FFFFH,(BX)=5678H3.查表转换指令 XLA3.查表转换指令 XLA 语句格式:XLAT OPS或XLAT
功能:将(BX)为首址(AL)为位移量的字
节存储单元中的数据送AL寄存器。
即([BX+AL])→AL。
例3-13:数据段基址=4000H,从偏移地址0200H存放数字0-9七段LED显示代码.取数字6的七段LED显示代码存入DL.
MOV AX,4000H;
MOV DS,AX;
MOV BX,0200H;
MOV AL,6;
XLAT;
MOV DL,AL;
…….3.2.1.2 堆栈操作指令3.2.1.2 堆栈操作指令堆栈是在内存开辟的一块特殊存储区。
(原则:先进后出,后进先出)
1.进栈指令PUSH
2.出栈指令POP1.进栈指令 PUSH1.进栈指令 PUSH语句格式: PUSH OPS
功能:将寄存器、段寄存器或存储器中的
一个字数据压入堆栈,堆栈指针减2。
即:①(SP)-1→SP(OPS)15~8→[SP]
②(SP)-1→SP (OPS)7~0→[SP]
2.出栈指令POP2.出栈指令POP
语句格式: POP OPD
功能: 将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)
或存储器,堆栈指针加2。
从POP指令功能可看出,该指令为PUSH指令的逆过程。
即: ①([SP])→(OPD)7~0 (SP)+1→SP
②([SP])→(OPD)15~8 (SP)+1→SP3.2.1.3 标志寄存器传送指令3.2.1.3 标志寄存器传送指令1.标志送AH指令 LAHF
2.AH送标志指令 SAHF
3.标志寄存器进栈指令 PUSHF
4.标志寄存器出栈指令 POPF1.标志送AH指令LAHF1.标志送AH指令LAHF 语句格式:LAHF
功能:将标志寄存器的低8位送入AH寄存器。
即(FLAGS)7-0 →AH。
该指令的执行对标志位无影响。
【例3-14】标志寄存器传送。
执行前:(FLAGS) =0485H,
(AX)=0FFFFH
执行指令:LAHF
执行后: (FLAGS)=0485H,
(AX)=85FFH2.AH送标志指令SAHF2.AH送标志指令SAHF语句格式:SAHF
功能:将AH的内容送入标志寄存器的低8位,
高8位不变。即(AH) →(FLAGS)7-0
从该指令功能可看出,
SAHF为LAHF的逆过程。 3.标志寄存器进栈指令PUSHF3.标志寄存器进栈指令PUSHF 语句格式:PUSHF
功能:将标志寄存器的内容压入堆栈。
即(FLAGS)→↓(SP)。
4.标志寄存器出栈指令POPF4.标志寄存器出栈指令POPF功能: 将栈顶内容弹出送入标志寄存器中。
即↑(SP)→FLAGS。
POPF指令与PUSHF指令互为逆过程
【例3-15】将标志寄存器的单步标志TF置位。
PUSHF ;(FLSGS)→↓(SP)
POP AX ;(SP)→AX
OR AX, 0100H ;设置D8=TF=1
PUSH AX ;(AX)→↓(SP)
POPF ;(SP)→↓FLAGS,
即(AX)→↓FLAGS3.2.1.4 地址传送指令3.2.1.4 地址传送指令1.传送偏移地址指令 LEA
2.传送偏移地址及数据段首址指令LDS
3.传送偏移地址及附加数据段指令LES
1.传送偏移地址指令 LEA1.传送偏移地址指令 LEA 语句格式: LEA OPD,OPS
功能:按源地址的寻址方式计算偏移
地址,将偏移地址送入指定寄存器。
其中:源操作数是内存(mem)
目的操作数是16位的寄存器(reg)
【例3-16】主存偏移地址的获取。
MOV BX,0100H ;(BX)=0100H
MOV SI, 0210H ;(SI) =0210H
LEA BX,1234[BX+SI] ;(BX)=1544H 0100H
0210H
+1234H
1544H2.传送偏移地址及数据段首址指令LDS2.传送偏移地址及数据段首址指令LDS 语句格式:LDS OPD,OPS
(OPS)→OPD,(OPS+2)→DS。
其中:源操作数是内存(mem)
目的操作数是16位的寄存器(reg)
功能:将主存中指定字单元数据(32位地
址指针) 送入指定存储器,下一字
单元数据送 DS寄存器。
本指令常用在将32位的地址指针装入SI和DS。2.传送偏移地址及数据段首址指令LDS2.传送偏移地址及数据段首址指令LDS 举例(P.48):例3-17 已知(DS)=0B000H, (BX)=080AH
(B080AH)字=05A2H,
(B080CH)字=4000H,
LDS SI,[BX]的执行结果.
执行结果:源操作数的内存逻辑地址为(DS):(BX)
其物理地址为B080AH,从此地址取一个字05A2H送SI,
再取后续字B080CH、取一个字4000H送DS
执行结果是:(SI)=05A2H
(DS)=4000H3.传送偏移地址及附加数据段指令LES3.传送偏移地址及附加数据段指令LES 语句格式:LES OPD,OPS
功能:将主存某字单元内容送指定寄
存器。即:
(OPS)→OPD,(OPS+2)→ES。
说明:此语句与LDS功能基本一致,DS换成ES即可。3.2.1.5 输入输出指令3.2.1.5 输入输出指令1.输入指令IN
2.输出指令OUT
1.输入指令IN1.输入指令IN 输入指令用来从指定的外设寄存器取信息送入累加器。
它有四种形式:
(1)语句格式:IN AL,PORT
功能:(PORT)→AL
(2)语句格式:IN AX,PORT
功能:(PORT)→AX
(3)语句格式:IN AL,DX
功能:([DX])→AL
(4)语句格式:IN AX,DX
功能:([DX])→AL2.输出指令OUT2.输出指令OUT输出指令用来把累加器的内容送往指定的外设寄存器,它有四种形式:
(1)语句格式:OUT PORT,AL
功能:(AL)→PORT
(2)语句格式:OUT PORT,AX
功能:(AX)→PORT
(3)语句格式:OUT DX,AL
功能:(AL)→[DX]
(4)语句格式:OUT DX,AX
功能:(AX)→[DX]
3.2.2 算术运算类指令3.2.2 算术运算类指令3.2.2.1 加法指令
3.2.2.2 减运算指令
3.2.2.3 乘运算指令
3.2.2.4 除运算指令
3.2.2.5 符号扩展指令
3.2.2.6 十进制调整指令3.2.2.1 加法指令3.2.2.1 加法指令1.加1指令 INC
2.加指令ADD
3.带进位加指令ADC
null1.加1指令 INC
语句格式:INC OPD
功能:将目的操作数加1,结果送目的地址。
即(OPD)+1→OPD。
INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。
如:INC BX,即(BX)+1→BX。
加1指令可用于对计数器和地址指针进行调整。
影响标志位:AF、OF、PF、SF、ZF
不影响标志位:CFnull 2.不带进位的加指令ADD
语句格式:ADD OPD, OPS
功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。
即(OPD)+(OPS)→OPD。
影响标志位:AF、OF、PF、SF、ZF、CF
注意: (1) OPD和 OPS有无符号8或16位合均可
(2) OPD可以是mem、reg
(3) OPS可以是mem、reg 或data
(4) OPD和 OPS不能同时为mem null3.带进位加指令ADC
语句格式:ADC OPD,OPS
功能:将目的操作数加源操作数再加低位进位,结果送目的地址。
即(OPD)+(OPS)+CF → OPD。
【例3-21】无符号双字加法运算。
MOV AX,4652H ;(AX)=4652H
ADD AX,0F0F0H;(AX)=3742H,CF=1
MOV DX,0234H ;(DX)=0234H
ADC DX,0F0F0H;(DX)=0F325H,CF=0
3.2.2.2 减运算指令3.2.2.2 减运算指令1.减1指令DEC
2.减指令SUB
3.求补指令NEG
4.带借位减指令 SBB
5.比较指令 CMP
null1.减1指令DEC
语句格式:DEC OPD
功能:将目的操作数减1,结果送目的地址。
即(OPD)-1→OPD。
影响标志位:AF、OF、PF、SF、ZF
不影响标志位:CF
DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。
如:DEC CX。即(CX)-1→CX。
减1指令DEC也一般用于对计数器和地址指针的调整。
null2.减指令SUB
语句格式:SUB OPD,OPS
功能:目的操作数减源操作数,结果存于目的地址,
源地址内容不变。
即(OPD)-(OPS)→OPD
影响标志位:AF、OF、PF、SF、ZF、CF
【例2-22】减法运算。
MOV AX ,5678H ;(AX)=5678H
SUB AX ,1234H ;(AX)=4444H
AF=0、OF=0、PF=0、SF=0、ZF=0、CF=0
MOV BX ,3354H ;(BX)=3354H
SUB BX ,3340H ;(BX)=0014H
AF=0、OF=0、PF=0、SF=0、ZF=0、CF=0null3.带借位减指令 SBB
语句格式:SBB OPD ,OPS
功能:目的操作数减源操作数再减低位借位CF,结果送目的地址。
即(OPD)―(OPS)―CF → OPD
影响标志位:AF、OF、PF、SF、ZF、CFnull4.求补指令NEG
语句格式:NEG OPD
功能:将目的操作数的每一位求反(包括符号位)后
加1,结果送目的地址。
即(OPD)+1→OPD。
影响标志位:AF、OF、PF、SF、ZF、CF
【例3-23】求补运算。(参见P.51)
MOV AX,0FF64H
NEG AL ;(AX)=0FF9CH,AF=1,OF=0,PF=1,SF=1,ZF=0,CF=1
SUB AL,9DH;(AX)=0FFFFH, AF=1,OF=0,PF=1,SF=1,ZF=0,CF=1
NEG AX ;(AX)=0001H, AF=1,OF=0,PF=0,SF=0,ZF=0,CF=1
DEC AL ;(AX)=0000H, AF=0,OF=0,PF=1,SF=0,ZF=1,CF=1
NEG AX ;(AX)=0000H, AF=0,OF=0,PF=1,SF=0,ZF=1,CF=05.比较指令 CMP5.比较指令 CMP语句格式:CMP OPD,OPS
功能:目的操作数减源操作数,结果只影响标志位,
不送入目的地址。
即(OPD)-(OPS)。
影响标志位:AF、OF、PF、SF、ZF、CF
【例3-24】比较AL的内容数值大小。
CMP AL,50;(AL)- 50
JB BELOW;(AL)<50,转到BELOW处执行(CF=1)
SUB AL,50;(AL)>=50,( AL)- 50→AL
INC AH;(AH)+1→AH
BELOW: …
3.2.2.3 乘运算指令3.2.2.3 乘运算指令1.无符号数乘法指令MUL
2.有符号乘指令IMUL
1.无符号数乘法指令MUL1.无符号数乘法指令MUL语句格式: MUL OPS
功能: 若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。
即, 字节乘法:(AL)* (OPS) →AX,
字乘法:(AX) * (OPS) →DX,AX
【例3-25】无符号数0A3H与11H相乘。
MOV AL,0A3H ;(AL)=0A3H
MOV BL, 11H ;(BL)=11H
MUL BL ;(AX)=0AD3H2.有符号乘指令IMUL2.有符号乘指令IMUL 语句格式:IMUL OPS
功能:
字节乘法:(AL)*(OPS)→AX,
字乘法:(AX)*(OPS)→DX、AX。
IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。
【例3-26】有符号数0B4H与11H相乘。
MOV AL,0B4H ;(AL)=B4H
MOV BL,11H ;(BL)=11H
IMUL BL ;(AX)=0FAF4H3.2.2.4 除运算指令3.2.2.4 除运算指令1.无符号除指令DIV
2.有符号除指令IDIV
null1.无符号除指令DIV
语句格式:DIV OPS
功能:
字节除法:(AX)/(OPS)→ AL(商)、AH(余数)
字除法:(DX、AX)/(OPS)→ AX(商)、DX(余数)
【例3-27】写出实现无符号数0400H / 0B4H运算的程序段。
MOV AX,0400H ;(AX)=0400H
MOV BL,0B4H ;(BL)=0B4H
DIV BL ;商(AL)=05H,余数(AH)=7CH null2.有符号除指令IDIV
语句格式:IDIV OPS
功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)
字除法:(DX,AX)/(OPS) → AX (商)、DX(余数)
除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出。
【例3-28】写出实现有符号数0400H /0B4H运算的程序段。
MOV AX,0400H ;(AX)=0400H
MOV BX,0B4H ;(BX)=0B4H
IDIV BX ;(AL)=0F3H,(AH)=24H
3.2.2.5 符号扩展指令 3.2.2.5 符号扩展指令 1.字节转换成字指令CBW
2.将字转换成双字指令CWD
null1.字节转换成字指令CBW
语句格式:CBW
功能:将AL中的符号位数据扩展至AH。AL的最高位为1则FFH存入AH,否则00H存入AH。
【例3-29】将字节数据扩展成字数据。
MOV AL,0A5H ;(AL)=0A5H
CBW ;(AX)=0FFA5H
ADD AL,70H ;(AL)=25H
CBW ;(AX)=0025Hnull2.将字转换成双字指令CWD
语句格式:CWD
功能:将AX中的符号位数据扩展至DX 。
【例3-30】将字数据扩展成双字数据。
MOV DX, 0 ;(DX)=0
MOV AX, 0FFABH;(AX)=0FFABH
CWD ;(DX)=0FFFFH
(AX)=0FFABH3.2.2.6 十进制调整指令3.2.2.6 十进制调整指令1.压缩BCD码调整指令
2.非压缩BCD码调整指令
1.压缩BCD码调整指令1.压缩BCD码调整指令(1)加法的十进制调整指令DAA
(2)减法的十进制调整指令DAS(1)加法的十进制调整指令DAA (1)加法的十进制调整指令DAA 语句格式:DAA
功能:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则
(AL)=(AL)+6且(AF)=1;如果(AL)>=0A0H或
(CF)=1,则(AL)=(AL)+60H且(CF)=1。同时,
SF、ZF、PF均有影响。
【例3-31】压缩BCD码的加法运算。
MOV AL,68H ;(AL)=68H,表示压缩BCD码68
MOV BL,28H ;(BL)=28H,表示压缩BCD码28
ADD AL,BL ;二进制加法:(AL)=68H+28H=90H
DAA ;十进制调整:(AL)=96H
;实现压缩BCD码加法:68+28=96(2)减法的十进制调整指令DAS(2)减法的十进制调整指令DAS 语句格式:DAS
功能:如果(AF)=1或AL寄存器中低4位大于9,则
(AL)=(AL)-6且(AF)=1;如果(AL)>=0A0H或
(CF)=1,则(AL)=(AL)-60H且(CF)=1。
同时SF、ZF、PF均受影响。
【例3-32】压缩BCD码的减法运算。
MOV AL,68H ;(AL)=68H,表示压缩BCD码68
MOV BL,28H ;(BL)=28H,表示压缩BCD码28
SUB AL,BL ;二进制减法:(AL)=68H-28H=40H
DAS ;十进制调整:(AL)=40H
;实现压缩BCD码减法:68-28=40null【例3-33】P.54 (略)
已知 (BCD1)=1834, (BCD2)=2789
要求(BCD3)<—(BCD1)+(BCD2)
MOV AL,BCD1 ;AL34H
ADD AL,BCD2 ;(AL)=BDH=34H+89H
DAA ; (23H)BCD=34H+89H
MOV BCD3,AL ;(BCD3)=23H
MOV AL,BCD1+1;(AL)=18H
MOV AL,BCD2+1 ;(AL)=18H+27H+CF=40H
DAA ; (AL)=46H
MOV BCD3+1,AL ; ;(BCD3+1)=46H,结果为:4623null【例3-34】P.55(略)
已知 (BCD1)=1234, (BCD2)=4612
要求(BCD3)<—(BCD1)-(BCD2)
MOV AL , BCD1
SUB AL , BCD2
DAS
MOV BCD3 , AL
MOV AL , BCD1+1
SBB AL , BCD2+1
DAS
MOV BCD3 , AL2.非压缩BCD码调整指令2.非压缩BCD码调整指令(1)加法的非压缩BCD码调整指令AAA
(2)减法的非压缩BCD码调整指令AAS
(3)乘法的非压缩BCD码调整指令AAM
(4)除法的非压缩BCD码调整指令AADnull(1)加法的非压缩BCD码调整指令AAA
语句格式:AAA
功能:如果AL的低4位大于9或(AF)=1,则:
(AL)=(AL)+6
(AH)=(AH)+1
(AF)=(CF)=1
且AL高4位清零。
否则:(CF)=(AF)=0
AL高4位清零。null【例3-35】加法的非压缩BCD码调整指令
(P.55)
MOV AX ,0035H
MOV BL , 39H
ADD AL ,BL
AAA null(2)减法的非压缩BCD码调整指令AAS
语句格式:AAS
功能:如果AL的低4位大于9或(AF)=1,则:
(AL)=(AL)-6
(AH)=(AH)-1
(AF)=(CF)=1
AL高4位清零。
否则:(CF)=(AF)=0
AL高4位清零。
其他标志位OF、PF、SF、ZF不确定。null(3)乘法的非压缩BCD码调整指令AAM
语句格式:AAM
功能:被调整的乘积在AX中,对AL按10取模,则:
(AL)/0AH→AH(商):AL(余数)
其中AH为商,AL为余数,
标志位AF、CF、OF、PF、SF、ZF受影响。 null【例3-37】求7*9的非压缩BCD码结果
(P.56)
MOV AL ,07H
MOV BL , 09H
MUL BL
AAM null(4)除法的非压缩BCD码调整指令AAD
语句格式:AAD
功能:除法运算前,先调整被除数AX内容,使:
(AL)=(AL)+(AH)*0AH
(AH)=0
即把非压缩型十进制数变成二进制数。null【例3-38】计算23/2,商->AX,余数->DL中
(P.56-57)
MOV AX ,0203H
MOV BL , 02H
AAD
DIV BL
MOV DL ,AH
MOV AH ,0
AAM NEXT=> 3.2.3 位操作类指令NEXT=> 3.2.3 位操作类指令3.2.3.1 逻辑运算指令
3.2.3.2 移位指令 3.2.3.1 逻辑运算指令3.2.3.1 逻辑运算指令1.求反指令NOT
2.逻辑乘指令AND
3.测试指令TEST
4.逻辑加指令OR
5.按位加指令XOR
null1.求反指令NOT
语句格式:NOT OPD
功能:将目的地址中的内容逐位取反后送入
目的地址。即(OPD)→OPD
【例3-39】逻辑非运算。
MOV AX,878AH;(AX)=878AH
NOT AX ;(AX)=7875H
1000-0111-1000-1010
0111-1000-0111-0101
null2.逻辑乘指令AND
语句格式:AND OPD, OPS
功能:将目的操作数和源操作数进行逻辑乘运算,结果存
目的地址。
即(OPD)∧(OPS)→OPD。
该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:1∧1=1,1∧0=0,0∧1=0,0∧0=0
【例3-40】将AL中第3位和第7位清零。
MOV AL,0FFH
AND AL,77H 1111-1111 (FFH)
0111-0111 (77H)
0111 0111D3、7null3.测试指令TEST
语句格式:TEST OPD,OPS
功能:源地址和目的地址的内容执行按位的逻辑乘运
算,结果不送入目的地址。
即(OPD)∧(OPS)。
【例3-41】测试AX中的第12位是否为0,不为0则转L。
TEST AX,1000H
JNE L null4.逻辑加指令OR
语句格式:OR OPD,OPS
功能:将目的操作数和源操作数进行逻辑加运
算,结果存目的地址。
即(OPD)∨(OPS)→OPD。
说明:逻辑加的运算法则为:1∨1=1,1∨0=1,0∨1=1,0∨0=0。
【例3-42】将AL寄存器中第3位和第7位置1。
MOV AL,0
OR AL,88H null5.按位加指令XOR
语句格式: XOR OPD,OPS
功能:目的操作数与源操作数做按位加运算,
结果送入目的地址。
即(OPD)⊕(OPS) →OPD。
说明:按位加的运算法则为;1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。
【例3-43】按位加运算。
MOV AL,45H ;(AL)=45H
XOR AL,31H ;(AL)=74H0100-0101
0011-0001
0111-0100(74H)3.2.3.2 移位指令 3.2.3.2 移位指令 移位指令包括算术移位指令、逻辑移位指令和循环移位指令,