3.3 8086指令系统

视频二维码(扫码观看)

掌握:

指令码的含义

指令对操作数的要求

指令的对标志位的影响

指令的功能

8086指令系统

从功能上包括六大类:

数据传送

算数运算

逻辑运算和移位

串操作

程序控制

处理器控制

一、数据传送指令

通用数据传送

输入输出

地址传送

标志位操作

1通用数据传送

特点:该类指令的执行对标志位不产生影响

(1)一般数据传送指令

一般数据传送指令MOV

格式:MOV dest,src

操作:src→dest

例:MOV AL,BL

注意点:

两操作数字长必须相同;

两操作数不允许同时为存储器操作数;

两操作数不允许同时为段寄存器;

在源操作数是立即数时,目标操作数不能是段寄存器;

IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。

一般数据传送指令应用例:

将(*)的ASCII码2AH送入内存数据段1000H开始的100个单元中。

题目分析:

确定首地址

确定数据长度

写一次数据

修改单元地址

修改长度值

判断写完否?

未完继续写入,否则结束

程序段:

上段程序在代码段中的存放形式:

设CS=109EH,IP=0100H,则各条指令在代码段中的存放地址如下:

数据段中的分布:

送上2AH后数据段中相应存储单元的内容改变如下:

(2)堆栈操作指令

掌握:

有关堆栈的概念

栈顶、栈首、栈底

堆栈指令的操作原理

执行过程,执行结果

堆栈操作的原则:

先进后出

以字为单位

压栈指令PUSH

指令执行过程:

SP-2→SP

操作数高字节→SP+1

操作数低字节→SP

压栈指令的操作

设AX=1234H,SP=1200H

执行PUSH AX指令后堆栈区的状态:

出栈指令POP

指令执行过程:

SP→操作数低字节

SP+1→操作数高字节

SP←SP+2

出栈指令的操作

执行POP AX

堆栈操作指令说明

指令的操作数必须是16位的;

操作数可以是寄存器或存储器两单元,但不能是立即数;

不能从栈顶弹出一个字给CS;

PUSH和POP指令在程序中一般成对出现;

PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。

堆栈操作指令例:

(3)交换指令

格式:XCHG REG,MEM/REG

注:两操作数必须有一个是寄存器操作数,不允许使用段寄存器。

例:

XCHG AX,BX

XCHG [2000],CL

(4)查表指令

格式:XLAT

说明:用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址。

操作:将BX+AL所指单元的内容送AL查表指令。

例:

数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第11个代码的ASCII码

查表指令例

可用如下指令实现:

执行后:AL=42H

还可用其他方法实现,如:

MOV BX,2000H

MOV AL,[BX+0BH]

(5)字位扩展指令

将符号数的符号位扩展到高位;

指令为零操作数指令,采用隐含寻址,隐含的操作数为AX及AX,DX;

无符号数的扩展规则为在高位补0;

字节到字的扩展指令。

格式:CBW

操作:将AL内容扩展到AX

规则:若最高位=1,则执行后AH=FFH

若最高位=0,则执行后AH=00H

字位扩展指令例

判断以下指令执行结果:

MOV AL,44H

CBW

MOV AX,0AFDEH

CWD

MOV AL,86H

CBW

2输入输出指令

掌握:

指令的格式及操作

指令的两种寻址方式

指令对操作数的要求

专门面向I/O端口操作的指令

指令格式:

输入指令:IN acc,PORT

输出指令:

指令寻址方式

根据端口地址码的长度,指令具有两种不同的端口地址表现形式。

(1)直接寻址:端口地址为8位时,指令中直接给出8位端口地址;寻址256个端口。

(2)间接寻址:端口地址为16位时,指令中的端口地址必须由DX指定;可寻址64K个端口。

I/O指令例

IN AX,80H

MOV DX,2400H

IN AL,DX

OUT 35H,AX

OUT AX,35H

3地址传送指令

(1)取偏移地址指令LEA

操作:将变量的16位偏移地址取出送目标寄存器,当程序中用符号地址表示内存偏移地址时,须使用该指令。

格式:LEA REG,MEM

指令要求:源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。

(2)LEA指令

比较下列指令:

MOV SI,DATA1→符号地址

执行结果:SI=1234H

LEA SI,DATA1

执行结果:SI=DATA1

MOV BX,[BX]

执行结果:BX=7788H

LEA BX,[BX]

执行结果:BX=1100H

LEA指令在程序中的应用

将数据段中首地址为MEM1的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段。

4标志位操作指令

(1)LAHF,SAHF

LAHF

操作:将FLAGS的低8位装入AH

(2)PUSHF,POPF

针对FLAGS的堆栈操作指令

将标志寄存器压栈或从堆栈弹出

视频二维码(扫码观看)

二、算术运算类指令

加法运算指令

减法运算指令

乘法指令

除法指令

注意:算术运算指令的执行大多对状态标志位会产生影响

1加法指令

注意:加法指令对操作数的要求与MOV指令相同

(1)ADD指令

格式:ADD OPRD1,OPRD2

操作:OPRD1+OPRD2→OPRD1

注意:ADD指令的执行对全部6个状态标志位都产生影响。

ADD指令例

MOV AL,78H

ADD AL,99H

注意:指令执行后6个状态标志位的状态。

标志位状态:

CF=1 SF=0

AF=1 ZF=0

PF=1 0F=0

(2)ADC指令

指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样。

指令的操作:OPRD1+OPRD2+CF→OPRD1

ADC指令多用于多字节数相加,使用前要先将CF清零。

ADC指令应用例——求两个20B数的和。

(3)INC指令

格式:INC OPRD→不能是段寄存器或立即数

操作:OPRD+1→OPRD

常用于在程序中修改地址指针。

2减法指令

注意:减法指令对操作数的要求与对应的加法指令相同。

(1)SUB指令

格式:SUB OPRD1,OPRD2

操作:OPRD1-OPRD2 OPRD1

注意:对标志位的影响与ADD指令同。

(2)SBB指令

指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样。

指令的操作:OPRD1-OPRD2-CF OPRD1

(3)DEC指令

格式:DEC OPRD

操作:OPRD-1 OPRD

注意:指令对操作数的要求与INC相同,常用于在程序中修改计数值。

应用程序例

(4)NEG指令

格式:NEG OPRD→8/16位寄存器或存储器操作数

操作:0-OPRD→OPRD

用0减去操作数,相当于对该操作数求补码

(5)CMP指令

格式:CMP OPRD1,OPRD2

操作:OPRD1-OPRD2

指令执行的结果不影响目标操作数,仅影响标志位!

用途:用于比较两个数的大小,可作为条件转移指令转移的条件。

指令对操作数的要求及对标志位的影响与SUB指令相同。

两个无符号数的比较:

CMP AX,BX

若 AX>BX CF=0

若 AX<BX CF=1

两个带符号数的比较:

CMP AX,BX

两个数的大小由OF和SF共同决定:

CMP指令例

程序功能:在20个数中找最大的数,并将其存放在MAX单元中。

3乘法指令

注意点:乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX。

(1)无符号数乘法指令

格式:MUL OPRD→不能是立即数

操作:

(2)无符号数乘法指令例

MUL BYTE PTR[BX]

4除法指令

无符号除法指令

格式:DIV OPRD

有符号除法指令

格式:IDIV OPRD

除法指令的操作

若OPRD是字节数

执行:AX/OPRD

结果:AL=商 AH=余数

若OPRD是双字节数

执行:DXAX/OPRD

结果:AX=商 DX=余数

5BCD码调整指令

将指令执行的二进制运算结果调整为压缩BCD码或扩展BCD码表示的十进制数。

共6条,均为隐含寻址方式,隐含的操作数是AL或AL、AH;

不能单独使用,要紧跟在相应的算术运算指令之后。

三、逻辑运算和移位指令

指令类型:

逻辑运算

与,或,非,异或

移位操作

非循环移位,循环移位

1逻辑运算

逻辑运算指令对操作数的要求大多与MOV指令相同。

“非”运算指令要求操作数不能是立即数;

除“非”运算指令外,其余指令的执行都会使标志位OF=CF=0

(1)“与”指令

格式:AND OPRD1,OPRD2

操作:两操作数相“与”,结果送目标地址。

“与”指令的应用

实现两操作数按位相与的运算

AND BL,[SI]

使目标操作数的某些位不变,某些位清零

AND AL,0FH

在操作数不变的情况下使CF和OF清零

AND AX,AX

“与”指令应用例

(2)“或”运算指令

格式:OR OPRD1,OPRD2

操作:两操作数相“或”,结果送目标地址

“或”指令的应用

实现两操作数相“或”的运算

OR AX,[DI]

使某些位不变,某些位置“1”

OR CL,0FH

在不改变操作数的情况下使OF=CF=0

OR AX,AX

“或”指令的应用例

“或”指令的应用

如何实现将一个二进制数9变为字符‘9’?

(3)“非”运算指令

格式:NOT OPRD

操作:操作数按位取反再送回原地址。

注:指令中的操作数不能是立即数,指令的执行对标志位无影响。

例:NOT BYTE PTR[BX]

(4)“异或”运算指令

格式:XOR OPRD1,OPRD2

操作:两操作数相“异或”,结果送目标地址。

例:

XOR BL,80H

XOR AX,AX

(5)“测试”指令

格式:TEST OPRD1,OPRD2

操作:执行“与”运算,但运算的结果不送回目标地址。

应用:常用于测试某些位的状态。

2移位指令

注:移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。

(1)非循环移位指令

逻辑左移

算术左移

逻辑右移

算术右移

算术左移和逻辑左移

算术左移指令:

逻辑左移指令:

逻辑右移

格式:

逻辑右移例

MOV AL,68H

MOV CL,2

SHR AL,CL

算术右移

格式:

非循环移位指令的应用:

左移可实现乘法运算

右移可实现除法运算

(2)循环移位指令

指令格式、对操作数的要求与非循环移位指令相同。

不带进位位的循环移位:

带进位位的循环移位:

循环移位指令的应用:

用于对某些位状态的测试;

高位部分和低位部分的交换;

与非循环移位指令一起组成32位或更长字长数的移位。

程序功能:将1000H开始存放的4个压缩BCD码转换为ASCII码存放在3000H开始的单元中去。

程序例:

四、串操作指令

1串操作指令说明

针对数据块或字符串的操作;

可实现存储器到存储器的数据传送;

待操作的数据串称为源串,目标地址称为目标串。

2串操作指令的特点

源串一般存放在数据段,偏移地址由SI指定。允许段重设;

目标串必须在附加段,偏移地址由DI指定;

指令自动修改地址指针,修改方向由DF决定。

DF=0→增地址方向

DF=1→减地址方向

数据块长度值由CX指定;

可增加自动重复前缀以实现自动修改CX内容。

视频二维码(扫码观看)

3重复前缀

条件重复

串操作指令流程(以传送操作为例)

4串操作指令

串传送MOVS

串比较CMPS

串扫描SCAS

串装入LODS

串送存STOS

(1)串传送指令

格式:

MOVS OPRD1,OPRD2

MOVSB

MOVSW

串传送指令常与无条件重复前缀连用。

对比用MOV指令和MOVS指令实现将200个字节数据从内存的一个区域送到另一个区域的程序段。

串传送指令例

用串传送指令实现200个字节数据的传送:

(2)串比较指令

格式:

CMPS OPRD1,OPRD2

CMPSB

CMPSW

串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。

前缀的操作对标志位不影响。

串比较指令例

测试200个字节数据是否传送正确,如果不正确,找出第一个不相等的字符,并将其地址与不相等的字符放到BX和AL当中:

(3)串扫描指令

格式:

SCAS OPRD→目标操作数

SCASB

SCASW

执行与CMPS指令相似的操作,只是这里的源操作数是AX或AL。

串扫描指令的应用:常用于在指定存储区域中寻找某个关键字。

(4)串装入指令

格式:

LODS OPRD→源操作数

LODSB

LODSW

操作:

对字节:AL←[DS:SI]

对字:AX←[DS:SI]

串装入指令的应用:用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口。

LODS指令一般不加重复前缀。

(5)串存储指令

格式:

STOS OPRD→目标操作数

STOSB

STOSW

操作:

对字节:AL→[ES:DI]

对字:AX→[ES:DI]

串存储指令的应用:常用于将内存某个区域置同样的值

此时:

将待送存的数据放入AL(字节数)或AX(字数据);

确定操作方向(增地址/减地址)和区域大小(串长度值);

使用串存储指令+无条件重复前缀,实现数据传送。

串存储指令例:内存某个区域清零

设计思想:

五、程序控制指令

转移指令

循环控制

过程调用

中断控制

程序的执行方向

程序控制类指令的本质是:控制程序的执行方向

决定程序执行方向的因素:CS,IP

控制程序执行方向的方法:修改CS和IP,则程序转向另一个代码段执行;仅修改IP,则程序将改变当前的执行顺序,转向本代码段内其它某处执行。

1转移指令

通过修改指令的偏移地址段地址及偏移地址实现程序的转移。

无条件转移指令:无条件转移到目标地址,执行新的指令。

有条件转移指令:在具备一定条件的情况下转移到目标地址。

(1)无条件转移指令

格式:

原则上可实现在整个内存空间的转移。

无条件段内转移

转移的目标地址在当前代码段内,段地址不改变。

段内直接转移

转移的目标地址由指令直接给出

格式:JMP Label→近地址标号

段内直接转移示图

下一条要执行指令的偏移地址=当前IP+位移量。

段内间接转移

转移的目标地址存放在某个16位寄存器或存储器的某两个单元中。

例:

JMP BX

若:BX=1200H

则:转移的目标地址=1200H

段内间接转移例

JMP WORD PTR[BX]

设:BX=1200H

无条件段间转移

转移的目标地址不在当前代码段内。

段间直接转移

转移的目标地址由指令直接给出

格式:

JMP FAR Label→远地址标号

段间直接转移示图

段间间接转移

转移的目标地址由指令中的32位操作数给出。

例:

JMP DWORD PTR[BX]

无条件转移指令例

MOV SI,1122H

MOV WORD PTR[SI],0120H

ADD SI,2

MOV WORD PTR[SI],0122H

视频二维码(扫码观看)

(2)条件转移指令

在满足一定条件下,程序转移到目标地址继续执行。

条件转移指令均为段内短转移,即转移范围为:-128~+127。

条件转移指令的应用:

几种条件转移指令的应用:

JC/JNC:判断CF的状态。常用于比大小;

JZ/JNZ:判断ZF的状态。常用于循环体的结束判断;

JO/JNO:判断OF的状态。常用于有符号数溢出的判断;

JP/JPE:判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数;

JA/JAE/JB/JBE:判断CF或CF+ZF的状态。常用于无符号数的大小比较。

条件转移指令例

统计内存数据段中以TABLE为首地址的100个8位符号数中正数、负数和零元数的个数。

条件转移指令例(流程图)

2循环控制指令

循环范围:以当前IP为中心的-128~+127范围内循环。

循环次数由CX寄存器指定。

循环指令:

无条件循环指令

格式:LOOP LABEL

循环条件:CX≠0

操作:

3过程调用和返回

用于调用一个子过程;子过程由程序员预先设计并装入内存,子过程执行结束后要返回原调用处。

调用指令的执行过程:

保护断点;

将调用指令的下一条指令的地址(断点)压入堆栈;

获取子过程的入口地址;

子过程第1条指令的偏移地址;

执行子过程,含相应参数的保存及恢复;

恢复断点,返回原程序;

将断点偏移地址由堆栈弹出。

过程调用:

(1)段内调用

被调用程序与调用程序在同一代码段;

调用前只需保护断点的偏移地址。

格式:

执行过程:

将断点的偏移地址压入堆栈;

根据过程名找子程序入口。

段内调用例

(1)CALL TIMRE→直接调用

(2)CALL WORD PTR[SI]→间接调用

设:SI1200H     CS6000H

执行第(2)条指令后:

CS6000H

IP3344H

(2)段间调用

断点保护时的压栈顺序:

先将断点的CS压栈,再压入IP。

段间调用例

格式:CALL FAR PROC

格式例:

CALL FAR TIMRE

CALL DWORD PTR[SI]

(3)返回指令

功能:从堆栈中弹出断点地址,返回原程序。

格式:RET

RET指令一般位于子程序的最后。

4中断指令

中断

中断源

中断的类型

中断指令

引起CPU产生一次中断的指令

中断与过程调用:

中断是随机事件或异常事件引起,调用则是事先已在程序中安排好;

响应中断请求不仅要保护断点地址,还要保护FLAGS内容;

调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。

(1)中断指令

格式:INT n→中断类型码n=0~255

说明:n×4→存放中断服务子程序入口地址的单元的偏移地址,该单元在数据段,段地址=DS。

中断指令的执行过程:

将FLAGS压入堆栈;

将INT指令的下一条指令的CS、IP压栈;

由n×4得到存放中断向量的地址;

将中断向量(中断服务程序入口地址)送CS和IP寄存器;转入中断服务程序。

中断指令例

执行程序段:

执行INT 21H指令后

IP=[21H×4]

CS=[(21H×4)+2]

(2)溢出中断指令

格式:

若OF=1,则启动一个类型为4的中断过程,给出一个出错标志,如果OF=0,不做任何操作。

INTO指令通常安排在有符号数加减运算指令之后。

(3)中断返回指令

格式:

IRET

六、处理器控制指令

结束语:

掌握:

指令的格式及意义;

指令对操作数的要求及对标志位的影响;

指令的应用。