第3章教学重点8088/8086的寻址方式8088/8086的基本指令传送指令算术运算指令逻辑运算和移位指令串操作指令控制转移指令指令的基本组成操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分操作数指明参与操作的数是谁或存放在何处寻找操作数的方法叫寻址方式在转移调用指令中寻找新的转移地址也是寻址方式.
操作码操作数指令由操作码和操作数两部分组成§1操作数的寻址方式指令系统设计了多种操作数的来源寻找操作数的过程就是操作数的寻址理解操作数的寻址方式是理解指令功能的前提操作数采取哪一种寻址方式一方面,会影响处理器执行指令的速度和效率另一方面,对程序设计也很重要一、立即数寻址方式指令中直接给出一个常数作为操作数,其紧跟在操作码之后存放在代码段中.
立即数直接从指令队列中取得,不用总线周期,执行数度快.
这种操作数被称为立即数可以是8位数值(00H~FFH)也可以是16位数值(0000H~FFFFH)立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现注意:立即数只能是整数而且是常数.
演示MOVAX,0102H;AX←0102H二、寄存器寻址方式指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不用总线周期,执行速度快.
8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP4个段寄存器seg:CS、DS、SS、ES演示MOVAX,BX;AX←BX三、直接寻址方式指令中直接给出操作数所在内存单元的有效地址(EA即偏移地址)默认的段地址在DS段寄存器,若在其它段可使用段超越前缀改变.
用方括号包含有效地址,表达存储单元的内容直接地址也可用标号代表,方括号可省略.
演示MOVAX,[2000H];AX←DS:[2000H]MOVAX,ES:[2000H];AX←ES:[2000H]四、寄存器间接寻址方式指令中给出的寄存器的内容包含操作数的有效地址.
间接寻址中使用的寄存器名要用方括号括起来1、基址寻址用BX或BP作间接寻址寄存器如:MOVAX,[BX];隐含在DS段MOVAX,[BP];隐含在SS段演示MOVAX,[BX];AX←DS:[BX]2、变址寻址用SI或DI作间接寻址寄存器如:MOVCL,[SI]MOVAX,[DI]单独使用SI或DI时,隐含在DS段中在串操作时,SI隐含在DS段中,DI隐含在ES段中.
3、相对基址寻址指令中给出基址寄存器及位移量,二者之和为操作数的有效地址.
位移量可以是8位或16位.
有效地址=BX/BP+8/16位位移量4、相对变址寻址指令中给出变址寄存器及位移量,二者之和为操作数的有效地址.
有效地址=SI/DI+8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变演示MOVAX,[SI+06H];AX←DS:[SI+06H]MOVAX,06H[SI];AX←DS:[SI+06H]5、基址变址寻址方式有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址=BX/BP+SI/DI段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变演示MOVAX,[BX+SI];AX←DS:[BX+SI]MOVAX,[BX][SI];AX←DS:[BX+SI]6、相对基址变址寻址方式有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:有效地址=BX/BP+SI/DI+8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变演示MOVAX,[BX+DI+6];AX←DS:[BX+DI+6]MOVAX,6[BX+DI]MOVAX,6[BX][DI]MOV指令的功能立即数寻址方式寄存器寻址方式直接寻址方式间接寻址方式相对寻址方式基址变址寻址方式相对基址变址寻址方式各种寻址方式综合举例设BX=1200HDI=10A0H位移量=2BC0HDS=2400H求各种寻址方式下的有效地址和物理地址.
①直接寻址指令形式:MOVAX,[2BC0H]EA=2BC0H物理地址=24000H+2BC0H=26BC0H②基址寻址指令形式:MOVAX,[BX]EA=1200H物理地址=24000H+1200H=25200H③变址寻址指令形式:MOVAX,[DI]EA=10A0H物理地址=24000H+10A0H=250A0H④相对基址寻址MOVAX,[BX+2BC0H]EA=1200H+2BC0H=3DC0H物理地址=24000H+3DC0H=27DC0H⑤相对基址寻址MOVAX,[DI+2BC0H]EA=10A0H+2BC0H=3C60H物理地址=24000H+3C60H=27C60H⑥相对基址变址寻址MOVAX,[BX+DI+2BC0H]EA=1200H+10A0H+2BC0H=4E60H物理地址=24000H+4E60H=28E60H§28086的指令格式操作码操作码11REGR/M操作码MODREGR/M操作码(R)单字节指令(隐含操作数)单字节指令(寄存器模式)双字节指令(寄存器到寄存器模式)不带位移量的寄存器和内存之间的传送REG--寄存器MOD--模式R/M--寄存器或内存一、指令格式操作码MODREGR/M位移低位位移高位操作码11操作码R/M数据低位数据高位操作码MOD操作码R/M位移低位位移高位数据低位数据高位REG--寄存器MOD--模式R/M--寄存器或内存带位移量的寄存器和内存之间的传送(设位移量为16位)立即数送寄存器(设立即数为16位)立即数送内存(设位移量为16位)四字节指令六字节指令在操作码中一般有3位W、D、SW=0表示字节操作W=1表示字操作D=0REG是源操作数D=1是目的操作数S是扩展位(用于加、减和比较和W组合使用)S=0W=08位操作数S=0W=116位操作数S=1W=1由8位扩展为16位操作数单字节指令中可隐含指出寄存器名,此类指令少,但执行速度较快.
8086规定:双操作数指令中(除立即数和串操作指令),其中一个操作数必须在寄存器中,可缩短指令长度,另一个操作数可以在寄存器中也可以在内存单元中.
8086指令中第二个字节,给出两个操作数在什么地方,以及计算存储器地址的方法.
MODREGR/M寻址方式寄存器名计算存储器地址方法MOD数据00存储器寻址不带位移量01存储器寻址8位位移量10存储器寻址16位位移量11寄存器寻址MOD=11,表明第二个操作数也在寄存器中,则R/M指明其名称,与REG编码相同.
REGW=1W=0000AXAL001BXCL010CXDL011DXBL100SPAH101BPCH110SIDH111DIBH000110000[BX+SI][BX+SI+d8][BX+SI+d16]001[BX+DI][BX+DI+d8][BX+DI+d16]010[BP+SI][BP+SI+d8][BP+SI+d16]011[BP+DI][BP+DI+d8][BP+DI+d16]100[SI][SI+d8][SI+d16]101[DI][DI+d8][DI+d16]110直接寻址[BP+d8][BP+d16]111[BX][BX+d8][BX+d16]R/MMOD二、段寄存器的隐含访问一般指令中不出现段寄存器名称,而用隐含关系指明.
如与隐含关系不同,运用前缀改变.
①[BX]隐含于DS段②[BP]隐含于SS段③[SI]、[DI]单独使用隐含于DS段④基址寄存器和变址寄存器同时出现,以基址寄存器隐含关系为准.
[SP]隐含于SS段[SI]、[DI]用于串操作时,[SI]隐含于DS段,[DI]隐含于ES段.
使用前缀的形式ADDAX,ES:[SI]或ES:ADDAX,[SI]三、指令执行时间一般用所需的时钟周期数表明指令执行时间=基本执行时间+计算有效地址时间+为取操作数和存放结果而访问内存的时间§38086指令系统8086指令系统很丰富,包含133条基本指令,功能强.
一般分为五类来介绍传送指令算术运算指令逻辑运算和移位指令串操作指令控制转移指令一、数据传送类指令数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位重点掌握MOVXCHGPUSHPOPXLATLEA1、通用数据传送指令提供方便灵活的通用传送操作有3条指令MOVXCHGPUSHPOPMOVXCHGPUSH①基本传送指令MOV(move)把一个字节或字的操作数从源地址传送至目的地址MOVreg/mem,imm;立即数送寄存器或主存MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存MOVreg/seg,mem;主存送(段)寄存器MOVreg/mem,seg;段寄存器送寄存器或主存演示MOV指令举例--立即数传送movcl,4;cl←4,字节传送movdx,0ffh;dx←00ffh,字传送movsi,200h;si←0200h,字传送movbvar,0ah;字节传送;假设bvar是一个字节变量,定义如下:bvardb0movwvar,0bh;字传送;假设wvar是一个字变量,定义如下:wvardw0明确指令是字节操作还是字操作以字母开头的常数要有前导0MOV指令举例--寄存器传送movah,al;ah←al,字节传送movbvar,ch;bvar←ch,字节传送movax,bx;ax←bx,字传送movds,ax;ds←ax,字传送mov[bx],al;[bx]←al,字节传送寄存器具有明确的字节和字类型MOV指令举例--存储器传送moval,[bx];al←ds:[bx]movdx,[bp];dx←ss:[bp+0]movdx,[bp+4];dx←ss:[bp+4]moves,[si];es←ds:[si]不存在存储器向存储器的传送指令MOV指令举例--段寄存器传送mov[si],dsmovax,ds;ax←dsmoves,ax;es←ax←ds对段寄存器的操作不灵活MOV指令传送功能图解MOV指令也并非任意传送!
立即数段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存储器非法指令的主要现象:两个操作数的类型不一致无法确定是字节量还是字量操作两个操作数都是存储器段寄存器的操作有一些限制非法指令--两个操作数类型不一致在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令MOVAL,050AH;非法指令,修正:;movax,050ahMOVSI,DL;非法指令,修正:;movdh,0;movsi,dx非法指令--无法确定是字节量还是字量操作当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明MOV[BX+SI],255;非法指令,修正:;movbyteptr[bx+si],255;byteptr说明是字节操作;movwordptr[bx+si],255;wordptr说明是字操作非法指令--两个操作数都是存储器8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)MOVbuf2,buf1;非法指令,修正:;假设buf2和buf1是两个字变量;movax,buf1;movbuf2,ax;假设buf2和buf1是两个字节变量;moval,buf1;movbuf2,al非法指令--段寄存器的操作有一些限制8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活MOVDS,ES;非法指令,修正:;movax,es;movds,axMOVDS,100H;非法指令,修正:;movax,100h;movds,axMOVCS,[SI];非法指令;指令存在,但不能执行②交换指令XCHG(exchange)把两个地方的数据进行互换寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据XCHGreg,reg/mem;regreg/mem演示数据交换指令举例movax,1199h;ax=1199hxchgah,al;ax=9911h;等同于xchgal,ahmovwvar,5566h;wvar是一个字量变量xchgax,wvar;ax=5566h,wvar=9911h;等同于xchgwvar,ax注意:不能在两个内存单元之间交换如:XCHG[BX],[SI]错误!
段寄存器中CS、IP不能做操作数③堆栈操作指令堆栈是一个"后进先出LIFO"(或说"先进后出FILO")的主存区域,位于堆栈段中;SS段寄存器记录其段地址堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP堆栈由栈底向低地址方向生成图示进栈指令PUSH进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部PUSHr16/m16/seg;SP←SP-2;SS:[SP]←r16/m16/seg演示pushaxpush[2000h]出栈指令POP出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2POPr16/m16/seg;r16/m16/seg←SS:[SP];SP←SP+2popaxpopwvar演示堆栈操作的特点堆栈操作的单位是字,进栈和出栈只对字进行数据从栈顶压入和弹出时,都是低地址送低字节,高地址送高字节堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据堆栈段是程序中不可或缺的一个内存区,常用来临时存放数据传递参数保存和恢复寄存器应用举例:设SS=1000HSP=2000HAX=A26FH执行PUSHAX指令的过程和结果SP-2=1FFEH则AX内容压入内存11FFEH和11FFFH执行后SP=1FFEH(11FFEH)=6FH(11FFFH)=A2HSP12000HSP11FFEH11FFFH6FHA2H栈底练习1:已知SS=1200H执行MOVAX,3765HMOVBX,4288HMOVSP,1020HPUSHAXPUSHBXPOPCX执行后AX=BX=CX=SP=3765H,4288H,4288H,101EH2、累加器专用传送指令①输入输出指令(IN/OUT指令)格式:INAL,port;port为直接端口地址INAL,DX;DX的内容为端口地址(间接方式)INAX,port;INAX,DXOUTport,ALOUTDX,ALOUTport,AXOUTDX,AX注意:①只能用累加寄存器不能用其它寄存器②当端口地址在00H—FFH之间可以用直接地址当端口地址大于FFH时必须用DX间址形式例:INAL,40H;(40H)ALINAX,80H;(80H)、(81H)AXMOVDX,0382HINAL,DX;(0382H)ALOUT62H,ALMOVDX,0380HOUTDX,AX②换码指令XLAT(查表指令)将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码表格首地址存放于BX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码XLAT;al←ds:[bx+al]演示将存储器操作数的有效地址送至指定的16位通用寄存器③址传送指令三条LEA、LDS、LESLEAr16,mem;r16←mem的有效地址EA例1:有效地址的获取LEAAX,[2375H];AX=2375HLEASP,[BX+SI];SP=(BX)+(SI)区别:LEASI,BUFF;SI=BUFFMOVSI,BUFF;SI=(BUFF)例2MOVBX,400HMOVSI,3CHLEABX,[BX+SI+0F62H];BX←400H+3CH+0F62H=139EHLDSr16,mem;ds、r16←mem中的双字例:LDSBX,[2300H]MDS段2300H2301H2302H2303H34H12H78H56H执行后:BX=1234HDS=5678HLESr16,mem;es、r16←mem中的双字例:LESDI,[SI]MDS段SISI+1SI+2SI+311H22H33H44H执行后:DI=2211HES=4433H4、标志传送指令①读标志指令LAHF;标志寄存器低字传送到AH②设标志指令SAHF;AH的内容送标志寄存器低8位③标志寄存器堆栈指令PUSHF;标志寄存器内容(16位)压栈标志寄存器出栈指令POPF;弹出标志寄存器的内容.
MOV指令的功能XCHG指令的功能堆栈的图示SSSP0000H(栈顶)存储器高地址堆栈段PUSH指令的功能POP指令的功能XLAT指令的功能二、算术运算类指令算术运算类指令用来执行二进制的算术运算:加减乘除以及BCD码调整.
这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志重点掌握加法指令:ADD、ADC、INC减法指令:SUB、SBB、DEC、CMP、NEG1、加法和减法指令加法指令:ADD,ADC和INC减法指令:SUB,SBB,DEC,NEG和CMP他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位操作数组合:dest,src运算指令助记符reg,imm/reg/mem运算指令助记符mem,imm/regADDdest,src;加法:dest←dest+src;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数SUBdest,src;减法:dest←dest-src;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数①不带进位加和减指令加法例题movax,7348h;AX=7348Haddal,27h;AL=48H+27H=6FH,AX=736FH;OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh;AX=736FH+3FFFH=B36EH;OF=1,SF=1,ZF=0,PF=0,CF=0减法例题subah,0f0h;AH=B3H-F0H=C3H,AX=C36EH;OF=0,SF=1,ZF=0,PF=1,CF=1movwordptr[200h],0ef00h;[200H]=EF00H,标志不变sub[200h],ax;[200H]=EF00H-C36EH=2B92H;OF=0,SF=0,ZF=0,PF=0,CF=0subsi,si;SI=0;OF=0,SF=0,ZF=1,PF=1,CF=0②带进位加和减指令ADCdest,src;加法:dest←dest+src+CF;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数SBBdest,src;减法:dest←dest-src-CF;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数例:无符号双字加法和减法movax,7856h;AX=7856Hmovdx,8234h;DX=8234Haddax,8998h;AX=01EEH,CF=1adcdx,1234h;DX=9469H,CF=0subax,4491h;AX=BD5DH,CF=1sbbdx,8000h;DX=1468H,CF=0DX.
AX=82347856H+12348998H-80004491H=1468BD5DH③比较指令CMP(compare)CMPdest,src;做减法运算:dest-src;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系cmpax,bxcmpal,100④增量和减量指令INCreg/mem;增量(加1):reg/mem←reg/mem+1DECreg/mem;减量(减1):reg/mem←reg/mem-1INC指令和DEC指令是单操作数指令与加法和减法指令实现的加1和减1不同的是:INC和DEC不影响CF标志incsi;si←si+1decbyteptr[si];[si]←[si]-1如A、B两数为无符号数,则通过以下标志判断ZF=1,A=B;CF=0,A﹥B;CF=1,A﹤B如A、B两数为有符号数,不能通过CF标志判断两数的大、小关系,要使用SF、OF标志ZF=1,A=BSF、OF同号,则A﹥BSF、OF异号,则A﹤B实例验证A=10=00001010BB=-10=11110110BA-B=00001010-11110110=00010100SF=0OF=0,A﹥BB-A=11110110-00001010=11101100SF=1,OF=0,A﹤B⑤求补指令NEG(negtive)NEGreg/mem;reg/mem←0-reg/memNEG指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样(总使CF=1)NEG指令也是一个单操作数指令求补运算例题movax,0ff64hnegal;AL=0-64H=9CH,AX=FF9CH;OF=0,SF=1,ZF=0,PF=1,CF=1subal,9dh;AL=9CH-9DH=FFH,AX=FFFFH;OF=0,SF=1,ZF=0,PF=1,CF=1negax;AX=0-FFFFH=0001H;OF=0,SF=0,ZF=0,PF=0,CF=1decal;AL=01H-1=0,AX=0000H;OF=0,SF=0,ZF=1,PF=1,CF=1negax;AX=0-0=0;OF=0,SF=0,ZF=1,PF=1,CF=0乘法指令规定:8位X8位,积为16位被乘数必须在AL中,乘积在AX中16位X16位,积为32位被乘数必须在AX中,乘积在DX(高16位)、AX中对标志位的理解:CF=OF=1,表示结果为16位或32位有效.
CF=0,OF=1,表示只有8位或16位乘积.
2、乘法指令乘法指令分无符号和有符号乘法指令MULreg/mem;无符号乘法IMULreg/mem;有符号乘法例:IMULBLMULCXMULbyteptr[di+04h]IMULwordptr[si]3、除法指令除法指令的规定:被除数是16位,必须存放于AX中,此时除数只能是8位,得到的商存于AL中,余数在AH中.
被除数是32位,必须存放于DX、AX中,此时除数只能是16位,得到16位的商存于AX中,余数在DX中.
除法运算后,状态标志除ZF外,无意义.
当有符号数相除,商超出表示范围不表示为溢出,其与除数为0一样,产生0号中断.
(除法出错).
有符号数相除,会有两种结果,选择余数的符号与被除数相同.
(-30)÷8=-4余+2或-3余-6取后者当被除数只有8位或16位时必须进行扩展.
除法指令分无符号和有符号除法指令DIVreg/mem;无符号除法IDIVreg/mem;有符号除法例:DIVCL;IDIVBL;DIVwordptr[bx]IDIVbyteptr[2300h]4、符号扩展指令无符号数的扩展高位补0,有符号数扩展使用符号扩展指令.
符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,即扩展符号位.
符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高位部分仅是低位的符号扩展.
符号扩展指令有两条,用来将字节转换为字,字转换为双字CBW;AL符号扩展成AXCWD;AX符号扩展成DX符号扩展例题moval,64h;AL=64H(机器数),表示10进制数100(真值)cbw;将符号0扩展,AX=0064H,仍然表示100movax,0ff00h;AX=FF00H,表示有符号10进制数-256cwd;将符号位"1"扩展,DX.
AX=FFFFFF00H;仍然表示-2565、十进制调整指令十进制数调整指令对BCD运算的结果进行十进制调整,以得到正确的十进制的运算结果.
BCD码的运算只有字节运算,且必须用AL作目的操作数.
8088指令系统支持两种BCD码调整运算压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即00~99非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位0~9,高4位任意,通常默认为0①加法调整指令非压缩BCD码相加后用AAA调整压缩BCD码相加后用DAA调整例1:设AL=09HCL=07HADDAL,CL;AL=10HAAA;结果:AH=01HAL=06H调整的方法:当(AL)﹥9或AF=1(AL)+06HAL,然后(AL)∧0FH;(AH)+1AH调整后AF、CF置1,其他标志无意义.
例2:设AL=28HCL=53HADDAL,CL;AL=7BHDAA;结果:AL=81H调整的方法:当AL中低4位﹥9(AL)+06HAL.
调整指令影响AF、CF、PF、SF、ZF,OF无意义.
②减法调整指令非压缩BCD码相减以后用AAS调整压缩BCD码相减以后用DAS调整AAS指令的方法与AAA相似:当(AL)﹥9或AF=1(半借位)(AL)-06HAL,然后(AL)∧0FH;(AH)-1AHDAS指令的方法与DAA相似(加变减).
③乘法调整指令BCD码相乘只能用非压缩BCD码,因而只有一条调整指令即AAM调整方法(AL)除以0AH,得到的商送到AH,余数在AL中.
例:AL=05H,CL=07HMULCL;AL=23HAAM;AH=03HAL=05H④除法调整指令除法也只有非压缩BCD码相除,用AAD调整.
除法调整指令用于除法指令之前.
调整的方法是将AX中的2位被除数调整好,再除以除数:(AH)X(0AH)+(AL)AL例:AX=0402HCL=06HAAD;AL=2AHDIVCL;AL=07H三、逻辑运算和移位指令逻辑运算即位操作,指令以二进制位为基本单位进行数据的操作当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令注意这些指令对标志位的影响1.
逻辑运算指令ANDORXORNOTTEST2.
移位指令SHL(SAL)SHRSAR3.
循环移位指令ROLRORRCLRCR1、逻辑运算指令双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义;它们的操作数组合与ADD、SUB等一样:运算指令助记符reg,imm/reg/mem运算指令助记符mem,imm/reg单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:NOTreg/mem逻辑与指令AND对两个操作数执行逻辑与运算,结果送目的操作数ANDdest,src;dest←dest∧src只有相"与"的两位都是1,结果才是1;否则,"与"的结果为0.
可以使某些位清0,其余位不变.
逻辑或指令OR对两个操作数执行逻辑或运算,结果送目的操作数ORdest,src;dest←dest∨src只要相"或"的两位有一位是1,结果就是1;否则,结果为0.
可以使某些位置1.
逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送目的操作数XORdest,src;dest←destsrc只有相"异或"的两位不相同,结果才是1;否则,结果为0.
可以使某些位取反.
测试指令TEST对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志TESTdest,src;dest∧srcAND与TEST指令的关系,同SUB与CMP指令的关系一样例:TESTAL,01H;测试AL的最低位TESTAX,8000H;测试AX的最高位TESTBX,00FFH;测试BX的低8位TESTCL,0F0H;测试CL的高4位利用ZF标志判断被测试位的状态ZF=1,被测试位为0,否则,为1.
逻辑非指令NOT对一个操作数执行逻辑非运算NOTreg/mem;reg/mem←~reg/mem按位取反,原来是"0"的位变为"1";原来是"1"的位变为"0"逻辑运算举例moval,75h;AL=75Handal,32h;AL=30H;CF=OF=0,SF=0,ZF=0,PF=1oral,71h;AL=71H;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h;AL=80H;CF=OF=0,SF=1,ZF=0,PF=0notal;AL=7FH,标志不变逻辑运算指令的应用例:将内存2000单元的内容D0、D3清0,D2、D4置1,D1、D6取反,其余位不变.
movbl,[2000h]andbl,11110110b;BL中D0和D3清0,其余位不变orbl,00010100b;BL中D2和D4置1,其余位不变xorbl,01000010b;BL中D1和D6求反,其余位不变mov[2000h],bl2、移位指令将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:该操作数为1,表示移动一位该操作数为CL,CL寄存器值表示移位位数(移位位数大于1只能CL表示)按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF逻辑左移指令SHLSHLreg/mem,1/CL;reg/mem左移1或CL位;最低位补0,最高位进入CF演示逻辑右移指令SHRSHRreg/mem,1/CL;reg/mem右移1/CL位;最高位补0,最低位进入CF演示算术左移指令SALSALreg/mem,1/CL;与SHL是同一条指令演示算术右移指令SARSARreg/mem,1/CL;reg/mem右移1/CL位;最高位不变,最低位进入CF演示数据移位举例movdx,6075h;DX=0110000001110101Bshldx,1;DX=1100000011101010B;CF=0,SF=1、ZF=0、PF=0sardx,1;DX=1110000001110101B;CF=0,SF=1、ZF=0、PF=0shrdx,1;DX=0111000000111010B;CF=1,SF=0、ZF=0、PF=1movcl,4;CL=4,标志不变sardx,cl;DX=0000011100000011B;CF=1,SF=0、ZF=0、PF=1例:将AL寄存器中的无符号数乘以10xorah,ah;实现AH=0,同时使CF=0shlax,1;AX←2*ALmovbx,ax;BX←AX=2*ALshlax,1;AX←4*ALshlax,1;AX←8*ALaddax,bx;AX←8*AL+2*AL=10*ALsubah,ahandah,0逻辑左移一位相当于无符号数乘以2逻辑右移一位相当于无符号数除以2循环移位指令循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环.
分为:ROLreg/mem,1/CL;不带进位循环左移RORreg/mem,1/CL;不带进位循环右移RCLreg/mem,1/CL;带进位循环左移RCRreg/mem,1/CL;带进位循环右移循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志演示演示演示演示应用:32位数据移位;将DX.
AX中32位数值左移一位shlax,1rcldx,1DXAXCF0考虑32位数据的右移等操作SHL和SAL指令的功能SHR指令的功能SAR指令的功能ROL指令的功能ROR指令的功能RCL指令的功能RCR指令的功能四、控制转移类指令控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令重点掌握:JMP/Jcc/LOOP/JCXZCALL/RET控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变1、目标地址的寻址方式相对寻址方式指令代码中提供目的地址相对于当前IP的位移量,转移到的目的地址(转移后的IP值)就是当前IP值加上位移量直接寻址方式指令代码中提供目的逻辑地址,转移后的CS和IP值直接来自指令操作码后的目的地址操作数间接寻址方式指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得用标号表达用标号表达用寄存器或存储器操作数表达目标地址的寻址范围:段内寻址段内转移——近转移(near)在当前代码段64KB范围内转移(±32KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移——短转移(short)转移范围可以用一个字节表达,在段内-128~+127范围的转移代码段代码段目标地址的寻址范围:段间寻址段间转移——远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr或farptr强制成为需要的转移类型2、无条件转移指令只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令操作数label是要转移到的目标地址(目的地址、转移地址)JMP指令分成4种类型:⑴段内转移、相对寻址⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址JMPlabel;程序转向label标号指定的地址第2章:无条件转移指令JMP(jump)JMPlabel;段内转移、相对寻址;IP←IP+位移量JMPr16/m16;段内转移、间接寻址;IP←r16/m16JMPfarptrlabel;段间转移、直接寻址;IP←偏移地址,CS←段地址JMPfarptrmem;段间转移,间接寻址;IP←[mem],CS←[mem+2]演示演示演示演示演示3、条件转移指令条件转移指令Jcc根据指定的条件确定程序是否发生转移.
其通用格式为:Jcclabel;条件满足,发生转移;IP←IP+8位位移量;;否则,顺序执行label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移label只支持短转移的相对寻址方式①Jcc指令的分类Jcc指令不影响标志,但要利用标志.
根据利用的标志位不同,分成三种情况:⑴判断单个标志位状态⑵比较无符号数高低⑶比较有符号数大小Jcc指令实际虽然只有16条,但却有30个助记符采用多个助记符,目的是为了方便记忆和使用②判断单个标志位状态⑴JZ/JE和JNZ/JNE利用零标志ZF,判断结果是否为零(或相等)⑵JS和JNS利用符号标志SF,判断结果是正是负⑶JO和JNO利用溢出标志OF,判断结果是否产生溢出⑷JP/JPE和JNP/JPO利用奇偶标志PF,判断结果中"1"的个数是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE利用进位标志CF,判断结果是否进位或借位例题1题目:将AX中存放的无符号数除以2,如果是奇数则加1后除以2问题:如何判断AX中的数据是奇数还是偶数解答:判断AX最低位是"0"(偶数),还是"1"(奇数).
可以用位操作类指令1:用逻辑与指令将除最低位外的其他位变成0,保留最低位不变.
判断这个数据是0,AX就是偶数;否则,为奇数2:将最低位用移位指令移至进位标志,判断进位标志是0,AX就是偶数;否则,为奇数3:将最低位用移位指令移至最高位(符号位),判断符号标志是0,AX就是偶数;否则,为奇数例题1解答—用JZ指令实现testax,01h;测试AX的最低位D0(不用AND指令,以免改变AX)jzeven;标志ZF=1,即D0=0:AX内是偶数,程序转移addax,1;标志ZF=0,即D0=1:AX内的奇数,加1even:shrax,1;AX←AX÷2用右移一位的方法实现除以2.
本例中用RCR指令比SHR指令更好.
例题1解答—用JNC指令实现movbx,axshrbx,1;将AX的最低位D0移进CFjnceven;标志CF=0,即D0=0:AX内是偶数,程序转移addax,1;标志CF=1,即D0=1:AX内的奇数,加1even:shrax,1;AX←AX÷2还可用SAR、ROR和RCR指令例题1解答—用JNS指令实现movbx,axrorbx,1;将AX的最低位D0移进最高位(符号位SF)jnseven;标志SF=0,即D0=0:AX内是偶数,程序转移addax,1;标志SF=1,即D0=1:AX内的奇数,加1even:shrax,1;AX←AX÷2错误!
循环指令不影响SF等标志ADDBX,0;增加一条指令例2判断是否为字母Y;寄存器AL中是字母Y(含大小写),则令AH=0,否则令AH=-1cmpal,'y';比较AL与小写字母yjenext;相等,转移cmpal,'Y';不相等,;继续比较AL与大写字母Yjenext;相等,转移movah,-1;不相等,令AH=-1jmpdone;无条件转移指令next:movah,0;相等的处理:令AH=0done:……比较无符号数高低无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal)两数的高低分成4种关系,对应4条指令JB(JNAE):目的操作数低于(不高于等于)源操作数JNB(JAE):目的操作数不低于(高于等于)源操作数JBE(JNA):目的操作数低于等于(不高于)源操作数JNBE(JA):目的操作数不低于等于(高于)源操作数比较有符号数大小判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否两数的大小分成4种关系,分别对应4条指令JL(JNGE):目的操作数小于(不大于等于)源操作数JNL(JGE):目的操作数不小于(大于等于)源操作数JLE(JNG):目的操作数小于等于(不大于)源操作数JNLE(JG):目的操作数不小于等于(大于)源操作数例:求较大值cmpax,bx;比较AX和BXjaenext;若AX≥BX,转移xchgax,bx;若AX
串操作指令执行时,由标志位DF决定地址指针的修改方向.
当DF=1时作减量修改;当DF=0时作增量修改.
因此,在串操作指令执行前,需对SI、DI和DF进行设置.
使用串操作指令一般要加重复前缀.
每一条指令即是一段循环程序,可以被中断.
串操作指令是唯一的一类源操作数和目的操作数都为存储器单元的指令.
1、字符串传送指令串传送指令MOVSB/MOVSW其功能是把位于DS段由SI指定的内存单元的字节数据或字数据传送到ES段由DI指定的内存单元.
指令不影响状态标志位.
例:把DS段1000H起始的100个字节的内容传送到ES段2000H起始的内存中.
MOVSI,1000HMOVDI,2000HMOVCX,100CLD;DF=0REPMOVSB;(SI)(DI)SI+1SIDI+1DICX-1≠0,继续传送重复前缀串比较指令CMPS其功能是比较DS和ES段中相对应的内容,可以通过重复前缀指明比较两段是否完全相同或不同,找出第一个相等或不相等的字符.
2、字符串比较指令例:MOVSI,2050HMOVDI,3000HMOVCX,20CLDREPZCMPSB;JNZNEQ;NEQ:(SI)与(DI)相比,如ZF=1继续比较.
(SI)+1、(DI)+1,(CX)-1,当CX=0或ZF=0时,停止比较.
(CX=0不影响ZF)编程比较从逻辑地址2000H:100H开始的10个字节与逻辑地址4000H:200H开始的10个字节是否对应相等,相等则转DONE.
MOVAX,2000HMOVDS,AXMOVAX,4000HMOVES,AXMOVDI,200HMOVSI,100HCLDMOVCX,10REPZCMPSBJZDONERETDONE例:判断是否加电成功MOVSI,0E2DHMOVDI,0400HCLDMOVCX,0004REPZCMPSBJZDONERETDONE:04000E2D12233445XXXXXXXXRAMROM3、字符串搜索指令SCAS串搜索指令SCAS其功能是把AL或AX中的内容与ES段由DI指定的一个字节数据或字数据进行比较,寻找与AL或AX内容相等或不相等的数据.
例:MOVDI,2000HMOVAL,FFHMOVCX,1000HCLDREPNZSCASB;JZEXC;EXC:AL与(DI)相比,如ZF=0继续比较.
(DI)+1,(CX)-1,当CX=0或ZF=1时,停止比较.
(CX=0不影响ZF)从逻辑地址9000H:100H开始的10个单元中如果有一个单元的内容为2CH,则BX加1.
MOVAX,9000HMOVES,AXMOVDI,100HCLDMOVCX,10MOVAL,2CHREPNZSCASBJNZAAAINCBXAAA:4、取字符串指令取字符串指令LODSB/LODSW其功能是把位于DS段由SI指定内存单元的内容取到寄存器AL或AX中.
指令不影响状态标志位.
一般不用重复前缀,可自动改变地址.
举例:将100H:20H单元开始的10个字节的内容均加5.
CLDMOVCX,10MOVAX,100HMOVDS,AXMOVSI,20HLL1:LODSBADDAL,5MOV[SI-1],ALDECCXJNZLL1HLT5、存字符串指令存字符串指令STOSB/STOSW其功能是把寄存器AL或AX中的内容存到ES段由DI指定的内存单元.
指令不影响状态标志位.
可用重复前缀.
例:MOVDI,2300HCLDMOVCX,100HXORAX,AXREPSTOSW六、子程序指令子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行演示转移指令有去无回子程序调用需要返回,其中利用堆栈保存返回地址1.
子程序调用指令CALLCALL指令分成4种类型(类似JMP)CALLlabel;段内调用、直接寻址CALLr16/m16;段内调用、间接寻址CALLfarptrlabel;段间调用、直接寻址CALLfarptrmem;段间调用、间接寻址CALL指令需要保存返回地址:段内调用——入栈偏移地址IPSP←SP-2,SS:[SP]←IP段间调用——入栈偏移地址IP和段地址CSSP←SP-2,SS:[SP]←CSSP←SP-2,SS:[SP]←IP2.
子程序返回指令RET根据段内和段间、有无参数,分成4种类型RET;无参数段内返回RETi16;有参数段内返回RET;无参数段间返回RETi16;有参数段间返回需要弹出CALL指令压入堆栈的返回地址段内返回——出栈偏移地址IPIP←SS:[SP],SP←SP+2段间返回——出栈偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2例、十六进制转换为ASCII码的子程序;子程序:将DL低4位的一位16进制数转换成ASCII码htoascprocanddl,0fh;只取DL的低4位ordl,30h;DL高4位变成3cmpdl,39h;是0~9,还是0Ah~0Fhjbehtoend;是0~9,转移adddl,7;是0Ah~0Fh,加上7htoend:ret;子程序返回htoascendp转换原理;主程序:调用子程序movdl,28hcallhtoasc3、中断指令和系统功能调用中断(Interrupt)是又一种改变程序执行顺序的方法中断指令有3条:INTi8IRETINTO本节主要掌握类似子程序调用指令的中断调用指令INTi8,进而掌握系统功能调用七、处理器控制类指令处理器控制类指令用来控制CPU的状态,使CPU暂停、等待或空操作等NOP;空操作指令,等同于"xchgax,ax"指令SEG:;段超越前缀指令:CS:,SS:,DS:,ES:HLT;暂停指令:CPU进入暂停状态还有其他指令:LOCKESCWAIT标志操作指令STC;CF=1STD;DF=1STI;IF=1CLC;CF=0CLD;DF=0CLI;IF=0CMC;CF取反第2章:总结本章展开了8088CPU16位指令系统的常用指令希望大家就如下几个方面进行一下总结:操作数寻址方式和目的地址寻址方式指令支持的操作数形式常用指令的助记符和功能指令对标志的影响通过复习整理,形成指令系统的整体概念,进而掌握常用指令指令执行第3章:习题1.
8086常用的寻址方式有哪些哪几种寻址方式的指令执行速度快2.
如在指令中不具体指明段寄存器,那么段地址如何确定3.
假设DS=3000H,BX=0870H,SI=010CH,d=45h以MOV指令为例,写出各种寻址方式下的指令形式,并求出数据的有效地址和物理地址.
4.
请指出下列指令中源操作数的寻址方式⑴MOVSI,120⑵MOVBP,[BX]⑶MOVAX,CX⑷POPBX⑸ANDDL,[BX+SI+30H]⑹XCHGAL,BUF5.
请指出如下程序段中每条逻辑指令执行后标志ZF、SF和PF的状态MOVAL,0AHANDAL,0FHORAL,4BHXORAL,AL6.
判断指令的对错,说明错误指令出错原因⑴MOV[SP],BX⑵MOVCX,BX⑶JMPBX⑷XCHG[SI],WED⑸SHLAX,CX⑹XCHGES:[BX],AL⑺LEAAX,[BX+SI]⑻INBL,DX⑼PUSHCS⑽MOVDH,345H7.
利用三种方法实现内存DS段2000H和2100H的两个字单元的内容互换.
8.
已知(SP)=2800H,(AX)=0010H,(BX)=0FA0H,(CX)=1002H.
求执行下列程序段后SP、AX、BX、CX的内容PUSHAXPUSHBXPUSHCXPOPBXPOPAX9.
分析程序执行后AX=CF=AF=MOVAX,2608HMOVBL,95HADDAL,BLAAA10.
分析程序执行后AX=CF=MOVAX,1E54HSTCMOVDX,95HXORDH,0FFHSBBAX,DXMOVAL,67H;AL=NEGAL;AL=ORAL,0A0H;AL=ANDAL,0F5H;AL=XORAL,0FH;AL=MOVAX,3267HROLAX,1ADCAL,AHMOV[3200H],AX执行上述指令后AX=[3200H]=[3201H]=13.
已知DS=1000H,将下面程序段执行后的结果填入相应的寄存器和内存单元.
UCloud优刻得商家这几年应该已经被我们不少的个人站长用户认知,且确实在当下阿里云、腾讯云服务商不断的只促销服务于新用户活动,给我们很多老用户折扣的空间不多。于是,我们可以通过拓展选择其他同类服务商享受新人的福利,这里其中之一就选择UCloud商家。UCloud服务商2020年创业板上市的,实际上很早就有认识到,那时候价格高的离谱,谁让他们只服务有钱的企业用户呢。这里希望融入到我们大众消费者,你...
Hostodo商家算是一个比较小众且运营比较久的服务商,而且还是率先硬盘更换成NVMe阵列的,目前有提供拉斯维加斯和迈阿密两个机房。看到商家这两年的促销套餐方案变化还是比较大的,每个月一般有这么两次的促销方案推送,可见商家也在想着提高一些客户量。毕竟即便再老的服务商,你不走出来让大家知道,迟早会落寞。目前,Hostodo有提供两款大流量的VPS主机促销,机房可选拉斯维加斯和迈阿密两个数据中心,且都...
炭云怎么样?炭云(之前的碳云),国人商家,正规公司(哈尔滨桓林信息技术有限公司),主机之家测评介绍过多次。现在上海CN2共享IP的VPS有一款特价,上海cn2 vps,2核/384MB内存/8GB空间/800GB流量/77Mbps端口/共享IP/Hyper-v,188元/年,特别适合电信网络。有需要的可以关注一下。点击进入:炭云官方网站地址炭云vps套餐:套餐cpu内存硬盘流量/带宽ip价格购买上...