微机原理与接口技术指令系统整理.docx
《微机原理与接口技术指令系统整理.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术指令系统整理.docx(40页珍藏版)》请在冰豆网上搜索。
微机原理与接口技术指令系统整理
18086CPU指旨令2
1.1.编写说明2
2指令索引表2
2.1.8086CPU指指令2
2.2.伪操作指令14
18086CPU旨令
1.1.编写说明
对8086CPU勺指令逐条介绍
2指令索引表
2.1.8086CPU旨令
序号
指令分类
指令
说明
1
数据传送指令
MOVDST,SRC
为双操作数指令,两个操作数中必须有一个是寄存器.
1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器).
2.立即数不能直接送段寄存器
3.不允许在两个存储单元直接传送数据
4.不允许在两个段寄存器间直接传送信息
2
数据传送指令
PUSHSRC
堆栈操作是以"后进先出"的方式进行数据操作.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.
入栈时咼位字节先入栈,低位字节后入栈.
3
数据传送指令
POPDST
出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器.
执行POPSS指令后,堆栈区在存储区的位置要改变.执行POPSP指令后,栈顶的位置要改变.
4
数据传送指令
XCHGOPR1,OPR2
执行操作:
Tmp=OPR1OPR1=OPR2OPR2=Tmp
1.必须有一个操作数是在寄存器中
2.不能与段寄存器交换数据
3.存储器与存储器之间不能交换数据.
5
数据传送指令
XLAT(OPR可选)
换码指令:
把一种代码转换为另一种代码.
执行操作:
AL=(BX+AL)
指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中容则是所要转换的代码.
6
数据传送指令
LEAREG,SRC
指令把源操作数SRC的有效地址送到指定的寄存器
中.
执行操作:
REG=EAsrc
注:
SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器
MO出X,OFFSEOPER_ON等价于LEABX,OPER_ON
MOVSP,[BX]//将BX间接寻址的相继的二个存储单元的容送入SP中
LEASP,[BX]//将BX的容作为存储器有效地址送入SP中
7
数据传送指令
LDSREG,SRC
//常指定SI寄存器。
执行操作:
REG=(SRC),DS=(SRC+2)〃将SRC旨出的前二个存储单兀的容送入指令中指定的寄存器中,后
二个存储单元送入DS段寄存器中。
8
数据传送指令
LESREG,SRC
//常指定DI寄存器
执行操作:
REG=(SRC),ES=(SRC+2)//与LDS大致相同,不同之处是将ES代替DS而已.
9
数据传送指令
LAHF
LAHF(LoadAHwithFlags)标志位送AH指令
//将PSW寄存器中的低8位的状态标志(条件码)送入
AH的相应位,SF送D7位,ZF送D6位……执行操作:
AH=PSW的低位字节。
10
数据传送指令
SAHF
SAHF(StoreAHintoFlags)AH送标志寄存器指
令
//将AH寄存器的相应位送到PSW寄存器的低8位的相应位,AH的D7位送SF,D6位送ZF……执行操作:
PSW的低位字节=AH
11
数据传送指令
PUSHF
PUSHF(PUSHtheFlags)标志进栈指令
//将标志寄存器的值压入堆栈顶部,同时栈指针SP值减2
执行操作:
SP=SP-1,(SP)=PSW的高8位,SP=SP-1,(SP)=PSW勺低8位
12
数据传送指令
POPF
POPF(POPtheFlags)标志出栈指令
//与PUSH相反,从堆栈的顶部弹出两个字节送到PSW寄存器中,同时堆栈指针值加2
执行操作:
PSW低8位=(SP),SP=SP+1,PSW高8位=(SP),SP=SP+1
13
数据传送指令
IN
输入输出指令(IN,OUT)
只限于使用累加器AX或AL与外部设备的端口传送信息.
(INput)输入指令:
信息从I/O通过累加器传送到
CPU
INAL,PORT//直接的字节输入,PORT是外设端口编号(即端口地址),只能取00H~0FFH共256个端口地址.
INAX,PORT//直接的字输入,AX存储连续两个端口地址PORT+1,PORT
INAL,DX//间接的字节输入,端口地址围可通过DX设置为0000H~0FFFFH共65536个端口地址
INAX,DX//间接的字输入
14
数据传送指令
OUT
(OUTput)输出指令:
信息从CPU通过累加器传送到I/O
OUTPORT,AL//直接的字节输出,PORT规定与IN指令相同.
OUTPORT,AX
OUTDX,AL//间接的字节输出
OUTDX,AX
MOVAL,05HOUT27H,AL//将字节05H传送到地址
27H的端口
15
算术运算指令
ADD(ADD)
ADDDST,SRC//Byte/Word
执行操作:
dst=dst+src
1.两个存储器操作数不能通过ADD旨令直接相加,即DST和SRC必须有一个是通用寄存器操作数.
2.段寄存器不能作为SRC和DST.
3.影响标志位AuxiliaryCrrayFlag,CarryFlag,
OverflowFlag,ParityFlag,SignFlag和Zero
Flag,如下所示:
CF根据最高有效位是否有进(借)位设置的:
有进(借)位时CF=1,无进(借)位时CF=0.
OF根据操作数的符号及其变化来设置的:
若两个操作数的符号相同,而结果的符号与之相反时0F=1,否则为0.
ZF根据结果来设置:
不等于0时ZF=0,等于0时
ZF=1
SF根据结果的最高位来设置:
最高位为0,则SF=0.AF根据相加时D3是否向D4进(借)位来设置:
有进(借)位时AF=1,无进(借)位时AF=0
PF根据结果的1的个数时否为奇数来设置:
1的个数为奇数时PF=0,为偶数时PF=1
16
算术运算指令
ADCDST,SRC
ADC(ADdwithCarry)带进位加法指令
ADCDST,SRC//Byte/Word
执行操作:
dst=dst+src+CF//与ADD不同之处是还要加上进位标志位的值.
17
算术运算指令
INCOPR
INC(INCreament)加1指令
INCOPR//Byte/Word
执行操作:
OPR=OPR+1
1.OPR可以是寄存器和存储器操作数,但不能是立即数和段寄存器
2.影响标志位OF,SF,ZF,PF和AF,不影响CF.
18
算术运算指令
SUBDST,SRC
减法运算指令
SUB(SUBtract)不带借位的减法指令
SUBDST,SRC//Byte/Word执行操作:
dst=dst-src
1.DST和SRC寻址方式及规定与ADD相同.
2.影响全部标志位.(判断标志位参见ADD)
19
算术运算指令
SBBDST,SRC
SBB(SuBtractwithBorrow)带借位减法指令
SBBDST,SRC//Byte/Word执行操作:
dst=dst-src-CF
20
算术运算指令
DECOPR
DEC(DECrement)减1指令
DECOPR/Byte/Word
执行操作:
OPR=OPR-1//除CF标志位,其余标志位都受影响.
21
算术运算指令
NEG(NEGate)
求补指令
NEGOPR
执行操作:
opr=0-opr//将操作数按位求反后末位加1.
22
算术运算指令
CMP(CoMPare)
比较指令
CMPOPR1,OPR2
执行操作:
OPR1OPR27与SUB旨令一样执行运算,但不保存结果•
比情况
无符号数
有符号数
A=B
ZF=1
ZF=1
A>B
CF=0&&ZF=0
SFAOF=0&&ZF=0
A
CF=1&&ZF=0
SFAOF=1&&ZF=0
A>=B
CF=0||ZF=1
SFAOF=0||ZF=1
A<=B
CF=1||ZF=1
SFAOF=1||ZF=1
23
算术运算指令
MUL
乘法运算指令,无符号数乘法指令
MULSRC77Byte7Word.
执行操作:
Byte=>AX=AL*src77字节运算时目的操作数用AL,乘积放在AX中
Word=>DX=AX*src77字运算时目的操作数用AX,DX存放乘积的咼位字,AX放乘积的低位字
1.目的数必须是累加器AX或AL,指令中不需写出
2.源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数,而绝对不允许是立即数或段寄存器.
24
算术运算指令
IMUL
IMUL(signedMULtiple)有符号数乘法指令
IMULSRC77与MUL指令相同,但必须是带符号数
25
算术运算指令
DIV
除法运算指令
DIVSRC77Byte7Word其中:
SRC的规定同乘法指令MUL
执行操作:
Byte=>AX7src77字节运算时目的操作数在AX中,结果的商在AL中,余数中AH中
Word=>DX,AX7src77字运算时目的操作数在DX咼位字和AX低位字中,结果的商在AX中,余数在DX中存储器操作数必须指明数据类型:
BYTEPTRsrc或
WORDPTRsrc
26
算术运算指令
IDIV
IDIV(sIgnedDIVied)有符号数除法指令
IDIVSRC77Byte7Word与DIV指令相同,但必须是带符号数
27
算术运算指令
CBW
转换指令
CBW(ConvertBytetoWord)字节转换为字指令
CBW
执行操作:
AL中的符号位(D7)扩展到8位AH中,若AL中的D7=0,贝UAH=OOH若AL中的D7=1,贝UAH=FFH,
28
算术运算指令
CWD
CWD(ConvertWordtoDoubleword)字转换为双字指令
CWD
执行操作:
AX中的符号位(D15)扩展到16位DX中,若AX中的D15=0贝UDX=0000H若AX中的D15=1,则DX=FFFFH.
29
算术运算指令
DAA
十进制调整指令
当计算机进行计算时,必须先把十进制数转换为二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出.
在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD(BinaryCodedDecimal).
BCD3又称8421码,在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示.
压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串.
非压缩的BCD码以8位为一组表示一个十进制数,8位中的低4位表示8421的BCD码,而高4位则没有意义.
压缩的BCD码调整指令
DAA(DecimalAdjustforAddition)加法的十进制
调整指令
DAA
执行操作:
执行之前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中.
30
算术运算指令
DAS
DAS(DecimalAdjustforSubtraction)减法的十
进制调整指令
DAS
执行操作:
执行之前必须先执行SUB或SBB指令,减法指令必须把两个压缩的BCD码相减,并氢结果存放在AL寄存器中.
31
算术运算指令
AAA
非压缩的BCD码调整指令
AAA(ASCIIAdjustforAddition)加法的ASCII调
整指令
AAA
执行操作:
执行之前必须先执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中.
32
算术运
AAS
AAS(ASCIIAdjustforSubtraction)减法的ASCII
算指令
调整指令
AAS
执行操作:
执行之前必须先执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并氢结果存放在AL寄存器中.
33
串操作
指令
MOVS
MOVS(MOVeString)串传送指令
MOVSE/字节串传送DF=QSI=SI+1,DI=DI
+1;DF=1,SI=SI-1,DI=DI-1
MOVSW字串传送DF=0SI=SI+2,DI=DI+
2;DF=1,SI=SI-2,DI=DI-2执行操作:
[DI]=[SI],将位于DS段的由SI所指
出的存储单元的字节或字传送到位于ES段的由DI所指出的存储单元,再修改SI和DI,从而指向下一个元素•
在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值.
MOVSDST,SRC//同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数•
1.目的串必须在附加段中,即必须是ES:
[DI]
2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI].
34
串操作
指令
STOS
STOS(STOreintoString)存入串指令
STOSDST
STOSB/存放字节串(DI)=AL
STOSW(/存放字串(DI)=AX
执行品作:
把AL或AX中的谷存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的容.
1.在执行该指令之前,必须把要存入的数据预先存入AX或AL中,必须预置DI的初值.
2.DI所指向的存储单元只能在附加段中,即必须是
ES:
[DI]
35
串操作
指令
LODS
LODS(LOaDfromString)从串取指令
LODSSRC
LODSB/从字节串取AL=(SI)
LODSW(/从字串取AX=(SI±1)(SI)
执行操作:
把由SI指定的数据段中字节或字单兀的容送入AL或AX中,并根据DF值及数据类型修改SI的容•
1.在执行该指令之前,要取的数据必须在存储器中预先定义(用DB或DW)必须预置SI的初值.
2.源串允许使用段超越前缀来改变数据存储的段区.
36
串操作
REP
REP(REPeat)重复操作前缀
指令
REPStringPrimitive//其中:
StringPrimitive
可为MOVS,STO或LODS指令
执行操作:
使REP前缀后的串指令重复执行,每执行一次CX=CX-1直至CX=0时退出REP.
37
串操作
指令
CLD
方向标志设置
CLD(CLearDirectionflag)清除方向标志指令
执行操作:
令DF=0,其后[SI],[DI]执行增量操作
STD(SeTDirectionflag)设置方向标志指令
38
串操作
指令
STD
STD
执行操作:
令DF=1,其后[SI],[DI]执行减量操作
39
串操作
指令
CMPS
CMPS(CoMPareString)串比较指令
CMPSSRC,DST
CMPSB/字节串比较(SI)-(DI)
CMPSW字串比较(SI+1)(SI)-(DI+1)(DI)
执行操作:
把由SI指向的数据段中的一个字节或字与由DI指向的附加段中的一个字节或字相减,不保留结果,只根据结果置标志位•
40
串操作
指令
SCAS
SCAS(SCAnString)串扫描指令
SCASDST
SCASB
SCASW
执行操作:
把AX或AL的容与由DI指向的在附加段中的一个字节或字相减,不保留结果,根据结果置标志位.
41
逻辑运算指令和移位指令
AND(and)
逻辑与指令AND,OR,XOR和TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同•
NOT是单字节操作指令,不允许使用立即数.逻辑运算均是按位进行操作,真值表如下:
A:
逻辑运算指令
AND(and)逻辑与指令
ANDDST,SRC//Byte/Word执行操作:
dst=dst&src
1.AND指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位.
2.AND指令典型用法A:
用于屏蔽某些位,即使某些位为0.
屏蔽AL的高4位:
即将高4位和0000B相与,低4位和1111B相与
MOVAL,39H〃AL=00111001B[39H]
ADDAL,0FH//AL=00001001B[09H]即00111001B39H]&00001111B[0FH]=00001001B[09H]
3.AND指令典型用法B:
取出某一位的值(见TEST
42
逻辑运算指令和移位指令
OR
OR(or)逻辑或指令
ORDST,SRC//Byte/Word执行操作:
dst=dst|src
1.OR指令执行后,将使CF=0,OF=O,AF位无定义,指令执行结果影响SF,ZF和PF标志位.
2.常用于将某些位置1.
将AL的第5位置1:
MOVAL,4AH//AL=01001010B[4AH]
ORAL,10H//AL=01011010B[5AH]即0100
1010H4AH]|00010000B[10H]=01011010B[5AH]
43
逻辑运算指令和移位指令
XOR
XOR(exclusiveOR)逻辑异或指令
XORDST,SRC//Byte/Word执行操作:
dst=dstAsrc
1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志•
2.XOR指令使某些位维持不变则与'0'相异或,若要使某些位取反则与'1'相异或.
将AL的咼4位维持不变,低4位取反:
MOVAL,B8H//AL=10111000B[B8H]
XORAL,0FH//AL=10110111B[B7H]即10111000BB8H]a00001111[0FH]=10110111B[B7H]测试某一个操作数是否与另一确定操作数相等:
XORAX,042EH
JZ....//如果AX==042EH,则ZF=TRUE
(1),执行
JZ...
44
逻辑运算指令和移位指令
NOT
NOTOPR/Byte/Word
执行操作:
opr=~opr//~01100101[65H]=10011010[9AH]
1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.
2.NOT指令不影响任何标志位。
将AL各位取反:
MOVAL,65H//AL=01100101B[65H]
NOTAL//AL=10011010B[9AH]即~01100101H65H]=10011010B[9AH]
45
逻辑运算指令和移位指令
TEST
TEST(test)指令
TESTOPR1,OPR2//Byte/Word执行操作:
opr1&opr2
1.两个操作数相与的结果不保存,结果影响标志位
PF,SF和ZF,使CF=0,OF=0,而AF位无定义.
2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足.只要令用来测
试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假.
检测某位是否为1:
令用来测试的操作数对应检测位为1,其余位为
O,TEST指令后,若该位为1则JNZ…
TESTAL,000000001B//测试AL最低位是否为1:
:
令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
JNZTHER//最低位若为1,贝UZF=FALSE(0),执行JNZTHER,否则执行下一条指令•
或者:
先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则
JZ...
MOVDL,AL//将AL传送到DL,主要是不要影响AL的值•以下测试AL的b2位是否为1
NOTDL//先对操作数求反
TEST00000100B//令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
JZTHER//若AL的b2位为1,贝UZF=TRUE
(1),执行
JZTHER
46
逻辑运算指令和移位指令
SHL
B:
移位指令[所有的移位指令都影响标志位CFOF
PF、SF和ZF.AF无定义.]
非循环逻辑移位:
把操作数看成无符数来进行移位•
SHL(SHiftlogicalLeft)逻辑左移指令
SHLOPR,CNT//Byte/Word
执行操作:
使OPF左移CNT位,并使最低CNT位为全0.
1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数•
2.移位次数由CNT决定.每次将OPR勺最高位移出并移到CF,最低位补0.
MOVCL,7//若移位多次,先预置移位次数CL
SHLDX,CL//CNT可取1或CL寄存器操作数
47
逻辑运算指令和移位指令
SHR
SHR(SHiftlogicalRight)逻辑右移指令
SHROPR,CNT//Byte/Word
同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.
48
逻辑运算指令和移位指令
SAL
非循环算术移位:
将操作数看成有符号数来进行移位•
SAL(ShiftArithmeticLeft)算术左移指令
SALOPR,CNT//Byte/Word
SAL指令与SHL指令完全相同
49
逻辑运算指令
SAR
SAR(ShiftArithmeticRight)算术右移指令
SAROPR,CNT//