版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二节8086/8088的指令系统数据传送指令算术运算指令逻辑运算、移位、循环指令串操作指令控制转移指令处理器控制指令指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等学习指令的注意事项
数据传送指令可以实现CPU的内部寄存器之间,CPU和存储器之间,CPU和I/O端口之间的数据传送。这类指令均含两个操作数,而且除SAHF指令和POPF指令外,其它的指令均不影响状态标志位中。3.2.1数据传送类指令通用数据传送指令(DataTransfer)1.基本传送指令(MOV)
MOVdst,src;(src)←(dst)src:通用寄存器、段寄存器、存储器操作数、立即数;dst:通用寄存器、段寄存器、存储器操作数。
功能:将源操作数src复制到目的操作数dst中,结果目的操作数的内容等于源操作数的内容,源操作数src的内容不变。1)寄存器之间传送
MOVAL,BL;通用寄存器之间MOVAX,DX;MOVAX,ES;通用寄存其与段寄存器MOVDS,AX;3)立即数送寄存器或存储器
MOVAL,0FH;立即数送通用寄存MOV[BP+SI],2300H;立即数送存储器2)寄存器和存储器之间传送
MOVAL,[BX];通用寄存器和存储器之间MOV[BX+DI],DX;MOV[BX],ES;段寄存器和存储器之间MOVDS,50H[BP+SI];(1)dst与src必须类型匹配,即同时是字节或字类型;(2)两个操作数不允许同时为存储器操作数;(3)不允许使用CS段寄存器作目的操作数;(4)两个操作数不允许同时为段寄存器;(5)不允许使用立即数作目的操作数;(6)不允许直接向段寄存器中传送立即数。
使用MOV指令应注意以下几点:例:错误的MOV指令如下所示:MOVBL,AX;类型不匹配MOVDS,1000H;不允许立即数送段寄存器MOV[BX],[SI];不允许内存操作数之间传送MOVES,CS;不允许段寄存器之间传送MOVCS,AX;CS不能作为目的操作数
存储单元
段寄存器DS、ES、SS
通用寄存器
立即数8位、16位
段寄存器CS(MOV)数据传送示意图堆栈是一个按“后进先出”原则操作的主存区域(暂存数据与地址),堆栈操作必须在SS段寄存器指向的堆栈中进行;堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定。堆栈只有两种基本操作:进栈和出栈。对应两条指令:
PUSHsrc
POPdst2.堆栈操作指令
PUSHPOP堆栈作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。
CPU通用寄存器入/出栈(PUSH/POPreg)
例如:PUSHAXPOPBX
段寄存器入/出栈(PUSH/POPsreg)
例如:PUSHCSPOPDS(CS除外)存储器单元入/出栈(PUSH/POPmem)
例如:PUSH[BX+DI]POP[2000H]
入栈和出栈指令都有3种格式:(1)入栈指令PUSH指令操作:
①使堆栈指针SP减2;
②将一个字操作数存入堆栈顶部:((SP))←低8位数,((SP+1))←高8位数例PUSHAX
若已知(AX)=1234H,(SS)=1050H,(SP)=000EH则指令操作为:(SP)=(SP)-2=000CH;栈顶的PA=(SS)×16+(SP)=1050CH②
(AX)的内容1234H存入堆栈,指令操作后,堆栈情况如图:1050EH1050DH(SP)→1050CH12H34H原栈顶现栈顶(2)出栈指令POP指令操作:
①把栈顶的一个字弹出送至指定的目的操作数;
②然后堆栈指针SP加2。如在上例完成后,执行POPDS指令:1050CH1050DH(SP)→1050EH12H34H1234
(DS)出栈后的SP和SS的值SP=000EHSS=1050HSS=1050H(不变)通过PUSH和POP命令可以实现数据的传送,但要注意堆栈先进后出的原则。8086通过赋值SS和SP建立堆栈建栈
MOVAX,1050HMOVSS,AXMOVSP,000EH
1050EH
10500H初始栈顶SP=000EHSS=1050H堆栈起地址建栈后SP和SS的值SP=000EHSS=1050H高低堆栈的特点与注意问题①堆栈操作指令中,目的操作数是隐含的,这个操作数就是(SP)指示的栈顶存储单元。
②8086堆栈操作都是字操作,而不允许对字节操作,例如PUSHAL是错误的。③每执行一条入栈指令,(SP)自动减2,入栈时,高位数先入栈;执行弹出时,正好相反,每弹出一个字,(SP)自动加2。④CS寄存器可入栈,但不能随意弹出一个数据到CS。⑤在使用堆栈操作保存多个寄存器内容和恢复多个寄存器时,要按“先进后出”原则来组织入栈和出栈的顺序。
⑥堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据,如:MOVAX,[BP]。指令格式:XCHGoprd1,oprd2;指令功能:交换oprd1与oprd2的内容3.交换指令XCHG(Exchange)寄存器与寄存器之间交换数据寄存器与存储器之间交换数据。例如:
XCHGBL,CL;(BL)与(CL)间进行字节交换
XCHG(BX+SI),DX;(DX)与采用基址变址寻址方式寻址的字地址内容进行字交换(1)不能在存储器与存储器之间对换数据;(2)任一个操作数都不能是段寄存器,也不能使用立即数。(3)两操作数类型必须一致。
指令格式:XLAT;AL←((BX)+(AL))指令功能:BX指定的内存表格的首地址、AL指定的序号处一个字节的表数据取出赋给AL查表范围:255个字节;以BX为表基地址,则表存放在数据段,以DS为段基址;XLAT指令有两种格式——带或不带表首地址。4.换码指令(查表指令)例求数字0~9对应的7段显示代码:方法:先建立表格如图示,并将表首地址送BX中。取待查表项于AL中,再用查表指令求得对应的7段显示代码。程序段如下:TABLEDB40H,79H,24H,30H,19HDB12H,02H,78H,00H,18HMOVBX,TABLEMOVAL,6XLATTABLETABLE40792430191202780018地址传送指令1.取有效地址指令LEA
(LoadEffectiveAddres)格式:LEAdst,src;功能:将存储器操作数SRC的有效地址送至指定的16位通用寄存器。例如:
LEASP,[0502H];执行后,使堆栈指针(SP)=0502HLEABX,[BP+SI];执行后,BX中为(BP)+(SI)的值地址传送指令是用来对地址进行传送。这类指令传送到16位目标寄存器中的是存储器操作数的有效地址EA。LEA指令与MOV指令的区别:LEASI,BUFF指令是将标号BUFF的偏移地址送入寄存器中;MOVSI,BUFF指令是将标号BUFF所指存储单元的内容送入SI。LEASI,BUFF;执行后:(SI)=0002HMOVSI,BUFF;执行后:(SI)=0048HBUFF=若(DS)=2000H,BUFF=02H,存储区内容如图,则:0120002H4800FEFF20003H20004H20005H20001H20000H2.双字地址指针送DS和寄存器指令格式:LDSdst,src;功能:将源操作数src指定的4个连续字节单元内容(地址指针)分别送入指令指定的寄存器dst及DS中。其中:低16位送到dst,高16位送到DS。3.双字地址指针送ES和寄存器指令格式:LESdst,src;功能:将源操作数指src定的4个连续字节单元内容(地址指针)分别送入指令指定的寄存器dst及ES中。其中:低16位送到dst,高16位送到ES。使用LDS和LES指令时应注意:(1)指定的寄存器dst,不能是段寄存器;(2)src一定是存储器操作数。例:若已知(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H57H13H68H24HC2480HC2481HC2482HC2483HLDSSI,[2480]13572468SIDSLDSSI,[2480]状态标志传送指令通过这类指令读出当前标志寄存器中各状态位的内容,也可以对标志寄存器的状态设置新的值。这类指令共有4条,均为单字节指令,源操作数和目的操作数都隐含在操作码中。指令格式:1.LAHF;(AH)←(F的低8位)2.SAHF;(F的低8位)←(AH)3.PUSHF;(SP)←(SP)-2,((SP)+1,(SP))←(F)4.POPF;(F)←((SP)+1,(SP)),(SP)←(SP)+2OF1115DF10IF9TF8SF7ZF65AF43PF21CF0FLAGS说明:
①LAHF/SAHF指令是寄存器AH与标志寄存器F的低字节之间完成的字节型数据传送。
②PUSHF/POPF指令是标志寄存器F与堆栈间进行的字型数据传送。
③指令SAHF/POPF将影响标志位。例输入输出指令1)、直接寻址
INAL,nOUTn,ALINAX,NOUTN,AX寻址空间为:0~255字节INAL,20HINAX,30HOUT46H,ALOUT80H,AX例2)、间接寻址
INAL,DXOUTDX,ALINAX,DXOUTDX,AX寻址空间为:0000H~FFFFHMOVDX,1000HINAL,DX
INAX,DXOUTDX,AL§数据传送类指令练习指出下列指令中的非法指令?
MOVBX,AL(2)MOVBH,ALMOV100,CL(4)MOVCL,100MOVSS,2400H(6)XCHGAH,ALMOVAL,AL(8)XCHG200,ALOUT21H,AL(10)OUT21H,AH(11)OUT260H,AL(12)MOV[BX],BX(13)MOV[AX],CX(14)MOV[BX],BL
(1)、(3)、(5)、(7)、(8)、(10)、(11)、(13)为非法指令算术运算类指令用来执行二进制的算术运算:加、减、乘、除。算术运算指令的特点有:1)在加、减、乘、除基本运算指令中,除±1指令外,都具有两个操作数;2)这类指令执行后,除±1指令不影响CF标志外,对CF,OF,ZF,SF,PF和AF等6位标志均可产生影响,3-2-2算术运算指令加法运算指令1.加法指令(ADD)指令格式:ADD
dst,src
;dst←dst+src标志寄存器:影响AF、CF、PF、OF、ZF、SF目的操作数:通用寄存器、存储器;
源操作数:通用寄存器、存储器、立即数;操作数类型:字或字节注意点:两操作数必须类型一致;两操作数不能同时为存储器操作数。
例:
ADDAX,0F0F0H,设指令执行前(AX)=5463H;
(AX)=0101010001100011+、1111000011110000[1]0100010101010011→AX
进位执行后,结果(AX)=4553H,且CF=1,ZF=0,SF=0,OF=02.带进位加法指令(AddwithCarry
)指令格式:ADCdst,src
标志寄存器:影响OF、CF、SF、ZF、AF、PF;
目的操作数:通用寄存器、存储器;源操作数:通用寄存器、存储器、立即数;操作数类型:字或字节用法:
多字节数相加例:有两个4字节无符号数放在2000H和3000H单元中,低位在前,高位在后,将两个数相加,结果放2000H开始的单元中。
10008432H+20007F00H=?1).算法分析:1).可以将两个4字节无符号数相加看成2个字相加;2).两个数的低位字相加后,将可能产生进位CF;3).高位字相加,应再加上进位位;
2000H3000H32840010007F0020SIDI2).程序:
CLC ;清进位MOVSI,2000H ;取第一个数的首地址MOVAX,[SI] ;第一个数的低16位送到AXMOVDI,3000H ;取第二个字的首地址ADDAX,[DI] ;第一个数和第二个数相加MOV[SI],AX ;送低16位结果倒2000H单元MOVAX,[SI+2] ;第二个数的高16位送AXADCAX,[DI+2] ;高16位数据相加MOV[SI+2],AX3.加1指令
INC(Increment)指令格式:INCdst指令功能:dst←dst+1标志寄存器:影响OF、SF、ZF、AF、PF;
操作数:8位/16位通用寄存器或存储器;INCCX;将CX的内容加1后再送回CX中。INCBYTEPTR[BX+100H];将(BX)+100H所指的单元内容加1后,送回此单元。注意:指令不影响CF标志,当用INC指令进行循环计数,试图以判断CF=1结束循环,是达不到目的的,而且还会导致程序运行进入死循环1.减法指令(
Subtract
)指令格式:SUB
dst,src
;dst←dst+src标志寄存器:影响AF、CF、PF、OF、ZF、SF目的操作数:通用寄存器、存储器;
源操作数:通用寄存器、存储器、立即数;注意点:两操作数必须类型一致;两操作数不能同时为存储器操作数。
减法类指令SUBAX,BX;AX内容减去BX中的内容,结果在AX中SUBSI,[DI十100H];SI内容减法(DI)+100H和(DI)+101H所指的两单元内容,结果在SI中;例:SUBWORDPTR[DI],1000H;(DI)所指的字单元;中的16位数减去立即数1000H,结果在字单元中SUB[BP+2],CL;将SS段中的(BP)+2所指的单元;内容,减去CL内容,结果在堆栈的该单元中。SUBSI,SI
;SI=0
;OF=0,SF=0,ZF=1,PF=1,CF=0
;寄存器自减清零2.带借位的减法指令(SubtractwithBorrow
)
指令格式:SBBdst,src;dst←dst-src-CF
指令功能:SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。
SBB指令与ADC指令一样,主要用于与SUB配合,实现多字节减法运算。
例如:SBBAX,2010H的运算为:(AX)←(AX)-2010H-(CF)
3.减1指令(DEC)指令格式:DECdst;dst←dst-1减1指令只有1个操作数dst,和INC指令类似,dst可为寄存器或存储器单元。DECCX;CX内容减1后,送回CX;
DECBYTEPTR[DI+2];将(DI)+2所指字节单元内容减1后,送回该单元。需要注意的是:DEC指令和INC指令一样,执行后对CF不产生影响。4.求补指令NEG指令格式:NEGdst;dst←0-dst指令功能:
对操作数执行求补运算,即用零减去操作数,然后结果返回操作数;或表示为将操作数按位取反后加1。标志寄存器:影响AF、PF、OF、ZF、SF,CF=1;
操作数:8位/16位通用寄存器或存储器。例:MOVAH,5NEGAH;AH=11111011B,是-5(补码)MOVAX,-6(FFFAH)NEGAX;AX=0006H,是+6
注意点:连同符号一起求补,称为变补。NEG应用举例设在内存中从AREA1开始存放有100个带符号数,现需要将这些数的绝对值存放在以AREA2开始的内存中;开始初始化置源地址,置目的地址指针置循环次数取一个带符号数负数?求补送存地址指针+1循环次数-1循环次数=0?结束NYNY5.比较指令CMP
(Compare)
指令格式:CMPdst,src;dst-src指令功能:
CMP指令执行的功能与SUB指令类似,但结果不回送目的操作数,只是使结果影响标志位。标志寄存器:OF,SF,ZF,PF和CF;
操作数:8位/16位通用寄存器或存储器用法:由受影响的标志位状态便可判断两操作数比较的结果。比较指令执行后目的-源(N1-N2)各标志位的情况
1)N1=N2CFZFSFOF01002)无符号数N1>N200--N1<N210--3)
带符号数N1<N2-010N1<N2-001N1>N2-000N1>N2-011关注ZF关注CF关注SF和OF乘法指令乘法指令中有两个操作数,其中一个是隐含固定在AL或AX中。1.无符号数的乘法指令MUL(Multiply
)指令格式:
MULsrcAL操作数AHAL(8位)(8位)(16位)AX操作数DXAX(16位)(16位)(32位)例如:MULBL;AL中和BL中的8位数相乘,乘积在AX中;MULCX;AX中和CX中的16位数相乘,乘积在DX和
;AX中;MULBYTEPTR[DI];AL中和(DI)所指的字节单元;中的8位数相乘,乘积在AX中MULWORDPTR[SI];AX中和(SI)所指的字单元中的
;16位数相乘,结果在DX中标志寄存器:字节乘:若乘积高8位AH不为0,则CF=OF=1,若乘积高8位AH=0,则CF=OF=0;字乘:若乘积高16位DX不为0,则CF=OF=1,若乘积高16位DX=0,则CF=OF=0;操作数:可以是通用寄存器、存储器,不能是立即数。指令格式:
IMULsrc符号数乘法指令指令功能:IMUL指令和MUL指令在功能和格式上类似,只是要求两个乘数均必须为带符号数。例如:IMULAX;AX中和AX中的16位带符号数自乘,;结果在DX和AX中IMULBYTEPTR[BX];AL中和(BX)所指的字节单元中的
;8位带符号数相乘,结果在AX中标志寄存器:若乘法结果AH或DX包含有效值,则OF=1、CF=1,
若乘法结果AH或DX只是低半部分的符号扩展,则OF=0、CF=0
2.带符号数的乘法指令(IntegerMultiply)例:比较无符号数和带符号数乘法指令设指令执行前:(AL)=A4H(BL)=12H(A4H)无符号数带符号数164D-92D(12H)无符号数带符号数18D
18D执行IMUL后:(AX)=F988H=-1656DCF=1,OF=1执行MUL后:(AX)=0B88H=2952D CF=1,OF=1IMUL BLMUL BL除法指令(Division)
除法指令有两个操作数,其中被除数隐含固定在AX中(除数为8位时)或DX,AX中(除数为16位时)。
1.无符号数除法指令
DIVsrc
指令格式:DIVsrc
无符号除法指令
指令功能:字节除:AL(商)←(AX)/(src),余数在AH中,
字除:
AX(商)
←(DX、AX)/(src),余数在DX中。
若除数为0,或商超过AL(字节除)或AX(字除)所能存放的最大值(FFH或FFFFH)时,系统会自动产生0类(除法除出错)中断,且商和余数都不确定。
指令格式:IDIVsrc指令功能:字节除:AL(商)←(AX)/(src),余数在AH中,字除:AX(商)←(DX、AX)/(src),余数在DX中。IDIV指令用于两个带符号数相除,其功能和对操作数长度的要求和DIV指令类似,本指令执行时,将被除数、除数都认作带符号数。注意:余数的符号和被除数的符号相同。当商超过AL或AX所能存放的范围值-128~+127(字节除)或-32768~+32767(字除),时,系统会自动产生0(除法错)类中断。指令执行后不产生有效标志2.带符号数的除法指令IDIV3.将字节扩展成字的指令CBW(ConvertBytetoWord
)
指令系统要求被除数长度是除数的两倍,若不满足可将被除数扩展,字节扩展指令用于对带符号数的扩展。指令格式:CBW指令功能:将AL寄存器中的符号位扩展到AH中,从而使AL中的8位数据扩展成为AX中的16位数。注意:符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高部分仅是低部分的符号扩展。应用:遇到两个带符号的字节数相除时,应先执行CBW指令,产生一个双倍长度的被除数,否则,不能正确执行除法操作。CBW执行后,不影响标志位。指令格式:
CWD(ConvertWordtoDoubleWord
)指令功能:将AX中数的符号位扩展到整个DX中。CWD指令和CBW一样,用于带符号数扩展,其功能是将AX寄存器中的符号位扩展到DX中,从而得到(DX),(AX)组成的32位双字。例:MOVAL,-16;AL=0F0H(-16)
CBW;AX=0FFF0H(-16)
CWD;DXAX=0FFFFFFF0H(-16)
IDIVBX;DX←余数,AX←商4.将字扩展成双字的指令CWD70AL70AH015AXDX150CBWCWD字节扩展到字指令CBW和字扩展到双字CWD示意图:例:如果在内存中有一个缓冲区BUFFER,如果前两个字节为一个16位带符号的被除数,第3,4字节为一个带符号的除数,第5,6字节放结果的商,7,8字节放余数。 则: LEABX,BUFFER ;偏移量到BX MOVAX,[BX] ;BX指向内容(被除数)到AX CWD ;符号扩展 IDIV[BX+2] ;16位带符号除法 MOV[BX+4],AX ;商到BUFFER+4地址处 MOV[BX+6],DX ;余到BUFFER+6地址处指令格式:DAA(DecimalAdjustforaddition)指令功能:DAA指令用于对压缩的BCD码相加的结果进行调整,使结果仍为压缩的BCD码。标志寄存器:影响CF、SF、ZF、AF、PF;
调整方法:指令执行时,先对相加结果进行测试,若低4位(或高4位)大于9(非法码)或产生进位CF或辅助进位AF时,DAA自动对低4位(或高4位)进行加6的调整。注意点:因调整是在AL中进行,因此加法运算后,必须把结果放在AL中;BCD码运算时,必须用调整指令。1.加法十进制调整指令十进制调整指令2.十进制减法调整指令(DAS)
指令格式:DAS
指令功能:对在AL中的两个压缩型BCD数相减的结果,调整成正确的压缩型BCD数在AL中;
用法:DAS与DAA对加法结果进行调整的作用相似,不同的是DAS对结果是进行减6的调整。该指令执行后,对AF,CF,PF,SF和ZF均产生影响,但OF没有意义。3.非压缩的十进制数加法调整指令指令格式:AAA(unpackedBCD[ASCII]adjustforaddition
)指令功能:AL←对AL中的加法结果调整为非压缩BCD码AH←AH+调整的进位AAA指令用于对非压缩BCD码相加结果进行调整,调整操作仍在AL中进行,调整后的结果在AX中。
4.非压缩十进制数减法调整指令(AAS)指令格式:AAS指令功能:AAS指令用于对非压缩BCD码相减结果进行调整,也是紧跟在减法指令之后,调整后的结果仍为非压缩的BCD码。
AAS指令执行后,只影响AF,CF特征,而OF,PF,SF和ZF都没有意义。指令格式:
AAM指令功能:AAM指令用于对8位的非压缩BCD码的乘积AX内容进行调整。调整后的结果仍为一个正确的非压缩BCD码,放回AX中。其中高位非压缩型BCD数在AH中,低位非压缩型BCD数在AL中;
标志寄存器:对PF,SF,ZF产生影响,对OF,AF和CF无意义。注意点:AAM紧跟在乘法指令之后,因为BCD码总是当作无符号数看待,所以对非压缩BCD相乘是用MUL指令,而不是用IMUL指令。5、非压缩十进制乘法调整指令例
求09X04的程序段为:MOVAL,09MOVCL,04;MULCL;(AL)X(CL)→(AX)=24HAAM;结果:(AH)=03H,(AL)=06H压缩BCD码相乘后,对所得结果无法调整,因此8086指令系统没有提供对压缩BCD码乘法的调整指令。指令格式:AAD指令功能:用在两位非压缩型BCD数在相除之前,将AX中存放的非压缩BCD码表示的十进制数调整为二进制数。使得两个未压缩的十进制数相除之后可得到非压缩的BCD数结果,商在AL中,余数在AH中;标志寄存器:影响PF、SF、ZF。
注意点:该指令必须放在除法指令之前。对十进制数进行除法运算时,和乘法一样,要求除数、被除数都用非压缩的BCD码,否则,不能进行调整。6.非压缩十进制除法调整指令例:要实现0103÷06=02余01,程序段如下:MOVAX,0103H;取被除数MOVBL,06;取除数AAD;调整为:(AX)=000DHDIVBL;相除,得商(AL)=02,余数(AH)=13-2-3、逻辑运算指令、移位指令8086的逻辑运算指令包括AND(与),OR(或),XOR(异或),TEST(测试)和NOT(非)5条指令。
特点:
①按位操作,②根据结果设置SF、ZF和PF状态,而对AF未定义;③操作数与ADD、SUB等一样
目的操作数:通用寄存器、存储器源操作数:通用寄存器、存储器、立即数
两操作数不能都是存储器操作数
④单操作数逻辑指令NOT不影响标志位逻辑运算逻辑指令:TESTsrcdstNOTANDORXOR0010000100111010111101101.逻辑“与”运算AND指令格式:ANDdst,src指令功能:dst←dst∩src标志寄存器:影响SF、ZF、PF,OF=0、CF=0,AF不确定
用AND指令可对指定位或指定的一些位进行屏蔽(清零)。
例如:ANDAL,0FH;将AL中的高4位清零
0FH称为屏蔽字,屏蔽字中的0对应于需要清0的位。
2.逻辑或运算OR
指令格式:ORdst,src
指令功能:dst←dst∨src其余同AND指令
用OR指令可对一些指定位置1。例如:ORAL,80H可将AL中的最高位置1,其他位保持不变。3.逻辑非运算NOTNOTreg/mem;reg/mem←reg/mem标志寄存器:不影响;操作数:通用寄存器、存储器,指令功能:按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”指令格式:例如:
NOTBX;(BX)变反码,结果送回BX中;
NOTBYTEPTR(1000H);将1000H单元中内容变反码后,;送回1000H单元
4.逻辑异或指令XOR
指令格式:XORdst,src;dst←dst⊕src用法1:XORAX,AX在清CF和影响SF,ZF,PF的同时,也清除AX本身用法2:用XOR指令可以比较两个操作数是否相同。例如:XORAL,3CH,若执行后,ZF=1,说明(AL)=3CH,否则,就不等于3CH;用法3:通过XOR指令用“1”与某数的对应位异或,可将该位取反,用“0”与某数的对应位异或,可将指定位不变;
其他与AND、OR指令相同例如:XORAL,0FH若指令执行前(AL)=3AH,其操作结果为00111010⊕0000
111100110101执行后,(AL)=35H
4.测试指令TEST
TEST指令和AND指令执行同样的操作,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志。TESTdest,src ;dest∧src
AND与TEST指令的关系,同SUB与CMP指令的关系一样注意点:TEST指令执行后,目的操作数的值保持不变。TEST指令一般用来检测指定位是1还是0TESTAL,80H;测AL的最高位D7是否为1,——由此可判正、负数;TEST[BX],01H;测(BX)所指存储单元的最低位D0是否为1,若是,ZF=0,否则ZF=1由此可判断该数是奇数,还是偶数例、使AL中的数,第0、1位取反。MOVAL,51H;送操作数XORAL,03H;送特征数00000011HLT;暂停
01010001(AL)
XOR0000001101010010例、测试AL中的第0、1、2位是否为零。MOVAL,40HTESTAL,07H;测AL的0、1、2位HLT
01001000AND0000011100000000逻辑指令小结AND指令用于对一个数据的指定位清零OR指令用于对一个数据的指定位置1NOT指令用于取反码,再加一,得补码XOR指令用于对寄存器清零TEST指令用于测试一个数据的指定位是1还是0SHLdst,count;逻辑左移SHRdst,count;逻辑右移SALdst,count;算数左移SARdst,count;算数右移CML00MLCCML0MLC非循环移位指令注意:移位指令影响标志位CF、OF、PF、SF和ZF。如果只移一位,指令中用1指出移位的位数,如果超过1位,必须用CL预先指明移位的位数。例1:SALDX,1;DX中的数左移1位MOVCL,4SALAX,CL;AX中的数左移4位SHLAL,CL;SHRAL,CL;AL中的数右移4位例2、将两个非压缩BCD码(高位存BL,低位存于AL中),转换成一个压缩的BCD码,存于AL中。0000****BL0000****ALOR****0000BL
SHL程序段:MOVCL,4SHLBL,CLORAL,BLHLT例2、将AX中的内容乘以10。左移一位,乘以2;右移一位,除以2。程序段:MOVBX,AXMOVCL,2SHLAX,CL;左移2位,乘以4ADDAX,BX;AX为原来5倍SHLAX,1;AX为原来的10倍HLT循环移位指令ROLdst,count;左小循环RORdst,count;右小循环RCLdst,count;左大循环RCRdst,count;右大循环例1、ROLAL,1AL:1001000100100011例2、MOVCL,2ROLBH,CLBH:10101111
10111110算术、逻辑移位可用于:改变数据二进制位的位置(丢失移出的位)二进制的整次幂的乘法(左移)、除法(右移)算术移位用于带符号数操作逻辑移位用于无符号数操作循环移位可用于:改变数据二进制位的位置(不丢失移动的位)习题1、假设DL=10111001B,CL=3,指令SARDL,CL执行后DL=?2、假设一个48位数存放在DX:AX:BX中,请编程把这个48位数乘以2。DL=10000111BSALBX,1RCLAX,1RCLDX,1MOVCL,3b.MOVCL,7MOVBX,0B7HMOVBX,8D16HROLBX,1SHRBX,CLRORBX,CLa.答案BX=C02DHb.答案BX=011AH3、下列程序执行后,BX=?3-2-4、串(String)操作指令字串传送:MOVSB/MOVSW字串比较:CMPSB/CMPSW字串扫描:SCASB/SCASW字串装入:LODSB/LODSW字串存储:STOSB/STOSW一、串操作的特点1、SI寻址源操作数,段地址在DS,DI寻址目的操作数,段地址在ES;2)每次操作后,SI、DI自动修改:DF=0,SI和DI加1或(+2),DF=1,SI、DI减一或减二。3)若源字串和目的字串在同一段中,则把DS和ES设成相同数字。4)可在串操作指令前加重复前缀(REP等),每重复执行一次,CX内容会自动减1。需注意的是,执行带有重复前缀的指令时,对CX的检测是在执行指令前进行的。5)串长度必须放在CX寄存器中二、重复前缀:
1、REP
MOVSB/MOVSW(1).若CX=0,退出重复操作;(2).CX≠0,执行串操作一次,CXCX-1,修改SI、DI,转(1)。2、相等重复前缀REPZ(REPE)(1).若CX=0,或ZF=0,退出重复操作;(2).CX≠0,执行串操作一次,CXCX-1,修改SI、DI,转(1)。用途:用于比较两个字串,找出不同的字。
3、不相等重复前缀REPNZ(REPNE)(1).若CX=0,或ZF=1,退出重复操作;(2).CX≠0,执行串操作一次,CXCX-1,修改SI、DI。用途:1)在一个字串中,找到需要的字。
2)用于比较两个字串,找出相同的字串
。三、字串传送指令:MOVS
字节操作:MOVSB字操作:MOVSW1).SI指向源串(数据段DS),DI指向目的(附加段ES);2).CX置入传送的字节数;3).用CLD 清DF=0:SI+1(或2),DI+1(或2);
用STD置DF=1:SI-1(或2),DI-1(或2);4).用带REP重复前缀的串传送指令,每传送一次,CX中的值减一。例1.将100个数据,从地址为1000H单元传送到地址为2000H单元区.LEASI,[1000H];SI指向源串地址LEADI,[2000H];DI指向源串地址MOVCX,100;置计数器CLD;清方向标志REPMOVSB;将源地址的100个字节传送到目的地址单元
HLT四、字串比较指令:
CMPSB/CMPSW;SRC-DST字操作指令:CMPSW字节操作指令:CMPSB功能:[SI]—[DI]DIDI1(2)SISI1(2)
操作结果影响标志位。在CMPSW/CMPSB前使用重复前缀:用REPNZ/REPNE,表示两个字串比较不相等时继续下次比较,若相等则退出比较。
用REPZ/REPE,表示两个字串比较相等时继续下次比较,若不相等则退出比较。用途:用于比较两个字串,找出第一个相等的字符或不相等的字符五、字串检索指令:
SCASB/SCASW
操作:AL(AX)—[DI]DIDI1(2)用AL或AX中的一个字串和位于ES段由DI指出的内存单元的字节或字比较。
功能:从一个字串中查找一个与AL或AX中不同的字符,或寻找一个相同的字符.例2.从地址为1000单元开始,存放256个字节的字符串,找出第一个字符$(ASCII码24H),将$的第一个地址存入BX中,否则将BX清零.
1)分析:要求找指定字符$,可以用指令SCASB;重复前缀用REPNZ,表示表示两个字串比较不相等时继续,否则退出循环$的地址应为多少?
1031332445DIDI1000H1001H1002H1003H….2).程序段:MOVDI,1000H;送目标串首地址MOVCX,256CLD;清方向标志MOVAL,‘$’REPNZSCANBJZZER;没找到$,转DECDI;退回到$所在地址MOVBX,DI;$所在地址送BXJMPST0ZER:MOVBX,0ST0:HLT
使用SCASB/SCASW注意:目的字串默认在ES段中,字串首址由DI指出。寻找与AL中字节相同的第一个字节,用REPNZSCASB,若找到,退出循环;若字串中没有任何字节与AL的内容相同,退出循环。六、取字串指令:
LODSB/LODSW
执行的操作:AL(AX)[SI]SISI1(2)将位于DS段由SI指出的内存单元的字节或字的内容取到AL或AX中。注意:因为取来的字或字节放在AX或AL中,LODSB/LODSW前面不能加前缀。七、存储指令:
STOSB/STOSW例3:将0404H单元开始的256单元清零。
CLD
;清方向标志
LEADI,[0404H]
;DI指向字串地址
MOVCX,256;共256个字节
XORAX,AX;AX清零REPSTOSBHLT
执行的操作:[DI]AL(AX)DIDI1(2)把AL或AX中的一个字串存到位ES段由DI指出的内存单元,并自动修改地址。
8086的指令执行顺序由代码寄存器CS和指令指针IP的内容确定。
控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变8086的控制转移类指令可分为四小类,即无条件转移与调用返回、条件转移、循环控制和中断类指令。除中断类指令外,其它类指令均不影响标志位。控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令3-2-5控制转移指令
控制转移指令的寻址方式8088/8086的寻址方式分为两类:关于寻找数据的寻址方式关于寻找转移地址的寻址方式转移可以分成两类:段内转移和段间转移
段内转移——只需改变IP寄存器的内容,在同一段的范围之内进行转移,称为段内转移也称为近程转移(称为NEAR),还将(-128~+127)内转移称为短转移(称为SHORT)。
段间转移——是要转到另一个段去执行程序,即程序转移后CS、IP均发生了改变,则称为段间转移或者称为远程转移(也称为FAR型转移)
。1.段内直接寻址段内直接寻址方式也称为相对寻址方式,转移的目标地址是当前IP内容和一个8位或16位的位移量之和.(IP)←(IP)+8位或16位位移量。2.段内间接方式
有效的转移地址EA是一个寄存器或是一个存储单元的内容,此内容用来更新IP寄存器的内容,所以是绝对偏移量。注意与段内直接方式的相对偏移量的区别。
若目标转移地址为存储单元内容,则该存储单元本身可以是存储器操作数有关的任何寻址方式寻址。(IP)←16位通用寄存器或字存储单元的内容3.段间直接寻址这种方式用于段间转移,指令中给出转向地址的段地址(CS)和偏移地址(IP),用来更新当前CS和IP,程序转移到另一代码段。4.段间间接方式这种方式同样用于段间转移,指令中将给出一个存储器地址,用该存储器地址所指的二个相继字单元的内容(32位)来取代当前的IP和CS的内容。
存储器CS存放转移地址首地址高字节低字节低字节高字节IP二、无条件转移指令和条件转移指令1、无条件转移指令
段内转移:JMP1000H;IPIP+1000HJMPSHORTLOP1;LOP1是标号
段间转移JMPFARPTRLOP2IPLOP2的段内偏移地址CSLOP2的段地址
JMPDWORDPTR[BX]IP[BX]CS[BX+2]A∶Above高于B∶Below低于C∶Carry进位E∶Equal
等于Z:Zero零
G∶Graeter大于L∶Less小于N∶Not非、无O∶Over溢出S∶Sign符号PE∶ParityEven奇校验PO∶ParityOdd偶校验2、条件转移指令
形式:JX短目标地址X:1~3个英文字母跳转范围:-128~+127字节1)、JE/JZ;等于,A=BJNZ/JNE;不等于,A<>B2)、无符号数比较JB/JNAE:A<BJNB/JAE:A>=BJA/JNBE:A>B;JNA/JBE:A<=B3)、带符号数比较指令JL:A<BJNL:A>=BJG:A>BJNG:A<=B4)其它转移指令JS、JNS;JO、JNO;JP、JPE:P=1JPO、JNP;JCXZ:CX=0转移
例1比较1000H、1001H单元的两个无符号数,将大数存2000H单元中。解:MOVBX,1000H MOVAL,[BX];第一数送ALINCBX;指向第二数CMPAL,[BX];两数比较JALOP1;大于转MOVAL,[BX];大数送ALLOP1:MOV[2000H],ALHLT三、循环指令LOOP、LOOPZ、LOOPNZ1)、LOOP短目标地址操作:CXCX-1,CX不为零,循环;若CX=0,退出循环。相当于下面的指令:DECCXJNZ短目标地址
例2:延迟子程序:MOVCX,0100H;设循环次数KKK:LOOPKKK;CX-1,CX;不为零,循环
或:MOVCX,0100HKKK:DECCXJNZKKKHLT2)LOOPZ/LOOPE
CX-1,CX不为零且ZF=1,循环;若CX=0,或ZF=0,退出循环。3)LOOPNZ/LOOPNE
CX-1,CX不为零且ZF=0,循环;若CX=0,或ZF=1,退出循环。四、子程序调用和返回指令
指令格式CALL
RET
(1)CALL指令
CALL1000H;段内直接调用
1)、IP入栈:SPSP-2[SP]IP2)、入口地址:IPIP+1000HCALLNEARBCD1;段内直接调用1)IP值入栈:SPSP-2[SP]IP2)入口地址:IPBCD1的偏移地址CALLAX;段内间接调用1)IP值入栈:SPSP-2[SP]IP2)入口地址:IPAX的值CALL2500H:3600H;段间直接调用1)、CS值入栈2)、IP值入栈3)、IP2500HCS3600HCALLDWORDPTR[DI];段间间接调用1)、CS值入栈2)、IP值入栈3)、IP[DI]CS[DI+2](2)、返回指令:RET
1)段内调用返回从堆栈弹出一个字到IP2)段间调用返回从堆栈弹出一个字到IP从堆栈弹出一个字到CS3)RETN:带参数返回RET6,返回后,使SP+6。五、中断指令
1)INTn(1)、标志寄存器入栈;(2)、清标志位TF、IF;(3)、CS、DS值入栈;(4)、计算中断地址:n4:低地址单元入IP高地址单元入CS
2)INTO:溢出中断3)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学大四(水利水电工程)水利枢纽综合测试试题及答案
- 工程砂浆知识培训课件
- 制造业安全环保培训
- 工程技术类安全生产培训课件
- 工程建设廉政培训课件
- 临床营养专业医疗质量控制指标(2022年版)学习课件
- 手术应激反应的决策干预策略
- 2026年安全生产隐患排查治理知识自测题库及答案
- 2026年生态环保知识竞赛试题库及答案
- 2026年河南“安全生产月”知识竞赛试题及答案
- 2025榆林市旅游投资集团有限公司招聘(15人)参考笔试题库及答案解析
- 2025福建三明市总工会三明市工人文化宫招聘工作人1人参考题库带答案解析
- 【人卫课件耳鼻喉9版】鼻科学第一章 鼻的应用解剖学及生理学
- 抵押车过户协议书
- 葡萄种植课件
- 浅析我国政府雇员制的利弊及发展对策研究
- 2025年全国高校辅导员国赛大赛基础知识测试题(附答案)(三套)
- 粉丝群体特征分析-洞察与解读
- 2025年亚氨基二乙酸行业分析报告及未来发展趋势预测
- 2025年江苏省普通高中高二上学期学业水平合格性考试调研历史试题(解析版)
- 学堂在线 雨课堂 学堂云 批判性思维-方法和实践 章节测试答案
评论
0/150
提交评论