第三章指令系统_第1页
第三章指令系统_第2页
第三章指令系统_第3页
第三章指令系统_第4页
第三章指令系统_第5页
已阅读5页,还剩163页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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=11,表明第二个操作数也在寄存器中,则R/M指明其名称,与REG编码相同。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,050ah MOVSI,DL ;非法指令,修正: ;movdh,0

;mov

si,dx非法指令--无法确定是字节量还是字量操作当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明

MOV[BX+SI],255 ;非法指令,修正: ;mov

byteptr[bx+si],255

;byteptr

说明是字节操作 ;mov

wordptr[bx+si],255

;wordptr

说明是字操作非法指令--两个操作数都是存储器8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)

MOVbuf2,buf1 ;非法指令,修正:

;假设buf2和buf1是两个字变量

;movax,buf1

;movbuf2,ax

;假设buf2和buf1是两个字节变量

;moval,buf1

;movbuf2,al非法指令--段寄存器的操作有一些限制8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活

MOVDS,ES ;非法指令,修正: ;mov

ax,es

;mov

ds,ax MOVDS,100H ;非法指令,修正: ;movax,100h

;mov

ds,ax

MOVCS,[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)AX

MOVDX,0382HINAL,DX;(0382H)AL

OUT62H,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,400H MOVSI,3CH LEABX,[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/reg

ADD

dest,src

;加法:dest←dest+src ;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数

SUB

dest,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②带进位加和减指令ADC

dest,src

;加法:dest←dest+src+CF ;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数SBB

dest,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)CMP

dest,src

;做减法运算:dest-src ;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系cmpax,bxcmpal,100④增量和减量指令INC

reg/mem

;增量(加1):reg/mem←reg/mem+1DEC

reg/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符号扩展成AX CWD ;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=07HBCD调整指令总结

1、非压缩BCD加法调整AAA,影响AF和CF

例:07H+05H

MOVAL,07H

ADDAL,05H;AX=000CH,CF=AF=0

AAA;AX=0102H,CF=AF=1

结论:若两数之和大于09,则CF=AF=1,AH=AH+12、压缩BCD加法调整DAA,影响AF、CF、PF、SF、ZF

例:56H+67H

MOVAL,56H

ADDAL,67H;AX=00BDH,CF=AF=0

DAA;AX=0023H,CF=AF=1

结论:若两数之和大于99(高位有进位),则CF=1,若低位BCD向高位BCD有进位,则AF=1,否则为0;AH不受影响。BCD调整指令总结

3、非压缩BCD减法调整AAS,影响AF和CF

例:05H-07H

MOVAL,05H

SUBAL,07H;AX=00FEH,CF=AF=1

AAS;AX=FF08H,CF=AF=1

结论:BCD相减有借位,则CF=AF=1,AH=AH-1,否则CF=AF=0。4、压缩BCD减法调整DAS,影响AF、CF、PF、SF、ZF

例:12H-34H

MOVAL,12H

SUBAL,34H;AX=00DEH,CF=AF=1

DAS;AX=0078H,CF=AF=1

结论:相减高位BCD有借位,则CF=1;低位BCD有借位,则AF=1,否则为0;AH不受影响。BCD调整指令总结

5、例:3456H+6767H

MOVAX,3456H

ADDAX,6767H;AX=9BBDH,CF=AF=0

DAA;AX=9B23H,CF=AF=1

结论:调整仅影响AL和标志位,AH不变。6、乘法BCD调整AAM,影响PF、SF、ZF

例:09H*08H

MOVAL,09H

MOVBL,08HMULBL;AX=0048H

AAM;AX=0702H结论:结果在AX中,非压缩BCD码BCD调整指令总结

7、MOVAX,0605H

MOVBL,03AAD;AX=0041H

DIVBL;AX=0215H

结论:先调整,后运算,商和余数不是BCD码。8、对比:

MOVAL,49H

MOVAH,66HADDAL,AH;AX=66AFH,CF=AF=0

AAA;AX=6705H,CF=AF=1

MOVAL,49H

MOVAH,66HADDAL,AH;

DAA;AX=6615H,CF=AF=1

9、对比:

MOVAX,0A070H

STCADCAX,5F8EH;AX=0FFFFH,CF=AF=ZF=OF=0INCAX;AX=0H,CF=0,AF=1,ZF=1,OF=0

MOVAX,0A070H

STCADCAX,5F8EH;AX=0FFFFH,CF=AF=ZF=OF=0ADDAX,8000H;AX=7FFFH,CF=1,AF=0,ZF=0,OF=1

10、MOVAX,0909H

MOVCX,0909HMULCX;DX=0051H,AX=0A251H

AAM;DX=0051H,AX=0801H

结论:只对AX中的结果进行调整。三、逻辑运算和移位指令逻辑运算即位操作,指令以二进制位为基本单位进行数据的操作当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令注意这些指令对标志位的影响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←dest⊕src只有相“异或”的两位不相同,结果才是1;否则,结果为0。可以使某些位取反。测试指令TEST对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志TESTdest,src

;dest∧src

AND与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循环移位指令循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:ROL

reg/mem,1/CL ;不带进位循环左移ROR

reg/mem,1/CL ;不带进位循环右移RCL

reg/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/JCXZ

CALL/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/m16

JMPfarptrlabel

;段间转移、直接寻址

;IP←偏移地址,CS←段地址

JMPfarptrmem

;段间转移,间接寻址

;IP←[mem],CS←[mem+2]演示演示演示演示演示3、条件转移指令条件转移指令Jcc根据指定的条件确定程序是否发生转移。其通用格式为:

Jcc

label

;条件满足,发生转移 ;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)

jz

even;标志ZF=1,即D0=0:AX内是偶数,程序转移 addax,1;标志ZF=0,即D0=1:AX内的奇数,加1even: shrax,1 ;AX←AX÷2用右移一位的方法实现除以2。本例中用RCR指令比SHR指令更好。例题1解答—用JNC指令实现 movbx,ax shrbx,1;将AX的最低位D0移进CF

jnc

even;标志CF=0,即D0=0:AX内是偶数,程序转移 addax,1;标志CF=1,即D0=1:AX内的奇数,加1even: shrax,1 ;AX←AX÷2还可用SAR、ROR和RCR指令例题1解答—用JNS指令实现 movbx,ax rorbx,1;将AX的最低位D0移进最高位(符号位SF)

jns

even;标志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=-1 cmpal,’y’ ;比较AL与小写字母y

jenext

;相等,转移 cmpal,’Y’ ;不相等, ;继续比较AL与大写字母Y

jenext

;相等,转移 movah,-1 ;不相等,令AH=-1

jmpdone

;无条件转移指令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和BX

jaenext ;若AX≥BX,转移 xchgax,bx ;若AX<BX,交换next: movwmax,ax如果AX和BX存放的是有符号数,则条件转移指令应采用JGE指令例:求较大值(另解) cmpax,bx ;比较AX和BX

jae

next movwmax,bx ;若AX<BX,wmax←BX

jmp

donenext: movwmax,ax ;若AX≥BX,wmax←AXdone:

……3、循环指令一段代码序列多次重复执行就是循环8088设计有针对CX计数器的计数循环指令

LOOPlabel ;循环指令 ;首先CX←CX-1;然后判断;若CX≠0,转移

JCXZlabel ;为0循环指令 :如果CX=0,则转移label操作数采用相对短寻址方式还有LOOPZ/LOOPE和LOOPNZ/LOOPNE两条指令deccxjnzlabel

与条件转移指令不同的是,循环指令隐含(CX)减1操作。循环指令

格式

LOOPxx符号地址

执行①(CX)←(CX)-1此操作不影响标志②检查转移条件,满足,转向目标地址去执行;

不满足,执行LOOPxx后一条指令转移方式

只允许段内直接短方式,跳转范围-128~127循环指令说明:在串中查找字符,查到了,就可退出,可用LOOPNZ,不相等时继续查找。

LOOPZ和LOOPNZ提供了提前结束循环的可能,

不一定要等到(CX)=0才退出循环。

LOOP退出循环条件是(CX)=0比较两串时,当有字符不等,就可退出,说明两字符串不等。可用LOOPZ,当相等时继续比较。执行完LOOPNZ或LOOPZ后,根据ZF标志的值判断结果对查找字符,ZF=1,说明找到;否则没有找到。

对串比较,ZF=1,说明两串相等;否则不等。五、串操作指令串指令可以对字节或字串进行操作。所有串操作指令都默认对DS段中用SI指定的源操作数及ES段中用DI指定的目的操作数寻址,可用段超越前缀改变。串操作指令执行时,由标志位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,100H

CLDMOVCX,10REPZCMPSBJZDONERETDONE┇例:判断是否加电成功

MOVSI,0E2DHMOVDI,0400HCLDMOVCX,0004REPZCMPSBJZDONERET……DONE: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],ALDECCXJNZLL1HLT

5、存字符串指令存字符串指令STOSB/STOSW其功能是把寄存器AL或AX中的内容存到ES段由DI指定的内存单元。指令不影响状态标志位。可用重复前缀。例:MOVDI,2300HCLDMOVCX,100HXORAX,AXREPSTOSW六、子程序指令子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后,采用RET返回指令回到主程序继续执行演示

转移指令有去无回子程序调用需要返回,其中利用堆栈保存返回地址1.子程序调用指令CALLCALL指令分成4种类型(类似JMP)CALLlabel

;段内调用、直接寻址CALLr16/m16

;段内调用、间接寻址CALLfarptrlabel

;段间调用、直接寻址CALLfarptr

mem

;段间调用、间接寻址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码htoasc proc anddl,0fh ;只取DL的低4位 ordl,30h ;DL高4位变成3 cmpdl,39h ;是0~9,还是0Ah~0Fh? jbehtoend ;是0~9,转移 adddl,7 ;是0Ah~0Fh,加上7htoend: ret ;子程序返回htoasc endp转换原理;主程序:调用子程序movdl,28hcallhtoasc3、中断指令和系统功能调用中断(Interrupt)是又一种改变程序执行顺序的方法中断指令有3条:

INTi8IRETINTO本节主要掌握类似子程序调用指令的中断调用指令INTi8,进而掌握系统功能调用中断调用、中断返回指令中断子程以类型号 N来区分共有256个类型号(0~FFH,即0~255)类型号0

处理除0错误的中断子程类型号4H

处理溢出时的中断子程类型号9H

处理键盘操作的中断子程类型号21H

与DOS系统功能相关的中断子程中断向量:中断子程的入口地址,包括段地址、偏移地址类型N的中断向量固定存放在4个内存单元中,即

(0:N×4~0:N×4+3)

其中:(0:N×4~0:N×4+1)存放偏移地址

(0:N×4+2~0:N×4+3)存放段地址中断向量表:存放256个中断向量的内存区域

4×256=1024=1K

中断向量表地址为0:0~0:03FFH

即0段前1K个内存单元,低端1K内存。类型FF中断向量类型0中断向量

、、段值类型0向量的偏值类型1向量的偏值

、、段值1020H3040H类型FF向量的偏值

、、段值类型1中断向量类型N中断向量0:00000:00040:N×40:03fc中断向量表0:0~3FF例中类型N的中断子程从3040:1020H开始▲有的中断子程在软、硬件条件满足时,CPU会自动去执行

例如:①除0时,CPU自动执行类型0的中断子程②按下某键,CPU自

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论