![冯博琴《微型计算机原理与接口技术》(第3版)【教材精讲+考研真题解析】讲义与视频课程【20小时高清视频】](https://wfqqreader-1252317822.image.myqcloud.com/cover/146/27054146/b_27054146.jpg)
3.3 8086指令系统
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/1-34.jpg?sign=1738391592-yzJBhyHdv9tmeRh8eiAvfcMFsq364Uzj-0-527b8a78200324c94fb268bd9d3d5e12)
视频二维码(扫码观看)
掌握:
指令码的含义
指令对操作数的要求
指令的对标志位的影响
指令的功能
8086指令系统
从功能上包括六大类:
数据传送
算数运算
逻辑运算和移位
串操作
程序控制
处理器控制
一、数据传送指令
通用数据传送
输入输出
地址传送
标志位操作
1通用数据传送
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image075.png?sign=1738391592-R5pxaS8HeJ9xxCSBTTsrtOVbqS453FEN-0-0d5963c60347fd15b096f673679cfdaf)
特点:该类指令的执行对标志位不产生影响
(1)一般数据传送指令
一般数据传送指令MOV
格式:MOV dest,src
操作:src→dest
例:MOV AL,BL
注意点:
两操作数字长必须相同;
两操作数不允许同时为存储器操作数;
两操作数不允许同时为段寄存器;
在源操作数是立即数时,目标操作数不能是段寄存器;
IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。
一般数据传送指令应用例:
将(*)的ASCII码2AH送入内存数据段1000H开始的100个单元中。
题目分析:
确定首地址
确定数据长度
写一次数据
修改单元地址
修改长度值
判断写完否?
未完继续写入,否则结束
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image076.jpg?sign=1738391592-yfaicN0gKgwIBZwLypz37jQUshGvhwMK-0-7709545a2d91045f27d8e4624be8156e)
程序段:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image077.png?sign=1738391592-HrKQLBaKwCkGDNdvRZKaqeZO78AMmXk1-0-c489c0ccf2cff16e59e7926218e6997e)
上段程序在代码段中的存放形式:
设CS=109EH,IP=0100H,则各条指令在代码段中的存放地址如下:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image078.png?sign=1738391592-sBH26YNZfEZaryZTDhALbyE155i7S8Zi-0-f29fe4f7f0839d32dcbbaa9f9a65aa32)
数据段中的分布:
送上2AH后数据段中相应存储单元的内容改变如下:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image079.png?sign=1738391592-SkxvOQfeqJTqDrpzEO4hJTha4zFZYps9-0-e18d25d551120fbf155586dcd9ae2955)
(2)堆栈操作指令
掌握:
有关堆栈的概念
栈顶、栈首、栈底
堆栈指令的操作原理
执行过程,执行结果
堆栈操作的原则:
先进后出
以字为单位
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image080.jpg?sign=1738391592-TJh1BQCoVuwL9sUm8YEmSU2bCE2ZLEtK-0-a7884e4d5eaad4e78dd37c4eb4a02e28)
压栈指令PUSH
指令执行过程:
SP-2→SP
操作数高字节→SP+1
操作数低字节→SP
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image081.jpg?sign=1738391592-61eQAfFvizD1ocCZtxQxRQtypBF3sS3p-0-5df5fd0602499ebed9ec6f100c3af178)
压栈指令的操作
设AX=1234H,SP=1200H
执行PUSH AX指令后堆栈区的状态:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image082.jpg?sign=1738391592-aYahBBE5ytrGOj6leZWEnHu0IXUUq4xm-0-3ceef68ca122ce127decb6f51e267846)
出栈指令POP
指令执行过程:
SP→操作数低字节
SP+1→操作数高字节
SP←SP+2
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image083.jpg?sign=1738391592-nHyVVPFL29fHuKLLhPb0zyTLeHoDbYl0-0-554b2d5068e62f5b6af736d7bd70d0be)
出栈指令的操作
执行POP AX
堆栈操作指令说明
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image084.jpg?sign=1738391592-VNZC9zJzAupTv5jgGSKkSkAJN05j5Ytp-0-75aa2b09a71d34ae8d6031077a944f66)
指令的操作数必须是16位的;
操作数可以是寄存器或存储器两单元,但不能是立即数;
不能从栈顶弹出一个字给CS;
PUSH和POP指令在程序中一般成对出现;
PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。
堆栈操作指令例:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image085.png?sign=1738391592-Lfk8iL4ufou2irInaKGIyLGBTE2VPeFj-0-6d506b834ad376a0aa9386c05b7eb359)
(3)交换指令
格式:XCHG REG,MEM/REG
注:两操作数必须有一个是寄存器操作数,不允许使用段寄存器。
例:
XCHG AX,BX
XCHG [2000],CL
(4)查表指令
格式:XLAT
说明:用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址。
操作:将BX+AL所指单元的内容送AL查表指令。
例:
数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第11个代码的ASCII码
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image086.jpg?sign=1738391592-XtttbtJ1cqFM2X1zFgPSlCrhwEryXOUC-0-109cd7c53b66196d073bef3b20ed0569)
查表指令例
可用如下指令实现:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image087.png?sign=1738391592-mv3zin3Ga1WnTr1LQSvS8zdKQPD3cC47-0-21ada8ed336ca10e8c45d84f0a23da77)
执行后: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
输出指令:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image088.png?sign=1738391592-dN8oRhkuFTBZqtlIqfB86fXgEmce4Deo-0-6907018d8538521a5f067765b436d4b7)
指令寻址方式
根据端口地址码的长度,指令具有两种不同的端口地址表现形式。
(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地址传送指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image089.png?sign=1738391592-nWodxox7iCUNcVZOZSuQGuSTvxUTgd0v-0-1e8f3aad490e4bc628d6a80820c6e15e)
(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
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image090.jpg?sign=1738391592-APiL82McNX7bbmTVg06JEdr9E4qNSZe4-0-826953f5d98a4308806b66f281909595)
LEA指令在程序中的应用
将数据段中首地址为MEM1的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image091.jpg?sign=1738391592-AtSG285vuFg69RczZ4iC6qQFCU049Ewv-0-9f7e66e7879736bbfcabf7c5396977f1)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image092.jpg?sign=1738391592-JjguRJBWMaRoV9j3wzu2jsO7gW9AE5nc-0-27d555330d8a3097a3b482bdb75effda)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image093.png?sign=1738391592-malu0hMPv980vF9GRXa3v5ovAA9YOVVE-0-bc3b139a05bdb8fbbd4347215a1cfc66)
4标志位操作指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image094.png?sign=1738391592-FI4GArRvhk4UCGZomdGVJESIk6kED40w-0-b569ecb25e5be8a5ec2c665fab400002)
(1)LAHF,SAHF
LAHF
操作:将FLAGS的低8位装入AH
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image095.jpg?sign=1738391592-Qt1J7VFs64HNV8xSbDFR3AiVZFBiTwFp-0-56fe05f1712c7d874a9002b9430cd07c)
(2)PUSHF,POPF
针对FLAGS的堆栈操作指令
将标志寄存器压栈或从堆栈弹出
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/1-15.jpg?sign=1738391592-uhYSb7HCuaTqR32YMfmZwA5zwYUi55vQ-0-af9c413d693b1d1d2ae5821d6ad82648)
视频二维码(扫码观看)
二、算术运算类指令
加法运算指令
减法运算指令
乘法指令
除法指令
注意:算术运算指令的执行大多对状态标志位会产生影响
1加法指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image096.png?sign=1738391592-epq7KRvHua7pvFAidBC14ymqGGtmljl1-0-eb8dd606ea918e904676e919d05869b4)
注意:加法指令对操作数的要求与MOV指令相同
(1)ADD指令
格式:ADD OPRD1,OPRD2
操作:OPRD1+OPRD2→OPRD1
注意:ADD指令的执行对全部6个状态标志位都产生影响。
ADD指令例
MOV AL,78H
ADD AL,99H
注意:指令执行后6个状态标志位的状态。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image097.png?sign=1738391592-zmhLjq6W6P6a23zPpvmQsjYqNulyWvOl-0-3deb38101718d794118db0bacb035baa)
标志位状态:
CF=1 SF=0
AF=1 ZF=0
PF=1 0F=0
(2)ADC指令
指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样。
指令的操作:OPRD1+OPRD2+CF→OPRD1
ADC指令多用于多字节数相加,使用前要先将CF清零。
ADC指令应用例——求两个20B数的和。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image098.jpg?sign=1738391592-jQ7s5xsqW9cSd7J6x3m1dWVgNLmR92Vs-0-26d48befecd2d147a9c6ccf0eeb7a88e)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image099.png?sign=1738391592-4f2E5zXNciuOUAfJEOZzZ2E4p1DoCQAb-0-b382b6aebc136ec37b27e2000127c9e5)
(3)INC指令
格式:INC OPRD→不能是段寄存器或立即数
操作:OPRD+1→OPRD
常用于在程序中修改地址指针。
2减法指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image100.png?sign=1738391592-vFG7rKxhMp7k09InmpGdRfVPlSCth9uM-0-a268c804f56d44e56408b82dd99be958)
注意:减法指令对操作数的要求与对应的加法指令相同。
(1)SUB指令
格式:SUB OPRD1,OPRD2
操作:OPRD1-OPRD2 OPRD1
注意:对标志位的影响与ADD指令同。
(2)SBB指令
指令格式、对操作数的要求、对标志位的影响与SUB指令完全一样。
指令的操作:OPRD1-OPRD2-CF OPRD1
(3)DEC指令
格式:DEC OPRD
操作:OPRD-1 OPRD
注意:指令对操作数的要求与INC相同,常用于在程序中修改计数值。
应用程序例
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image101.png?sign=1738391592-7rdeF8hwJXCcVZaCFYbEuLmbnueJ6OCS-0-24c25ee70ddd25f718d6e733ef0b9eea)
(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共同决定:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image102.png?sign=1738391592-SnhGbJ8VwPk59Ptqf2a536SB7LgZbHA8-0-b49b51b992ae84cbeafa53e49423f96c)
CMP指令例
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image103.png?sign=1738391592-4fGL5uwPsLdIr49nyDvetyAK25yiiRvX-0-7fb396c43c2c5df0e482b9c86d7ad98a)
程序功能:在20个数中找最大的数,并将其存放在MAX单元中。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image104.jpg?sign=1738391592-eviNpPI4EMAY1IkCvTzEz4QlNNzPvSNJ-0-7e2437a609bfcc8a71876ed3d0500b70)
3乘法指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image105.png?sign=1738391592-4zq5lEj4N6Wo6CNJEFisICnS50qNpcg1-0-f370703164930de03effaf4e98e1dad1)
注意点:乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX。
(1)无符号数乘法指令
格式:MUL OPRD→不能是立即数
操作:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image106.jpg?sign=1738391592-koaQSq8oS3yJMxclPH0v5JQVkkHNaPNQ-0-f208daadd748835e6526881e7972e8e3)
(2)无符号数乘法指令例
MUL BYTE PTR[BX]
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image107.jpg?sign=1738391592-CbOh1TGinLN4IGEkQe0765CyfSw0EPiI-0-8c3711d1009bd269c5a6cd3c8b160e2f)
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
“与”指令应用例
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image108.jpg?sign=1738391592-UjGOAhCi1yNqR3hcIEhTdE6gYw34wl1i-0-d6b6cd3c7ce16f1ab27db2d9327c1a22)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image109.png?sign=1738391592-WaWgR7fDwA4FJOPjhTihW0Jl3TfuzjPi-0-a5c1399f81fe8bff82554e4bdf2fc098)
(2)“或”运算指令
格式:OR OPRD1,OPRD2
操作:两操作数相“或”,结果送目标地址
“或”指令的应用
实现两操作数相“或”的运算
OR AX,[DI]
使某些位不变,某些位置“1”
OR CL,0FH
在不改变操作数的情况下使OF=CF=0
OR AX,AX
“或”指令的应用例
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image110.png?sign=1738391592-hmQqIuIT2wc8XHUgCii8FwkD0v44xMtY-0-47fdc868205118b08148b83d78ed1384)
“或”指令的应用
如何实现将一个二进制数9变为字符‘9’?
(3)“非”运算指令
格式:NOT OPRD
操作:操作数按位取反再送回原地址。
注:指令中的操作数不能是立即数,指令的执行对标志位无影响。
例:NOT BYTE PTR[BX]
(4)“异或”运算指令
格式:XOR OPRD1,OPRD2
操作:两操作数相“异或”,结果送目标地址。
例:
XOR BL,80H
XOR AX,AX
(5)“测试”指令
格式:TEST OPRD1,OPRD2
操作:执行“与”运算,但运算的结果不送回目标地址。
应用:常用于测试某些位的状态。
2移位指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image111.png?sign=1738391592-ZpxauThRJdahrd0Fsu6m0Jzwole7udbR-0-bd7bccbe96d55e1b032703e2944be297)
注:移动一位时由指令直接给出;移动两位及以上,则移位次数由CL指定。
(1)非循环移位指令
逻辑左移
算术左移
逻辑右移
算术右移
算术左移和逻辑左移
算术左移指令:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image112.png?sign=1738391592-mXLI3X1ubycL4R7cVloahCSN0azuyCts-0-73a7555c272e27d278f520eebfe9e61c)
逻辑左移指令:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image113.png?sign=1738391592-zMfYnSJadx4t3vKdSNu4jCp5upauOHqp-0-8141bd442aa19d21187bee25ad1b0ec8)
逻辑右移
格式:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image114.png?sign=1738391592-Kpa06zBZo6YW4hAEc8tzvM0ai3Q0lJUs-0-1fd1588532b81b59ec614a3bfb813cab)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image115.jpg?sign=1738391592-p5jwI1xONqTZNcHnQHpv3Jc5nFaz2dy2-0-e10eb3b3bbc161e4f50c994b3e668a56)
逻辑右移例
MOV AL,68H
MOV CL,2
SHR AL,CL
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image116.jpg?sign=1738391592-U7MSqk16NoP8pNAn3JD8J4wWMXO8yhou-0-d698077d6dcd1788d9a16975790a5c5e)
算术右移
格式:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image117.png?sign=1738391592-0hW2f9zVuzxNpEuRZhHIehxRiBojQIUJ-0-24e9939a7e88326ab205d6dc2391fb36)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image118.jpg?sign=1738391592-1OU43Awkkj0JXJ8X4BoYK1aodze3DqDs-0-e46272df9b31cc419080ee8366c5e2f3)
非循环移位指令的应用:
左移可实现乘法运算
右移可实现除法运算
(2)循环移位指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image119.png?sign=1738391592-8gw28UDkDFZP1g9ePAr1eYwR4zp2OBRa-0-4ea82b203dca6717cf053fdef763c91a)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image120.png?sign=1738391592-na1VnWqxwrHWgd8Rjp9UtGNPEu0i7TBo-0-6169322d1a8baa145673ca16e63d1d27)
指令格式、对操作数的要求与非循环移位指令相同。
不带进位位的循环移位:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image121.jpg?sign=1738391592-EwyyOFWFjcZ6Kh1gNs4aB63m1rM0arwQ-0-cb0003b6f37a61e31fa36ffcb148158c)
带进位位的循环移位:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image122.jpg?sign=1738391592-XPjVbVph3Z1UCS95QuGjlaQOdmnmY7gE-0-df5be836ac491de8cf5a37f6326f44a0)
循环移位指令的应用:
用于对某些位状态的测试;
高位部分和低位部分的交换;
与非循环移位指令一起组成32位或更长字长数的移位。
程序功能:将1000H开始存放的4个压缩BCD码转换为ASCII码存放在3000H开始的单元中去。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image123.jpg?sign=1738391592-fd1SnYcTMwjy1O4U4c9OXgXhRxc74aHh-0-9aa016c6b9a7f4f363e3eb81d29dcb9e)
程序例:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image124.png?sign=1738391592-jSNeBVOV6a7cKVYjegooxOZyW4g1xcZv-0-c095121479c4993f2fac65694be93e70)
四、串操作指令
1串操作指令说明
针对数据块或字符串的操作;
可实现存储器到存储器的数据传送;
待操作的数据串称为源串,目标地址称为目标串。
2串操作指令的特点
源串一般存放在数据段,偏移地址由SI指定。允许段重设;
目标串必须在附加段,偏移地址由DI指定;
指令自动修改地址指针,修改方向由DF决定。
DF=0→增地址方向
DF=1→减地址方向
数据块长度值由CX指定;
可增加自动重复前缀以实现自动修改CX内容。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/1-32.jpg?sign=1738391592-ZRurElBPYDQtFHv7ylmmK6IDstttsPhv-0-4fd983445437ae8d80b2972d74c635dc)
视频二维码(扫码观看)
3重复前缀
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image125.png?sign=1738391592-CN3KYHcMUdGWR462lv76nerjI2ctzQOy-0-8fdeff2bf0596d96afab4cd154bd9e3b)
条件重复
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image126.png?sign=1738391592-MWMsvs97PYRuyRstlVdJDO5h7BTFVjvN-0-c5d440aeea59fce4021b29c18fc0eb82)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image127.png?sign=1738391592-0wXrWGaQ6MM0LcQFzbtLV5HseADqH7qz-0-b4d958bbbb63754da8946aa5ab2f86b3)
串操作指令流程(以传送操作为例)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image128.png?sign=1738391592-2hyOfyV4grnBQKJRBob7Bgi6e6e8T5U3-0-90cc2e5ce5c650efa0971507b96b224f)
4串操作指令
串传送MOVS
串比较CMPS
串扫描SCAS
串装入LODS
串送存STOS
(1)串传送指令
格式:
MOVS OPRD1,OPRD2
MOVSB
MOVSW
串传送指令常与无条件重复前缀连用。
对比用MOV指令和MOVS指令实现将200个字节数据从内存的一个区域送到另一个区域的程序段。
串传送指令例
用串传送指令实现200个字节数据的传送:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image129.png?sign=1738391592-6A4d4JprM5JQ6z02RkIEUlpvbCVykvby-0-a49a46531f02fc904d9d1b80db8a8eaf)
(2)串比较指令
格式:
CMPS OPRD1,OPRD2
CMPSB
CMPSW
串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标志位。
前缀的操作对标志位不影响。
串比较指令例
测试200个字节数据是否传送正确,如果不正确,找出第一个不相等的字符,并将其地址与不相等的字符放到BX和AL当中:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image130.png?sign=1738391592-hwe6o363lWE7TZMn04LoHQ4ruYb6lId7-0-0811898e5251c6368e9ab5309acf1c11)
(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(字数据);
确定操作方向(增地址/减地址)和区域大小(串长度值);
使用串存储指令+无条件重复前缀,实现数据传送。
串存储指令例:内存某个区域清零
设计思想:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image131.jpg?sign=1738391592-tZnoBSMie8bWaQHXj4XmdXaMqaIlUghv-0-f2f2ba885998a1a38be74bcd887713dd)
五、程序控制指令
转移指令
循环控制
过程调用
中断控制
程序的执行方向
程序控制类指令的本质是:控制程序的执行方向
决定程序执行方向的因素:CS,IP
控制程序执行方向的方法:修改CS和IP,则程序转向另一个代码段执行;仅修改IP,则程序将改变当前的执行顺序,转向本代码段内其它某处执行。
1转移指令
通过修改指令的偏移地址或段地址及偏移地址实现程序的转移。
无条件转移指令:无条件转移到目标地址,执行新的指令。
有条件转移指令:在具备一定条件的情况下转移到目标地址。
(1)无条件转移指令
格式:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image132.png?sign=1738391592-5nos2GqDt0TXWifCzmqfIKqIXyhrMGsq-0-3d95b8719bbdd5d58d34b8362168a344)
原则上可实现在整个内存空间的转移。
①无条件段内转移
转移的目标地址在当前代码段内,段地址不改变。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image133.png?sign=1738391592-s1YlhpXEXo7qjF4Lbjyf87Ra7G9vqJz1-0-189d3dab822f28ad960cf52bf0f4db7e)
段内直接转移
转移的目标地址由指令直接给出
格式:JMP Label→近地址标号
段内直接转移示图
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image134.png?sign=1738391592-MaSBPBzLeIAGZ9BV0jJfjQTaXzU2XgKb-0-05b3b55c70275945b35554e6238f3075)
下一条要执行指令的偏移地址=当前IP+位移量。
段内间接转移
转移的目标地址存放在某个16位寄存器或存储器的某两个单元中。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image135.jpg?sign=1738391592-YCHrvavD7K5fVBvePKRjthit6lAMTQIi-0-818c332f2b96fb323c760f7e09c9c716)
例:
JMP BX
若:BX=1200H
则:转移的目标地址=1200H
段内间接转移例
JMP WORD PTR[BX]
设:BX=1200H
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image136.jpg?sign=1738391592-fRFcuNVs5FTjFMXKFtqYR2wj7BnxPnBb-0-9095b2239f1374a92bcabd34933da917)
②无条件段间转移
转移的目标地址不在当前代码段内。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image137.png?sign=1738391592-kT1MKMsGELkVq66pDK9eWLwnGDJjtsgB-0-041c0790819d37eb6bd4dd08f0943b00)
段间直接转移
转移的目标地址由指令直接给出
格式:
JMP FAR Label→远地址标号
段间直接转移示图
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image138.jpg?sign=1738391592-LsjAGeSw64mTo0Ea3IpTUyDcHdPePRcJ-0-6f4be4285d902c30f8778c19a9432085)
段间间接转移
转移的目标地址由指令中的32位操作数给出。
例:
JMP DWORD PTR[BX]
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image139.png?sign=1738391592-rxd2uXnImakh2ib4E359pCsyy4aaj6xz-0-30d0cda6f3953d5d248a2100f7f49426)
无条件转移指令例
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image140.png?sign=1738391592-8xoMsXDAofA4BI8V3WQ9GfGjPpT69p8W-0-50d1402acede3ffa96000483ff644bb9)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image141.jpg?sign=1738391592-uf2LqhzrQCUOFR5Og9DAdrDv0DxICyCT-0-5069685c82e0a810c0d874e528875f56)
MOV SI,1122H
MOV WORD PTR[SI],0120H
ADD SI,2
MOV WORD PTR[SI],0122H
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/1-14.jpg?sign=1738391592-CQLPOXZbjDzg4o4urMnvsDhvTFiN4Lqh-0-cae1a0d57be5a707733dcda0d69a92f2)
视频二维码(扫码观看)
(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位符号数中正数、负数和零元数的个数。
条件转移指令例(流程图)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image142.jpg?sign=1738391592-f7eqmZ0Ia27ZxgrraI80wwBneeWOUVlh-0-e13075adc3891ef021e6c3fe7a3c085d)
2循环控制指令
循环范围:以当前IP为中心的-128~+127范围内循环。
循环次数由CX寄存器指定。
循环指令:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image143.png?sign=1738391592-wFdHY6ArOJZVxDu9ciDtNiiWgkrKQlIG-0-4081f049e3ec0d6689056d2e2ed706db)
无条件循环指令
格式:LOOP LABEL
循环条件:CX≠0
操作:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image144.png?sign=1738391592-QEiknrAdrGCorPw2SIzemQ4CV203TvUI-0-0e15e766fc5c6f63c06210a4c6f86910)
3过程调用和返回
用于调用一个子过程;子过程由程序员预先设计并装入内存,子过程执行结束后要返回原调用处。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image145.png?sign=1738391592-Ji8HZImz6fuGEMC23fhOaP5cSb4K6V9R-0-086fe19a6635dedb89ec295402fbcc7e)
调用指令的执行过程:
保护断点;
将调用指令的下一条指令的地址(断点)压入堆栈;
获取子过程的入口地址;
子过程第1条指令的偏移地址;
执行子过程,含相应参数的保存及恢复;
恢复断点,返回原程序;
将断点偏移地址由堆栈弹出。
过程调用:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image146.png?sign=1738391592-mHsu9WHX4nXBObc2NB2tMKGfJLBNSlvZ-0-0aa2831ee9b130cc81fcaf7a4b52e7d7)
(1)段内调用
被调用程序与调用程序在同一代码段;
调用前只需保护断点的偏移地址。
格式:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image147.png?sign=1738391592-p2IFcw23SIcw6EWgR04EBjnC6HVT2T2C-0-e40f0bc47537b44a5d799e798b992094)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image148.png?sign=1738391592-S5oz1Xm9v5zP7gnlplMpWPJHnRPm9htd-0-dc9af27e8371a217cdacf2b896557606)
执行过程:
将断点的偏移地址压入堆栈;
根据过程名找子程序入口。
段内调用例
(1)CALL TIMRE→直接调用
(2)CALL WORD PTR[SI]→间接调用
设:SI=1200H CS=6000H
执行第(2)条指令后:
CS=6000H
IP=3344H
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image149.png?sign=1738391592-3dEsYWSqE1TYRNIiPfDD0lahnPzV5yKJ-0-8f1f90c53c286d40136c2b6e2df92c2a)
(2)段间调用
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image150.png?sign=1738391592-GXprdvvhVpwkh8w6aIpqK4ex9GHC9eQb-0-20f91659c127e4d7aac875e2d5fa4b11)
断点保护时的压栈顺序:
先将断点的CS压栈,再压入IP。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image151.jpg?sign=1738391592-r6JzFMnd9sO4jTEBej67iQLY8TztrB0u-0-1cd4fa6dd624bff2d633aa07eb90df0e)
段间调用例
格式: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。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image152.jpg?sign=1738391592-GpfGQ5TZ2lOpLRqZ5MAdvptMH8BPnfQ8-0-4eaed64479b3967ec2251f7cbabb55b4)
中断指令的执行过程:
将FLAGS压入堆栈;
将INT指令的下一条指令的CS、IP压栈;
由n×4得到存放中断向量的地址;
将中断向量(中断服务程序入口地址)送CS和IP寄存器;转入中断服务程序。
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image153.jpg?sign=1738391592-25C66vWZc9n1yRm3cWPz6O9473uG9uw3-0-ce16c0795d6c103b9cb636ba5f05fc0d)
中断指令例
执行程序段:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image154.png?sign=1738391592-Tt45MMQD7WAiF8JU43uPMVYzYePDxLOA-0-4ff951ac9276c2410f558212d80556ee)
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image155.jpg?sign=1738391592-Wyq9oWTg9o2f8ZCLqpZDhGg5qMHBz4lO-0-b103c589b641618c2b640be4d9bf75e5)
执行INT 21H指令后
IP=[21H×4]
CS=[(21H×4)+2]
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image156.jpg?sign=1738391592-uEP7mVr2yMifqiQ4YVfu5KirRjx5hmd0-0-e58ca73659d8e3f985ca3b59979aa263)
(2)溢出中断指令
格式:
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image157.png?sign=1738391592-mzTOw9fmhFYYkolCih4lHinvi695GIMS-0-34dabd8ded376e063e49c74ee2b170d0)
若OF=1,则启动一个类型为4的中断过程,给出一个出错标志,如果OF=0,不做任何操作。
INTO指令通常安排在有符号数加减运算指令之后。
(3)中断返回指令
格式:
IRET
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image158.png?sign=1738391592-J1scrsdCoRomJOlqVDsoko15DFBYc4gZ-0-f1068b9c7b6ac6b8139282fef4ac82c3)
六、处理器控制指令
![](https://epubservercos.yuewen.com/979BDF/15436719904712206/epubprivate/OEBPS/Images/image159.png?sign=1738391592-BsFVLYGzdbkPRdPo4V3fA6ukgT5HcIMu-0-c8235f6dc75d3b9223de2f072ac0a70a)
结束语:
掌握:
指令的格式及意义;
指令对操作数的要求及对标志位的影响;
指令的应用。