null第三章 8086的寻址方式和指令系统第三章 8086的寻址方式和指令系统3.1 8086的寻址方式
3.2 指令的机器码
示
(自学)
3.3 8086的指令系统 第三章 8086的寻址方式和指令系统第三章 8086的寻址方式和指令系统3.1 8086的寻址方式
3.2 指令的机器码表示方法
3.3 8086的指令系统 指令 —— 控制计算机完成指定操作的命令
机器指令 —— 指令的二进制代码形式。例如:
1100110100100001
汇编指令 —— 助记符形式的指令。例如:INT 21H
指令系统 —— CPU所有指令及其使用规则的集合8086 指令语句格式:8086 指令语句格式:[标号:] 指令助记符 [操作数] ;注释标号:是给该指令所在地址取的名字,后面必须 跟冒号。是可选项。
指令助记符:是指令名称的代表符号,不可缺省,它表示本指令的操作类型.可在指令助记符前加上一个或多个前缀来实现某些附加操作。
操作数:是参加本指令运算的数据。是可选项,有些指令需要两个操作数,则必须用“,”号将两个操作数分开。有些操作数可以用表达式。
注释:可选项,前面必须加分号与主句分开8086 的指令系统8086 的指令系统指令的基本构成:操作码[操作数1],[操作数2]3.1 8086 的寻址方式3.1 8086 的寻址方式寻址方式:指出操作数的来源的方式。 立即寻址
寄存器寻址
直接寻址
寄存器间接寻址
变址寻址
基址寻址
基址加变址寻址
隐含寻址
IO端口寻址 MOV AX,1000H
MOV AX,BX
MOV AX,[1000H]
MOV AX,[DX]
MOV AX,[SI]
MOV AX,[BX]
MOV AX,[BX][SI]
DIV BL
IN AL,DX3.1 8086 的寻址方式3.1 8086 的寻址方式寻址方式:指出操作数的来源。 以源操作数为例一、 立即寻址方式:(如下图所示)
操作数直接出现在指令中,作为指令的一部分放在代码段中。
例:MOV AL,64H ;AL←64H
MOV AX,2058H ;AX←2058H
立即数只能为整数,且只能做源操作数MOV AL,64H8086 的寻址方式8086 的寻址方式二、 寄存器寻址三、 直接寻址 (教材 P58)
操作数的偏移地址(常称有效地址EA)直接包含在指令中,放在操作码之后,见下页图 操作数就在CPU的内部寄存器中,寄存器名由指令指出。
例:DEC BL ;将BL的内容减1
MOV DX,AX ;将AX中的值送入DX中例1:MOV AX,[3100H] ;假设DS=2000H
其示意图如下页图所示MOV DX,AXMOV AX,[3100H]8086 的
寻址方式8086 的
寻址方式 三、 直接寻址(续)OP88H99H存储器数据段AXALAH代码段003123100H23101H对上例,没有用前缀指明操作数在哪一段,则默认在数据段中,则操作数的物理地址为:20000+3100=23100H
于是访问该存储器单元,取出其内容送AX 例1:MOV AX,[3100H]
;假设DS=2000HMOV AX,[3100H]null三、 直接寻址(续)例2:MOV BX,ES:[1000H] ;则是将ES段的 1000H及1001H两单元内容取出送BX。在汇编语言中,可用符号地址(存储单元的名字)代替数值地址。而 MOV AX,[BUFFER]与上式等效。例如: MOV AX,BUFFER ;
其中BUFFER为存放操作数的符号地址。四、寄存器间接寻址四、寄存器间接寻址 利用这种寻址方式时,操作数在存储器中,而操作数偏移地址放在寄存器中,这里的寄存器可以是BX、BP、SI、DI 之一。这四个Reg可以统称间址寄存器若未用前缀指明段寄存器,默认关系为:
对BX、SI、DI默认在DS段中
对BP默认在SS段中 例: MOV AX, [BX]
MOV CL, CS:[DI]而: MOV AX, [DX] ×
MOV CL, [AX] ×MOV AX, [BX]nullMOV AX, [BX]五、寄存器相对寻址五、寄存器相对寻址 利用这种寻址方式时,操作数在存储器中。而操作数有效地址由BX、BP、SI、DI中的内容加上指令中给出的位移量, 得到操作数的有效地址。同样,若未用前缀指明段寄存器,默认关系为:有效地址=间址寄存器的内容加上一个8/16位的位移量MOV AX, [BX+1008H]五、寄存器相对寻址(续)五、寄存器相对寻址(续) 例1: MOV AX, [BX+8]
MOV CX, TABLE[SI]
MOV AX, [BP] ; 默认段寄存器为SS例2: MOV AX,DATA[BX]
若(DS)=6000H, (BX)=1000H, DATA=2A00H,
(63A00H)=66H, (63A01H)=55H 则 物理地址 = 60000H + 1000H + 2A00H = 63A00H
指令执行后:(AX)=5566H
(见下页图示) 五、寄存器相对寻址(续)五、寄存器相对寻址(续) 操作码00 偏移量低2A 偏移量高DS 60000BX 1000 + DATA 2A0063A0063A00H代码段数据段.
.
..
.
..
.
.66H55HMOV AX,DATA[BX]六、基址变址寻址方式六、基址变址寻址方式 操作数的偏移地址:
由基址寄存器(BX或BP)给出 —— 基址寻址方式
由变址寄存器(SI或DI)给出 —— 变址寻址方式由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。注意:同一组内的寄存器不能同时出现。例:MOV AX, [BX] [SI]
MOV AX, [BX+SI]
MOV AX, DS: [BP] [DI]MOV AX, [BX][SI]
MOV AX, [BX+SI]六、基址变址寻址方式(续)六、基址变址寻址方式(续)错误例:
× MOV AX, [BX] [BP]
× MOV AX, [DI] [SI]例:MOV AX,[BX+SI]
若(DS)=3200H,(BX)=0456H,
(SI)=1094H,
其寻址示意图如下页图所示六、基址变址寻址方式(续)六、基址变址寻址方式(续)(DS)3 2 0 0 0 H
(BX) 0 4 5 6 H
(SI) 1 0 9 4 H
3 3 4 E A H67H45H存储器数据段AXALAH图基址加变址寻址示意图334EAH+334EBH七、相对基址变址寻址方式七、相对基址变址寻址方式在基址变址寻址的基础上再加上一个相对位移量。注意:同一组内的寄存器不能同时出现。例: MOV AX,BASE [SI] [BX]
MOV AX,[BX+BASE] [SI]
MOV AX,[BX+SI+BASE]
MOV AX,[BX] BASE [SI]
MOV AX,[BX+SI] BASE
以上都是等价的七、相对基址变址寻址方式(续)七、相对基址变址寻址方式(续)例:MOV AX,DATA[DI][BX]则指令执行后: (AH)=[83021H], (AL)=[83020H]。若 (DS)=8000H, (BX)=2000H, (DI)=1000H, DATA=200H七、相对基址变址寻址方式(续)七、相对基址变址寻址方式(续)使用相对的基址-变址寻址方式可以很方便地访问二维数组。八、其它八、其它1.隐含寻址例如指令: DAA指令中不指明操作数,但有隐含规定的寻址方式。指令含义是对寄存器AL中的数进行十进制(BCD)调整,结果仍放在AL寄存器中。又例如指令: MUL BL指令隐含了被乘数AL及乘积AX。指令含义是:(AL)×(BL)→AX即指令操作数是隐含的,在指令中未显式地指明 。类似的指令还有:DIV、CBW、MOVS等。八、其它(续)八、其它(续)2.I/O 端口寻址直接端口寻址、间接端口寻址。端口地址由一个8位立即数直接指出。例: IN AL, 65H2)间接端口寻址:可以访问256个I/O端口。1)直接端口寻址:被寻址的端口号由寄存器DX提供。例: IN AL, DX可以访问216=64K个I/O端口。寻址方式
寻址方式总结操作数,要么在存储器里,要么在寄存器里,要么在IO端口中。
如果出现”[]”,则操作数在存储器里,需要确定其段基址和偏移地址
不带“[]”的,就是立即寻址和寄存器寻址、隐含寻址、IO端口寻址了。3.3 8086 的指令系统3.3 8086 的指令系统 数据传送指令
算术运算指令
逻辑运算和位移指令
串操作指令
控制转移指令
处理器控制指令8086 的指令系统8086 的指令系统指令的基本构成:操作码[操作数1],[操作数2]8086 的指令系统8086 的指令系统2. 寄存器操作数放在8个通用寄存器或4个段寄存器中的操作数
寄存器操作数要么是8位,要么是16位,如果需要32位,则要两个寄存器结合使用。8086 的指令系统8086 的指令系统2. 寄存器操作数8086 的指令系统8086 的指令系统3. 存储器操作数一般不允许两个操作数同时为存储器操作数 提示: 1)尽量使用寄存器操作数
2)若有可能,用移位代替乘除法
3)尽量使用简单的寻址方式一、 数据传送指令一、 数据传送指令可实现:
通用传送指令
输入输出指令
地址目标传送指令
标志传送指令这类指令又可分为如下四种:这是一种最基本、最重要的操作。通用传送指令通用传送指令 1、通用传送指令MOV 目的数,源数传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。存
储
器立即数段寄存器
CS*,DS,SS,ES通用寄存器
AX (AH,AL)
BX(BH,BL)
CX(CH,CL)
DX(DH,DL)
SI DI
SP BP不包括IP寄存器MOV功能描述MOV功能描述MOV允许在CPU的寄存器之间、存储器与寄存器之间传输数据,也可将立即数传到寄存器和存储器中
注意:
IP寄存器不能作为操作数
立即数和CS不能作为目的操作数
两个操作数不能同时为存储器,也不能同时为段寄存器
立即数不能送入段寄存器null1、存储器到存储器 MOV AL,mem1 ;通过寄存器AL作桥梁
MOV mem2,AL ;用来解决存←存MOV AX,data ;通过AX解决:
MOV DS,AX ;段寄←立即数几个不能直接送的解决办法: MOV AX,DS ;通过AX解决:
MOV ES,AX ;段寄←段寄2、段寄存器到段寄存器 3、立即数到段寄存器 举例:举例:向1000H开始的100个存储单元写入ASCII码2AH(*)程序段如下:
MOV SI,1000H
MOV CX,100
MOV AL,2AH
AGAIN:MOV [SI],AL
INC SI
DEC CX
JNZ AGAIN
INT 20H ;返回DOSnull上程序段存放在代码段中,設(CS)=109EH,则各条指令存放地址如下:109E:0100 MOV SI, 1000H
109E:0103 MOV CX, 64H
109E:0106 MOV AL, 2AH
109E:0108 MOV [SI],AL
109E:010A INC SI
109E:010B DEC CX
109E:010C JNZ 0108
109E:010E INT 20H
109E:01102) 堆栈操作指令2) 堆栈操作指令堆栈:在内存中开辟若干单元作为栈区,按“后进先出” 方式工作。格式: PUSH src ;
POP dest ;堆栈设置在堆栈段SS内,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。 栈空时,栈顶指针等于栈底
堆栈容量是SP初值与SS的距离堆栈操作指令堆栈操作指令① 压栈指令
指令格式:PUSH src例: PUSH AX ;将AX内容压栈
执行操作: (SP)←(SP)-2
(SP)←低字节AL
(SP)+1←高字节AH
设(AX)=1020H,执行示意图如后页图null(AX)=1020H时, PUSH AX 指令执行示意图注意进栈方向是高地址向低地址发展。堆栈操作指令堆栈操作指令压栈指令的格式为:
PUSH reg
PUSH mem ;
PUSH segreg② 弹出指令
指令格式: POP dst例:POP BX ;将栈顶内容弹至BX
执行操作:(BL)←(SP)
(BH)←(SP)+1
(SP)←(SP)+2POP BX指令执行示意图POP BX指令执行示意图null POP指令的格式同PUSH指令,堆栈指令使用时应注意:遵循“先进后出”的原则 ;
PUSH 和 POP在程序中总是成对出现 ;
堆栈操作总是按字进行 ;
不能从栈顶弹出一个字给 CS ;3) 交换指令XCHG3) 交换指令XCHG 格式为:XCHG reg,mem/reg
XCHG mem/reg ,reg交换指令是将源操作数与目标操作数的内容互换.
两操作数中必须有一个在寄存器中,不允许使用段寄存器。举例:XCHG AX,BX
XCHG [2000h],CLnull 4) 换码指令XLAT指令格式: XLAT又叫查表转换指令,它可根据表中代码的序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到 BX中,代码序号存于AL中。执行的操作:(AL)←[(BX)+(AL)]例如: 内存数据段有一张16进制数的ASCII码表,设首地址为2000H,(如后页图所示),如欲查出表中第11个代码(代码序号从0开始)即 B 的 ASCII码,(表中地址设(DS)=4000H)null30H31H32H...39H41H42H...45H46H...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’十六进制数ASCII码表存储器则可用如下几条指令实现:则可用如下几条指令实现: MOV BX,2000H ;(BX)←表首地址
MOV AL,0BH ;(AL)←序号11
XALT ; 查表转换
执行后得到:(AL)=42H执行的操作:(AL)←[(BX)+(AL)]
相当于指令MOV AL,[BX][AL]???2. 输入输出指令2. 输入输出指令完成的操作:CPU←→I/O端口(1).输入指令 IN
格式: IN 累加器,port ;port端口号0~255H
IN 累加器,DX ;DX表示的端口范围达64K例:IN AL,80H ;(AL)←(80H)
IN AL,DX ;(AL)←(DX)
IN AX,DX ;(AX)←((DX)+1,(DX))输入输出指令输入输出指令格式:OUT port,累加器 ;port端口号0~255H OUT DX,累加器 ;DX表示的端口范围达64K例:OUT 68H,AX ;(68+1,68H)←(AX)
OUT DX,AL ;((DX))←(AL)在使用间接的IN/OUT指令时,在指令执行前,应先用传送指令对 DX 寄存器设置好端口号。例: MOV DX,220H
IN AL,DX ;将220H端口内容读入AL累加器(2) 输出指令OUT3. 地址传送指令3. 地址传送指令共有三条:LEA、LDS、LES(1)LEA reg,mem ;将指定存储器的16位偏址送 指定寄存器. 例:设: (SI)=1000H,(DS)=5000H,
(51011H, 51010H)=1234H
执行指令:LEA BX,[SI+10H]执行该指令后:(BX)=1010H而执行指令:MOV BX,[SI+10H]指令要求源操作数必须是一个内存操作数,目的操作数必须是一个16位的非段寄存器。结果为: (BX)=1234H地址传送指令地址传送指令(2)LDS reg,mem32 ;把指定存储器的4个字节内容
送入指定的非段寄存器和DS 传送的是一个32位的地址指针,将存储器的前两个单元(低地址单元)的内容(16位偏址)送入指令中指定的寄存器Reg,后两个单元的内容(段地址)送入DS。例: LDS SI,[0100H]若指令执行前 (DS)=3000H,
(30101H)、(30100H)=0200H
(30103H)、(30102H)=1000H,指令执行后 (SI)=0200H, (DS)=1000H偏“低” 段“高”标志传送指令标志传送指令4. 标志传送指令 与LDS指令类似,将32位地址指针送指定的非段寄存器(常指定为DI)及ES。(3)LES reg,mem32共有四条: LAHF、SAHF、 PUSHF、 POPF(1)读标志指令LAHF
本指令把标志寄存器低8位(包括了5个标志位)传送到AH中,如下图所示null(2) 设置标志指令SAHF
SAHF的功能与LAHF的功能正好相反,用图来示意,只要将前图中5个箭头方向反一下即可。标志传送指令(3)把标志寄存器推入栈顶指令PUSHF 执行的操作: (SP) ←(SP)-2
(SP) ←标志寄存器低8位
(SP)+1←标志寄存器高8位
标志传送指令标志传送指令(4)从栈顶弹出标志寄存器指令POPF 执行的操作: 标志寄存器低8位←(SP)
标志寄存器高8位←(SP)+1
(SP)←(SP)+2
PUSHF和POPF指令用于保护和恢复标志寄存器内容例如:PUSH AX
PUSH CX
PUSHF
: ;这段程序中AX,CX以及标志位,
: ;可能改变
POPF ;恢复时,后入栈的先弹出
POP CX ;
POP AX ;
关于数据传送指令对标志位的影响,除SAHF和POPF这两条指令外,其余所有指令均不影响标志位。二、 算术运算指令二、 算术运算指令一是参加的操作数必须同为无符号数或同为有符号数。
二是要采用不同标志位来检查无符号数和有符号数的运算结果是否溢出。算术运算指令涉及两种类型数据,即无符号数和有符号数。
对加法指令和减法指令而言,无符号和有符号数可采用同一套指令,其条件有两个:8086提供四种类型的算术运算指令,包括加、减、乘、除(见79页表3-6),可对字节、字的有符号数或无符号数进行运算。另外,还提供了十进制运算的调整指令。1. 加法指令1. 加法指令 共有5条指令:
加法指令ADD.
格式有:ADD mem/reg,data
ADD mem/reg1,mem/reg2 注意:1)立即数不能作为目的操作数。
2)源和目的操作数不能同时为存储器。 例: ADD AL,30H
ADD AX,[BX+20H]
ADD CX,SI
ADD [DI],200H
ADD指令对标志位(指状态标志)都有影响。例子例子例: 有两个4字节的无符号数相加:
2C56F8ACH + 309E47BEH =?(2) 带进位位的加法指令ADC(2) 带进位位的加法指令ADCADC指令在形式上和功能上都与ADD类似,只是在相加时要把进位标志的现行值CF加到和中,例如: ADC AL,68H
ADC AX,CX
ADC BX,[DI]ADC指令主要用于多字节加法运算中。设:被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,要求和放回BUFFER1存储区,如下页图所示。加法指令加法指令多字节加法示意图:56H2CHBEH47H...BUFFER1BUFFER2ACHF8H9EH30H被加数加数数据段 ...因CPU只能进行8位或16位的加法运算,为此可将加法分4次或2次进行。加法指令加法指令程序段如下:
MOV CX,4 ;置循环次数
MOV SI,0 ;置SI初值为零
CLC ;清进位标志CF
AGAIN:MOV AL,BUFFER2[SI];不能两个都是存储器
ADC BUFFER1[SI],AL
INC SI
DEC CX
JNZ AGAIN
INT 20H
其中:MOV AL,BUFFER2[SI]和
MOV AL,[BUFFER2+SI]等效加法对标志位的影响情况加法对标志位的影响情况对有符号数和无符号数运算之后,标志位的意义或者解释是不同的。 0001 0100 0011 1001
+ 1100 0101 0110 1010
1101 1001 1010 0011SF=1PF=1ZF=0AF=1CF=0OF=0如果是两个无符号数,则最高位是数据位,此时SF和OF都没意义,只关心ZF和CF
如果是有符号数,则SF和OF就有意义。如果OF=1表示溢出,结果无效(3) 加1指令INC(单操作数指令)(3) 加1指令INC(单操作数指令) 格式: INC reg
INC mem 例: INC AL
注意: 1)本指令除CF外,对其余标志均有影响。
2)本指令中的reg不能是段寄存器。INC [BX] ??INC BYTE PTR[BX] ;类型说明符PTR
INC WORD PTR[BX]
INC BYTE PTR[BX+4](4) BCD码的加法十进制调正指令(4) BCD码的加法十进制调正指令 AAA 、 DAAa)AAA例: MOV AL,08H
ADD AL,07H
AAA 运算结果是:AL中的内容是05H,AH=1表示有进位。 AAA指令只影响AF和CF。注意: 本指令执行时如果AF=1,表示向高位有进位,则该进位进到AH寄存器中。本指令对在AL中的由两个未压缩的BCD码相加后的结果进行调正,得到一个正确的未压缩的BCD码。nullb)DAA两个压缩的BCD码相加结果在AL中,通过DAA调正得到一个正确的组合的BCD码. 与AAA不同,DAA指令不改变AH的内容。 DAA指令对OF无定义,但影响所有其它标志。例: MOV AL,48H
MOV BL,74H
ADD AL,BL
DAA
运算结果为:(AL)=22H,CF=1,AF=1需要使用AAA和DAA这两条指令时,应紧跟在ADD或ADC指令之后。2. 减法指令2. 减法指令 8086/8088共有7条减法指令 (1) 不考虑当前借位标志的减法指令SUB例: SUB AX,BX
SUB [BX+20H],5678H
SUB AL,[BX]其指令格式同ADD,即:
SUB dst,src 本指令在形式上和功能上都和SUB类似,相减时还应减去CF的值。 (2) 考虑当前借位标志的减法指令 SBB例:SBB AX,CX
SBB AL,CLSBB指令主要用于多字节的减法。目的 目的-源减法操作中,对标志位的解释减法操作中,对标志位的解释二进制减法 当成无符号数 当有符号数
1011 0001 177 -79
0100 1010 - 74 - 74
0110 0111 103 103
ZF=0 AF=1 CF=0 SF=0 PF=0 OF=1
若当作无符号数,CF=0表示没有借位,结果为正确的差,此时SF和OF无意义
若当作有符号数,则OF=1表示结果不正确,产生溢出(3) 减1指令DEC(3) 减1指令DEC指令格式: DEC dst例:DEC CL
DEC WORD PTR[DI+200]DEC指令除不影响CF外,对各标志位都有影响。(4) 取负(求补)指令NEG指令格式: NEG dst例: NEG AX
NEG BYTE PTR[BX]因对一个操作数取补码相当于用0减去此操作数,故NEG执行的是减法运算。NEG指令对6个标志位均有影响。(5) 比较指令 CMP (操作数格式同SUB)(5) 比较指令 CMP (操作数格式同SUB)指令格式: CMP dst,src CMP执行目的操作数-源操作数,但不送回结果,其指令的效果只反映在标志位上。例: CMP AL,0AH ;AL与0AH比较 CMP CX,SI ;CX与SI比较 CMP DI,[BX+03];DI与存储器比较比较指令影响所有标志位。如何根据标志位来判断两个数的比较结果呢?若两个所比较的数相等,则ZF=1,否则ZF=0。这样,根据ZF就可判断两个数是否相等。若两个数不相等,如何根据标志位来判断谁大谁小呢?分两种情况考虑:若两个数不相等,如何根据标志位来判断谁大谁小呢?分两种情况考虑:① 比较的是两个无符号数 若CF=0,则被减数大,因大数减小数无须借位。
若CF=1,则被减数小。② 比较的是两个有符号数
若两个数都是正数或负数时,相减不会溢出(即OF=0),所以可仅用SF来判断,若SF=0,表示被减数大,SF=1则反之.若比较的两个数中有一个为正,另一个为负,此时不能单看SF,还需考虑OF(因为结果可能溢出),判别条件:OF=0时,若SF=0被减数大;若SF=1减数大。
OF=1时,若SF=1被减数大;若SF=0减数大。
比较指令 比较指令 比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。程序段如下: CMP AL,BL ;AL和BL比较
JNG BBB ;若AL≤BL,则转
XCHG AL,BL ;否则AL>BL,则交换
BBB: CMP AL,CL ;AL和CL比较
JNG CCC ;若AL≤CL,则转
XCHG AL,CL ;若AL>CL,则交换
CCC: INT 20H ;返回DOS(6) BCD码的减法十进制调整指令
AAS、DAS(6) BCD码的减法十进制调整指令
AAS、DASAAS:对AL中由两个未压缩的BCD码相减的结果进行调整。
DAS:对两个压缩的BCD码减法进行调正,结果应在AL中。 DAS对OF无定义,但影响其余标志位。
AAS和DAS这两条指令在使用时要求紧跟在减法指令之后。3. 乘法指令3. 乘法指令 进行乘法时: 8位8位→16位乘积 16位16位→32位乘积 (1) 无符号数的乘法指令使用乘法指令对被乘数和乘积的存放地方均有规定: 被乘数存放地方 乘积存放地方
对字节乘 AL AX
对字乘 AX DX,AX指令格式: MUL src例: MUL BL ;AL* BL,乘积在AX中
MUL CX ;AX* CX,乘积在(DX,AX)中
MUL BYTE PTR[BX]当运算结果的高半部分(DX或AH中)的结果为零时,标志位CF=OF=0, 否则CF=OF=1,表示DX或AH中包含有乘积的有效数字。(2) 有符号数乘法指令(2) 有符号数乘法指令例1: IMUL CL ;AL中有符号数*CL中有符号数指令格式: IMUL src例:设(AL)=FEH,(CL)=11H ② 将FEH及11H均看做有符号数
执行 IMUL CL
得 (AX)=FFDEH=-34① 将FEH及11H均看做无符号数
执行 MUL CL
得 (AX)=10DEH=4318null(3) BCD码的乘法十进制调正指令 AAM 先执行MUL把两个非压缩的BCD码相乘,结果在AX中,再执行AAM进行调正,得到正确的结果,高位放在AH中,低位放在AL中。例:十进制乘法运算:7*8=?
MOV AL,07H ;(AL)=07H
MOV CL,08H ;(CL)=08H
MUL CL ;(AX)=0038H
AAM ;(AH)=05H,(AL)=06H
所得结果为非组合的BCD码。希望AH:05H,AL:06H4. 除法指令4. 除法指令8086/8088 CPU执行除法运算,要求被除数字长为除数字长的两倍,并对被除数、商及余数存放地方有如下规定: 被除数 商 余数
字节除法 AX AL AH
字除法 DX:AX AX DX(1) 无符号数除法指令指令格式: DIV src例: DIV CL ;AX除以CL
DIV WORD PTR[BX] ;DX:AX除以BX,BX+1两 ;存储器(16位)若除数为零或AL中商大于FFH,(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。(2) 有符号数除法指令(2) 有符号数除法指令指令格式: IDIV src本指令除要求有符号数相除外,在功能上和形式上与DIV类似。当然其商及余数均为有符号数,且余数符号总是与被除数符号相同。前面已指出除法运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误。对于无符号数除法扩展很简单,只需将AH或DX清零即可。
对有符号数而言,则是符号位的扩展,共提供了两条指令。(3) 将有符号位字节扩展成字的指令 CBW
(4) 将有符号位字扩展为双字的指令 CWD(5) AAD:将AX中的两位非压缩的BCD码形式的被除数调整成二进制数,存到AL中。三、 逻辑运算和位移指令三、 逻辑运算和位移指令 1. 逻辑运算指令 (共有5条) (1)取反指令(2) 逻辑“与” 指令指令格式: NOT mem/reg例: NOT CX ;CX取反
NOT BYTE PTR[DI] ;对存储器(8位)取反功能:将操作数的各位按位求反后再送回该操作数。指令格式: AND dest, src对两个指定的操作数,按位进行逻辑”与”。例: AND AL,0FH ;保留AL中低4位
AND AL,11011111B ;这条指令可将AL中的英文字母(用ASCII码表示)转换成大写字母, 因大写字母的SCII码D5位总是零, 而小写字母D5位总为1.(3) 逻辑”或”指令OR(3) 逻辑”或”指令OR功能:对两个指定的操作数,按位进行逻辑“或”。指令格式: OR dest, src例:OR AL,80H ;AL与立即数”或”
OR BX,DI ;BX与DI相”或” “或”指令的最大用途就是将某些特定位置“1”,而不管原来这些位的状态如何。例如:将AL中的未压缩的BCD码变成相应十进制数的ASCII码,可用如下指令:
OR AL,30H
“或”指令对标志位的影响同AND指令.
思考
:键入的大写字母→小写字母?OR AL,00100000B(4) 逻辑”异或”指令XOR(4) 逻辑”异或”指令XOR 指令格式: XOR dest, src功能:对两个指定的操作数按位进行“异或”。例:XOR AL,0FH ;AL“异或”立即数
XOR [BX+SI],AX ;存储器 “异或”AX
XOR AX,AX ;清零AX,并使CF=0与0”异或”,该位不变; 与1”异或”,该位取反
0 1 0 1
⊕0 ⊕0 ⊕1 ⊕1
0 1 1 0(5) 测试指令TEST(5) 测试指令TEST本指令完成AND指令类似操作,但不将“与”的结果送回,只影响标志位。例: TEST AL,80H ;若AL中D7=1,则ZF=0, 否则ZF=1
TEST CX, FFFFH; 若运算后ZF=0则CX为0TEST指令常用于位测试,与条件转移指令一起用。例: TEST AL,80H ;检查AL中D7=1?
JNZ … ;是1,结果非0,为负数,则 ┇ ;转移,否则为正数 实例1 字母转换及输出实例1 字母转换及输出在内存单元BUFFER1存放了小写字符串‘abcdef’,现在要求把它转换为大写字符串,并输出在屏幕上。
DATA SEGMENT
BUFFER1 DB ‘abcdef’
DB 0DH,0AH,’$’
BUFFER2 DB 6 DUP(?)
DB 0DH,0AH,’$’
DATA ENDSnullCODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,6
LEA SI,BUFFER1
LEA DI,BUFFER2
NEXT: MOV AL,[SI]
SUB AL,20H
MOV [DI],AL INC SI
INC DI
DEC CX
JNZ NEXT
MOV AH,9
LEA DX,BUFFER2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START实例2 数字的输出实例2 数字的输出把 数字8输出,
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,8
OR AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START对数字23如何输出?结论:汇编语言对数的输出,需要把每个数位转换为对应的ASCII码,逐位输出。两位以上的数则需要把每个数位上的数码都取出来,逐一进行转换。
为了方便,在把十进制数转换前,都以BCD码的形式写入程序2.算术逻辑移位指令Shift Arithmetic and Shift Logical2.算术逻辑移位指令Shift Arithmetic and Shift Logical8086/8088 CPU有4条非循环移位指令:算术左移指令SAL 逻辑左移指令SHL
算术右移指令SAR 逻辑右移指令SHR
这4条指令的格式相同。以SAL为例:
SAL dest, count式中:变量count表示移位数,其值或是1,或是CL寄存器包含的数值。null这些指令执行的操作功能如下图所示:最低位最高位(a)算术左移SAL(b)逻辑左移SHL最低位最高位(c)算术右移SAR最低位最高位(d)逻辑右移SHRnull普通移位指令的特点:
1、指令执行时,如果只移1位,在指令中用1表示,若移位数多于1,在CL中指定,
如: SHL DX,1
SAL AL,CL ;CL中的值预先指定
这4条指令除AF无定义外,对其余标志位
均有影响。
2、每次移出来的位都进入CF。
3、SAR空出来的位填充原符号位,其余三条则直接补0.3. 循环移位指令3. 循环移位指令循环移位指令亦有4条,以循环对象是否包括CF标志位分为两组,它们是:
不含进位位的循环左移指令ROL
不含进位位的循环右移指令ROR
含进位位的循环左移指令RCL
含进位位的循环右移指令RCR
指令格式与非循环移位指令是一样的。同样,当移位数为1时,直接由指令指出,移位数大于1时由CL预先指出。null这4条指令的功能示意图如下图示:最低位最高位CF(a) ROL最低位最高位CF(c) RCL最低位最高位CF(b) ROR最低位最高位CF(d) RCR4条循环移位指令只影响标志位CF和OF执行下列程序段后,AL,BL,DL各为多少?执行下列程序段后,AL,BL,DL各为多少?MOV AL,10100101
MOV BL,AL
MOV DL,AL
MOV CL,4
SAR AL,1
SHL AL,CL
SHR AL,1
SAL AL,CL
CLC
ROL BL,1
RCR BL,1
ROR DL,1
RCL DL,CL 实例3 压缩BCD码的输出实例3 压缩BCD码的输出 下面看一个实例来说明逻辑运算指令和移位指令的使用:
BCD码→ASCII码
设在内存BUFFER1中存有四个压缩BCD码 12H、34H、56H、78H 要求转换为ASCII码存放在BUFFER2开始的单元中去,并输出在显示器上。
程序段如下:完整的程序完整的程序DATA SEGMENT
BUFFER1 DB 12H,34H,56H,78H,0DH,0AH,’$’
BUFFER2 DB 8 DUP(?),0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
null LEA SI,BUFFER1
LEA DI,BUFFER2
MOV CX,4
BBB:MOV AL,[SI]
MOV BL,AL
PUSH CX
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],ALINC DI
MOV AL,BL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
INC SI
POP CX
DEC CX
JNZ BBB
十位数处理完,下面处理个位数接上—处理完毕,开始输出接上—处理完毕,开始输出MOV AH,9
MOV DX,OFFSET BUFFER2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START四、 字串处理指令四、 字串处理指令共有5条,它们的共同特点是:① 一般用DS:SI寻址源操作数,用ES:DI寻址目的操作数
② 每次串操作后,SI和DI的内容会自动修改,若DF=0,SI和DI按增量修改,若DF=1,SI和DI按减量修改。
③ 有的串操作指令前面可加重复前缀REP,于是该指令自动重复执行,直至(CX)=0为止
注:进行字符串操作前要把字符串的长度放在CX中
DF的操作指令:
CLD 把DF清0,STD把DF设为1
字符串重复前缀字符串重复前缀这些重复前缀会自动进行CX-1的操作⒈字符串传送指令MOVS P97例3-75⒈字符串传送指令MOVS P97例3-75字符串指令后可以跟B或W,表示一次操作的单位是字节或字该指令执行的操作: ((ES):(DI))←((DS):(SI))指令格式:
[REP] MOVSB ;传送字节
[REP] MOVSW ;传送字⒉字符串比较指令 CMPSB/CMPSW 例3-76⒉字符串比较指令 CMPSB/CMPSW 例3-76 执行的操作:((DS):(SI))-((ES):(DI))
比较的结果只反映在标志位上。
本指令可用来检查两个串是否相等。(例98页)⒊串扫描指令(搜索子串) SCASB/SCASW 例3-77执行的操作:
对字节:(AL)-((ES):(DI))
对字: (AX)-((ES):(DI)) 可见搜索指令执行的仍是比较(相减)操作,结果只影响标志位。必须把要搜索的关键字预先放在AL(字节)或AX(字)中。4 串装入指令 LODSB/LODSW4 串装入指令 LODSB/LODSW 执行的操作:
对字节:(AL)((DS):(SI))
对字: (AX) ((DS):(SI))
一般不带重复前缀,不影响标志位。5. 串存储指令 STOSB/STOSW 执行的操作:
对字节: ((ES):(DI)) (AL)
对字: ((ES):(DI)) (AX)
串存储指令可以加前缀ERP, 相当于在存储器中生成n个相同字符的串null例:将BLOCK1起存放以ODH结束的字符中英文字母小写转换成大写存入BLOCK2(520页ASCII表)。
LEA SI, BLOCK1 ;转换前字串首地址SI
LEA DI, BLOCK2 ;转换后字串首地址DI
CLD ;把DF清0
NEXT: LODSB ;取一个小写ASCII码AL
CMP AL,ODH ;结束?(设ODH为结束标记)
JZ DONE ;是,转结束
CMP AL,61H ;小于a?(否,开始处理)
JC OK ;是,转保存
CMP AL,7BH ;大于z?
JNC OK ;是,转保存
SUB AL,20H ; 否,转换成大写字母
OK: STOSB ;保存
JMP NEXT ;去下一个字节
DONE: HALT ;结束五、 控制转移指令五、 控制转移指令控制转移类指令包括5类指令: 无条件转移和条件转移指令
循环控制指令
子程序调用和返回指令
中断指令1. 转移类指令1. 转移类指令 (1)无条件转移类指令 JMP指令格式: JMP OPRD ;OPRD是转移的目的地址无条件转移类指令有直接转移和间接转移两种:直接转移: JMP XXH ;段内直接短转移
JMP XXXXH ;段内直接近转移
JMP XXXXH:XXXXH ;段间直接远转移 间接转移: JMP reg ;例如 JMP SI
JMP mem16/mem32 ;例: JMP WORD PTR[reg] ;段内间接近转移
JMP DWORD PTR[BP+SI] ;段间间接远转移式中: 编程时XXH等符号均用标号表示。(2) 条件转移类指令(2) 条件转移类指令指令格式:JC short_label;label是转移的目的地址条件转移类指令只能用段内直接寻址方式,而且转移范围只能是指令所在位置前后的-128 +127 个单元。条件转移指令有几十条(见P110中的表3-11、12)。分为直接标志条件转移和间接标志条件转移指令
例1: P111例3-90表3-11 直接标志条件转移指令表3-11 直接标志条件转移指令表3-12 间接标志条件转移指令表3-12 间接标志条件转移指令(2) 条件转移类指令(2) 条件转移类指令GET_TEMP: MOV DX,320H
IN AL,DX
CMP AL,100
JZ HEAT_OFF
HEAT_ON: MOV AL,01H
MOV DX,321H
OUT DX,AL
JMP GET_TEMP
HEAT_OFF: MOV AL,00H
MOV DX,321H
OUT DX,AL 例3-90 P111
温度传感器的端口为320H,控制加热器开关为输出端口321H的最低位,该位为1则打开加热器否则关闭。
题目要求实现加热至100度。(2) 条件转移类指令(2) 条件转移类指令 XOR AL,AL ;AL=0
MOV PLUS,AL ;清PLUS单元
MOV MINUS,AL ;清MINUS单元
MOV ZERO,AL ;清ZERO单元
LEA SI,TABLE ;SI数据块首址
MOV CX,COUNT ;CX数据块长度例2: 在内存的数据段中存放了若干个8位有符号数,数据块的长度为COUNT,首地址为TABLE。
试统计:其中正数、负数及零的个数,并分别将统计结果存入PLUS、MINUS和ZERO单元。(2) 条件转移类指令 (2) 条件转移类指令 AGAIN:LOADSB ;取一个数据到AL
OR AL,AL ;使数据影响标志位
JS FUSHU ;如为负,转FUSHU
JZ LING ;如为零,转LING
INC PLUS ;否则为正,PLUS单元加1
JMP NEXT