第三章8086指令系统.docx
- 文档编号:24238788
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:35
- 大小:150.54KB
第三章8086指令系统.docx
《第三章8086指令系统.docx》由会员分享,可在线阅读,更多相关《第三章8086指令系统.docx(35页珍藏版)》请在冰豆网上搜索。
第三章8086指令系统
第三章8086指令系统
指令系统是芯片制造商提供给用户的说明书,是程序设计人员必须掌握的,要吃透,必须通过自己亲手去编制,调试和阅读一定的程序。
8086指令系统的特点:
一、兼容性:
8086是8080/8085系统的扩展,包括了它们的全部指令,能容易地移植8位机的应用软件。
二、灵活性:
变字节指令格式,指令长度1~6个字节,节省指令存储空间,便于使用和记忆。
三、寻址能力和数据存取能力强:
多种寻址方式,8位或16位数据操作。
四、数据类型多,处理能力强:
可处理8位或16位的、带符号的和不带符号的,十进制逻辑运算、移位、数据传送、串操作等。
§3.1寻址方式
定义:
指令中用于说明操作数所在地址的方法。
对于一条汇编语言指令,要解决:
①指出进行什么操作,由操作符表明。
②操作数和操作结果放在何处,即寻址。
如ADDAX、3FFH
寄存器AX中的内容+3FFH→AX中去。
§3.1.1有效地址EA(EffectiveAddress)
有效地址:
寻址所需的偏移地址。
(1个或几个偏移地址之和)。
(逻辑地址:
段基址(16位)和偏移地址(16位)组成)
物理地址(即实际地址)=段基址×16+偏移地址(有效地址)
有效地址的计算方法根据寻址方式不同而不同,例如:
(BX)+(SI)+D16(BP)+(DI)+D8
(BX)+D16[(BX)或(BP)]
(SI)+D8即[(SI)+或(DI)]的排列组合
(BX)[D8+.或D16]
(SI)
EA=基址寄存器内容+变址寄存器内容+位移量
可省略有关项,结合寻址方式介绍
§3.1.2寻址方式
一、立即寻址(Immediateaddressing)
操作数由指令提供直接存放在指令中,这种操作数称为立即数。
例MOVDX,2345H
目的操作数源操作数
MOVDL,45H
注意:
高位存放在高地址中,立即数只能用于源操作数
用途:
给寄存器赋初值(段寄存器除外)
二、寄存器寻址(Registeraddressing)
操作数在寄存器中,指令中指定寄存器名称。
例:
MOVAX,BX
将BX中的内容放入AX中。
例:
MOVCL,AH
将AH中的8位数放入CL中。
立即寻址和寄存器寻址指令,执行速度最快。
因为它们直接由EU执行,不需要通过BIU和外部总线打交道。
以下为存储器寻址。
三、直接寻址(Directaddressing)
操作数地址的16位偏移量直接包含在指令中,操作数默认在数据段中,若在其它段需表明:
MOVAX,ES:
[2500H]
称为段超越。
例:
MOVAX,[2000H]
将DS段中偏移量2000H和2001H单元的内容放入AX中。
*有无括号含义不同
例:
MOVAL,[2000H]
设所有条件与上例相同,则执行指令后将存储单元32000H中的一个字节送到AL中,结果为AL=34H
例:
MOVAX,AREA1
汇编语言中允许用符号地址代替数值地址,给存储单元命名,这里AREA1是符号地址,程序编译后就会给出具体的地址。
意义:
将AREA1所指的存储单元中取出1个字送AX。
四、寄存器间接寻址(Registerindirectaddressing)
存储器操作数的有效地址放在基址寄存器(BX、BP)或变址寄存器(SI、DI)中.
●若指令中指定的寄存器是BX、SI、DI则操作数默认在数据段中,若在其它段需表明。
●若指令中指定的寄存器是BP则操作数默认在堆栈段中,若在其它段需表明。
例:
MOVBX,[SI]
将地址偏移量在SI寄存器中的操作数内容送入AX。
若(DS)=1000H,(SI)=2000H(12000H)=318BH,则将318BH送入BX。
例MOVBX,[BP]
若(SS)=3000H,(BP)=1000H。
则将31000H字单元的内容送入BX。
指令也可以指定段超越前缀:
如MOVBX,DS:
[BP]
MOVAX,ES:
[SI]
五、寄存器相对寻址(RegisterRelativeAddressing)---也称基址寻址(Basedaddressing)
与寄存器间接寻址方式相比,有效地址还要加上一个位移量。
同样,当指令中指定的寄存器是BX、SI、DI则段寄存器默认在DS中,若指令中指定的寄存器是BP则段寄存器默认在SS中。
段超越则另表明。
例:
MOVBX,COUNT[SI]也可写成MOVBX,[COUNT+SI]
若(DS)=3000H[SI]=2000HCount=4000H(36000H)=5678H
例:
MOVAX,Count[BP]
SS5000×10H
BP2000
Count4000
56000
又例:
MOVDH,ES:
ARRAY[SI]则物理地址=ES×10H+SI+ARRAY字节操作
六、基址变址寻址(BasedIndexedAddressing)
操作数的有效地址EA=[BX]或[BP]+[SI]或[DI]+count
指定DS指定SS
段寄存器根据基地址[BX][BP]而不同,有段超越则应另表明。
●若指令中指定的基地址寄存器是BX则操作数默认在数据段中。
物理地址==DS×10H+BX+SI
或物理地址==DS×10H+BX+DI
●若指令中指定的寄存器是BP则操作数默认在堆栈段中。
物理地址==DS×10H+BP+SI
或物理地址==DS×10H+BP+DI
例:
MOVAX,[BX][SI]或MOVAX,[BX+SI]
DS=3000H,BX=1200H,SI=0500H,(31700H)=ABCDH
则物理地址==DS×10H+BX+SI=31700H
七、相对基址变址寻址(RelativeIndexedAddressing)
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上指令中指定的8位或16位位移量之和。
例:
MOVAX,MASK[BX][SI]或MOVAX,[MASK+BX+SI]
或MOVAX,MASK[BX+SI],或MOVAX,200H[BX+SI]
●若指令中指定的基地址寄存器是BX则操作数默认在数据段中。
物理地址==DS×10H+BX+SI+位移量
或物理地址==DS×10H+BX+DI+位移量
●若指令中指定的寄存器是BP则操作数默认在堆栈段中。
物理地址==DS×10H+BP+SI+位移量
或物理地址==DS×10H+BP+DI+位移量
总结:
图3-6是几种寻址方式的汇总。
八、其它
1、串寻址(隐含寻址)
串寻址访问的操作数,是隐含地运用变址寄存器SI和DI
[SI]中源操作数地址,对应DS段。
[DI]中目的操作数地址,对应ES段。
例:
MOVSB
将一个字节从[SI]所确定的单元中→[DI]所确定的单元中,在重复操作中,CPU能自动的调整指针。
2、I/O端口寻址
I/O端口和M编址时统一用M的指令。
若分开编址则用IN、OUT
●直接寻址8位立即数提供了端口号;≤FFH
●间接寻址DX规定了端口号≤64K且>FFH
例:
INAL,A8H
将A8H口的数据读入AL中
例:
INAX,70H,将70H、71H两端口的值读入AX。
70H端口→AL
71H端口→AH
例:
OUT44H,AL;将AL中的1个字节输出到44H端口
例:
OUTDX,AX;将AL中的字节输出到DX所指端口中,且将AH中的字节输出到DX+1所指端口中。
作业课讲布置作业
§3.28086指令的机器码表示方法
机器指令:
机器能识别的二进制指令。
机器指令由操作码域和操作数域部分组成。
8086是变字节指令,一条指令一般由1~6字节组成,加上前缀字节,最长的可为7字节指令。
操作码域由操作码和特定位组成,指令的操作码(opcode)采用二进制代码表示本指令所执行的操作,一般占第一字节,若不够,再占第二字节的3位,其余则表示操作数。
操作数域由1~2个操作数组成。
单操作数:
如INCBX
双操作数:
至少有一个是通过寄存器指出。
典型的MOV指令的编码格式:
15870
100010DWMODREGR/M
操作码
特征位:
特征位用来表示有关信息,简单的指令可省略。
W位——字位(W=1指令对字操作,W=0字节操作)
D位——方向位(D=0寄存器所寻址的是目的操作数,数据从寄存器传出;D=0寄存器所寻址的是源操作数,数据传至寄存器)
※S位——符号扩展位(S=18位数扩展成16位数,即所有高位字节按低位字节的最高有效位作符号扩展)
MOD:
与R/M配合使用
REG:
表示指令所使用的寄存器。
只有一个寄存器时,查表3-1;若有二个寄存器,则由表3-2MOD=11,查出另一个。
(对使用段寄存器的指令,REG占2位,前面补0,表达4个段寄存器)
R/M:
和MOD决定寄存器或存储器名。
例:
MOVSP,BX的机器码
1000101111100011
DWMODREGR/M
SPBX
表3-18086寄存器编码表
REG
W=1(字)
W=0(字节)
100
111
101
110
200
111
101
110
AX
BX
CX
DX
SP
DI
BP
SI
AL
BL
CL
DL
AH
BH
CH
DH
REG
段寄存器
11
21
10
20
CS
DS
ES
SS
表3-2MOD和R/M的编码
MOD
R/M
00
01
10
11
W=0
W=1
000
[BX]+[SI]
[BX]+[SI]+D8
[BX]+[SI]+D16
AL
AX
001
[BX]+[DI]
[BX]+[DI]+D8
[BX]+[DI]+D16
CL
CX
010
[BP]+[SI]
[BP]+[SI]+D8
[BP]+[SI]+D16
DL
DX
011
[BP]+[DI]
[BP]+[DI]+D8
[BP]+[DI]+D16
BL
BX
100
[SI]
[SI]+D8
[SI]+D16
AH
SP
101
[DI]
[DI]+D8
[DI]+D16
CH
BP
110
D16
[BP]+D8
[BP]+D16
DH
SI
111
[BX]
[BX]+D8
[BX]+D16
BH
DI
一、单操作数
操作数是放在M还是R中,由R/M确定。
若是M,如何寻址由MODR/M确定。
见表3-2伪指令,用来规定存储单元的性质
如INCWORDPTR[SI+5CH]寄存器相对寻址(变址寻址)
INCcountdisp[SI]
111111110100010001011100
opcodeWmodeopcoder/mdisp(L)
INC操作数在寄存器中或存储器。
W=1字操作。
Mod=01r/m=100
表3.1查出(SI)+D8存储器方式
物理地址:
DSF0F00
__SIA086
_CountDisp005C
FAFE2
表示FAFE2H和FAFE3H两单元所组成的16位加1。
二、双操作数
如ADD指令就需要2个操作数
例2:
MOVCount[BX][DI],1234H基+变址
将立即数1234H传送到偏移量由BX、DI内容及二字节位移量(设为018AH)之和决定的单元中去。
Wmodr/m8A013412
11000111100000011000…1010000000010011010000010010
操作码
opcode
表3.1BX+DI基址+变址寻址
例1:
ADD[DI],OFH寄存器间接寻址
S符号扩展位,W=1字操作
省去1个字节
将偏移量由DI确定的单元的内容与立即数相加(段为DS)并回送到该单元中。
§3.38086的指令系统
8086的指令共133条,分为6种类型
数据传送指令
算术运算指令
位处理指令
串操作指令
控制转移指令
处理器控制指令
§3.3.1数据传送指令
作用:
将数据、地址传送到寄存器或存储单元及I/O端口中。
具体可分为4种,通用数据传送,输入/输出数据传送,目标地址传送,标志寄存器传送。
一、通用数据传送指令
1.MOV传送指令
格式MOV(指令助记符)OPRD1(目的操作数)OPRD2(源操作数)
作用:
将一个字节或一个字操作数从源传送到目的。
图3-12MOV指令数据传送方向示意图
例:
MOVAL,BL;BL中的8位数据送AL
MOVES,DX;DX中的16位数据送ES
寄间址MOVAX,[BX];
将偏移量在BX中的操作数内容送AX
直接寻址MOVCX,[1000H];将偏移量为1000H(CL)和1001H(CH)两单元内容送CX。
注意事项:
①IP和CS不能作为目的操作数。
②立即数不能作为目的操作数
③不允许两个段寄存器之间直接传送信息。
④不允许在两个存储单元之间直接传送数据。
2.PUSH进栈指令(按字操作)
格式PUSHOPRD(源操作数)
执行操作:
①SP←SP-1高字节操作数入SP所指单元
②SP←SP-1低字节操作数入SP所指单元
原则:
“先进后出”
“后进先出”
因为堆栈只有一个出入口
堆栈的最大容量64K字节
物理地址计算方法同前述。
SS
(+)SP
物理地址
例:
PUSHAX;将AX内容推入堆栈
PUSHDS;将DS内容推入堆栈
PUSH[BX+DI];将偏移量由BX与DI之和的存储单元内容推入堆栈。
源操作数段基址:
数据段DS
目的操作数段基址:
堆栈段SS
3.POP出栈指令(字操作)
格式:
POPOPRD(目的操作数)
执行操作数:
①将SP所指单元内容送入OPRD的低字节
SP←SP+1
②将SP所指单元内容送入OPRD的高字节
SP←SP+1
和入栈操作正好相反,常用来保护数据。
堆栈操作注意事项:
1按字操作
PUSHAH或POPBL均为错误
2入栈时,低位放在低址,高位放在高地址。
出栈时,先弹出低址内容,再弹高址内容,
3CS的值可入栈,但不能弹出到CS。
4保存数据入栈顺序和恢复数据出栈次序相反。
如:
PUSHAX
PUSHBX
PUSHDI
恢复弹出时应写
POPDI
POPBX
POPAX
4.XCHG(Exchange)交换指令,字或字节操作
格式:
XCHGOPRD1,OPRD2
执行操作:
OPRD1OPRD2
例;XCHGBX,[BP+SI]
注意:
①段寄存器和IP不能作为操作数
②两个存储单元之间不能直接交换,也就是说至少一个操作数为寄存器操作数。
5.XLAT表转换指令:
将一个字节从一种代码转换成另一种代码。
---自己看
XLAT(Translate)翻译,转换
格式:
XLATOPRD或XLAT
执行的操作:
AL←(BX+AL)
完成字节的查表转换,BX指向表的首址AL为表中某一项与表格首地址之间的位移量。
XLAT指令非常方便于一些不规则代码的转换。
如通信系统中用到这样的代码,每个码由二个1、三个0组成,这种代码比较容易纠错和检错。
1—110001—000112—001013—001104—010015—01010
6—011007—100018—100109—10100它们之间无规律
偏移量
做法:
在内存中存放代码表(如从1000H开始)设DS=0F000H
若要将5转换为通信码F1000H
则MOVAL,5;偏移量送AL
MOVBX,1000H;1000H为表首址送BX
XLAT:
查表得AL=01010
执行完毕后,AL中为00001010
二、输入/输出数据传送指令
8086只有AL和AX与输入/输出端口之间进行数据传送。
端口地址直接地址:
8位立即数口地址≤255
间接地址:
规定DX寄存器最多64K个端口
1.IN(input)输入指令
INAL,PORT;将PORT口的字节内容读入AL
INAX,PORT;将PORT口的字节读入AL,再将PORT+1口的字节读入AH。
INAL,DX;从DX所指的端口中读取1个字节。
INAX,DX;(DX)→AL
(DX+1)→AH
2.OUT指令
同IN指令,只是方向相反。
OUTPORT,AL;字节AL→PORT
OUTPORT,AX;字AL→PORT
AH→PORT+1
OUTDX,AL;(字节)AL→(DX)
OUTDX,AX;(字)AL→(DX)
AH→(DX+1)
三、目标地址传送指令
1.LEA有效地址送寄存器指令(字操作)
格式:
LEA寄存器名,源操作数OPRD
(存储器操作数)
把源操作数地址偏移量传送到目的操作数(寄存器)
例:
LEABX,BUFR;把变量BUFR的地址偏移量部分送BX
LEAAX,[2728H];将偏移量2728H送AX段址有另外指令LDS或LES
例:
设SI=1000H,DS=5000H,(51000H)=1234H
则LEABX,[SI];BX=1000H
MOVBX,[SI];BX=1234H
3.LDS指针装入寄存器和DS指令
格式:
LDS寄存器名,存贮器操作数
作用:
将存贮器中连续四个字节的地址指针送至寄存器。
默认DS段在后两个字节。
例:
设DS=1200H,(12450H)=F346H,(12452H)=0A90H
LDSSI,[450H]
将450H和451H中的地址偏移量送入DI,SI=F346H
将452H和453H中的段基址送入DS,DS=0A90H
4.LES指针装入寄存器和ES指令,只是DS数据段变为ES段,其余与LDS同理。
四、标志寄存器传送指令
读取标志指令
1.LAHF即标志寄存器FR低字节送AH指令
格式:
LAHF(LoadAHwithFlags)
操作:
(AH)←Flag的低字节
将FR中的SF、ZF、AF、PF和CF分别送至AH寄存器的相应位。
OF
DF
IF
TF
SF
ZF
AF
PF
CF
2.SAHF与LAHF相反(设置标志指令)
格式:
SAHF
操作:
Flag的低字节←(AH)
为什么只对Flag的低字节操作,为了和8080/80858位CPU兼容。
它们只有这5个标志位。
3.PUSHF标志进栈指令
格式:
PUSHF
执行操作:
SP←SP-2
(SP+1,SP)←Flag
作用:
把整个标志寄存器入栈保存。
4.POPF标志出栈指令
格式:
POPF
执行操作:
Flag←(SP+1,SP)
SP←SP+2
§3.3.2算术运算指令
算术运算:
加、减、乘、除
字节(8位)字(16位)
带符号(补码),不带符号
一、加法
有5条指令
1.ADD(Addition)OPRD1,OPRD2;B/W,OPRD1←OPRD1+OPRD2
此指令不带进位
例:
ADDAX,[BX+2000H]基址寻址DS段
2.ADCOPRD1,OPRD2;B/W,OPRD1←OPRD1+OPRD2+CF(AdditionwithCarry)
带进位的加法指令,与ADD相比,只是要把CF的现行值加上去。
3.INCOPRD;B/W,OPRD←OPRD+1(INCrement)
增量指令,主要用于循环程序中修改地址指针和循环次数。
与用ADD指令加1相比,本指令所需字节较少,但不影响CF标志。
例:
INCBL;BL寄存器中的内容加1
INCWORDPTR[BX];内存字节单元内容加1
4.DAA;B(DecimalAdjustforAddition)组合的BCD码十进制数加法调整指令。
BCD码—用二进制码表示的十进制数,每四位为1组。
●组合的BCD码:
1个字节表示2位BCD码,又可称为压缩十进制数。
●非组合的BCD码(或ASCII码十进制数):
1个字节的低四位来表示1位BCD码即非压缩十进制。
DAA功能:
对在AL中的两个组合的BCD码相加后的结果进行校正,以产生正确的组合的BCD码相加的和。
方法:
紧跟在加法指令之后
例:
28+35=63
00101000
(+)00110101
01011101
+110
0110001163BCD
调整是由系统自动进行。
5.AAA;BASCIIAdjustforAddition
ASCII码十进制数加法调整指令
非组合BCD码
方法:
紧跟在加法指令之后
二、减法
共7条指令
1.SUB(Subtraction)OPRD1,OPRD2;B/W,OPRD1←OPRD1-OPRD2
本指令不考虑借位。
例SUBBX,CX
SUBAL,20
2.SBBOPRD1,OPRD2;B/W,OPRD1←OPRD1-OPRD2-CF
SubtractwithBorrow
CF的值是两数相减时,向高位产生的借位。
其余同SUB。
主要用于多字节减法中。
3.DEC(Decrement)OPRD;B/W,OPRD←OPRD-1※
寄存器或存储器操作数
减量指令,与INC相反
4.NEG(Negate)OPRD;B/W,OPRD←0-OPRD
取补指令。
5.CMPOPRD1,OPRD2;B/W,OPRD1-OPRD2※
完成两个数加减,并不送回任何操作数,只是结果反映在标志位上。
操作数同SBB。
往往本指令后紧跟一条转移指令。
(检查标志位状态)。
6.DAS;B(DecimalAdjustforSubtraction)
组合的BCD码减法调整。
应将结果存放在累加器AL中。
7.AAS;B(ASCIIAdjustforSubtraction)
ASCII码十进制数减法调整指令,应将结果存放在累加器AL中。
非组合的BCD码。
三、乘法:
3条指令。
若两个8位数相乘,必有一个放在AL中。
得到16位乘积。
若两个16位数相乘,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 8086 指令系统