




已阅读5页,还剩190页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章汇编语言程序设计基础,指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解Intel8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法,我们在这章里还要学习汇编语言程序设计的基本方法。,通过本章的学习,应当掌握以下内容:操作数的寻址方式常用指令的格式、功能、以及对标志位的影响了解汇编语言的基本知识和特点。熟悉汇编语言的程序结构、段定义以及语句的格式。掌握汇编语言常用伪指令的使用方法。熟练掌握汇编语言程序设计的基本方法:顺序结构、分支结构、循环结构和子程序结构。掌握程序设计中的宏指令和常用的系统功能的调用方法。,3、18086指令系统3.1.18086指令的寻址方式,操作码地址码,汇编指令:,操作码:指令的操作类型;地址码:指令所需的操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。例:MOVAX,CX;将CX的内容送入AX中。,本章主要介绍8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。,指令的寻址方式是指在指令中操作数的表示方式。大多数指令操作数的表示方式实际是操作数存放的位置。操作数存放的位置包括:指令中的立即数CPU内部的寄存器CPU外部的内存储器。操作数的地址在许多情况下是计算机在执行指令时根据指令的寻址方式通过计算产生的。一般来说,指令的寻址方式越丰富,指令系统的功能就越强,编程的灵活性就越好。,8086的寻址方式有:立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O端口寻址、程序转移操作寻址。存储器寻址又包括:直接寻址、寄存器间接寻址、基址寻址、变址寻址、基址变址寻址。注意:寻址方式只能产生存储器的有效地址EA-段内偏移地址,由EA在BIU中在和段寄存器组合才能产生20位的物理地址。,1、立即寻址方式:当操作数据就在指令中的地址码部分时,操作数与操作码一起在一条指令中即为“立即寻址”。指令中的这种操作数称为立即数,它可以随指令取指一起被取入CPU立即执行。立即数可以为8位或16位。数据例:MOVAL,5;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。例:MOVAX,3064H;源操作数为立即寻址指令执行后,AX=3064H,16位数据3064H存入AX寄存器。,OP,立即数,在指令中立即数可用16进制数(以H结尾),2进制数(以B结尾)和10进制数(用D或不加特殊符号)表示。也可以使用单引号括起来的ASCII码表达的字符和字符串。注意,如果16进制数以字母AF打头,则必须在前面加上一个“0”,这是汇编程序的要求.如:0B5H-16进制数B5H,0只用于识别,不保存。B5H-机器把它视为一个变量名。,8位立即数:MOVAL,43H;16进制立即数MOVAL,01000011B;2进制立即数MOVAL,67;10进制立即数16位立即数:MOVAX,4142H;16进制立即数MOVAX,0100000101000010B;2进制立即数MOVAX,16706;10进制立即数32位立即数:MOVEAX,12345678H字符或字符串立即数:MOVAL,AMOVAX,AB,立即数寻址方式由于操作数可以在取指令时就取入CPU,在CPU执行的时候不用等待取数据,所以执行速度很快。立即数寻址常用于已知常数的场合。例如:初始化程序中的赋初值。运算时已知的常数。注意:用单引号可以对字符的ASCII码进行立即数表示。例:MOVAL,A;执行后AL=41H,2、寄存器寻址方式寄存器寻址方式中指令的地址码是寄存器名,在对应寄存器中的内容就是操作数数据,寄存器包括8位或16位通用寄存器和段寄存器。寄存器可用作8086操作数的寄存器如下表所示。,OP,寄存器名,数据,8086寄存器寻址中的寄存器,注意:(1)当指令中的源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错;(2)两个操作数不能同时为段寄存器;(3)目的操作数不能是代码段寄存器,例如指令MOVCS,AX。,寄存器寻址由于数据在CPU内部,所以指令的执行速度也很快。常将一些常用的数据调入到寄存器中,程序执行时就可以减少CPU访问内存的次数,提高程序的执行速度。例如:MOVAL,DL;ALDLADDAX,BX;AXAX+BXMOVDS,AX;DSAXINCBX;BXBX+1,3存储器寻址方式在内存寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA(即偏移地址),段地址通常在隐含的某个段寄存器中。EA是由EU根据存储器寻址方式计算产生的一个16位偏移地址,该地址送入BIU后,在BIU里进行地址变换产生20位的存储器物理地址。BIU由EA可以自动产生对应的段寄存器。,(1)直接寻址方式在直接寻址方式中,指令的地址码直接给出操作数的偏移地址(有效地址EA),即:EA=直接段内偏移地址。偏移地址有直接地址值和地址标号两种形式,段地址隐含的由DS指定,也可以通过段超越指定其它段寄存器。,内存,例1:MOVAX,2000H将DS:2000H单元内容送入AX。AL(DS*10H+2000H)AH(DS*10H+2001H)例2:MOVAX,ES:2000H将ES:2000H单元内容送入AX。AL(ES*10H+2000H)AH(ES*10H+2001H)例3:MOVDL,2000H;DL(DS*10H+2000H),也可以使用符号地址。例:MOVAX,LABLE或MOVAX,LABEL将标号为LABLE(存放操作数单元的符号地址),即DS:LABLE中的内容送入AX。注意:使用数字地址时必须加方括号;使用符号地址时可以不加方括号,但符号地址必须是已定义的。例如:ABCDB25MOVAL,ABC;AL25,(2)寄存器间接寻址,寄存器间接寻址方式的操作数形式为:reg指令的地址码给出一个间址寄存器,对应的寄存器中存放有操作数在内存单元的偏移地址,即:EA=BX或SI或DI操作数的有效地址包含在基址寄存器BX或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器寻址相区别。,寄存器间接寻址的示意图:,OP,间址寄存器,偏移地址,BX、SI、DI,内存,例如:MOVAX,BX;将DS:BX单元内容送入AX。AL(DS*10H+BX)AH(DS*10H+BX+1)设BX=1000H,DS=5000H,则寻址的示意图为:,5000:0000H,5000:1000H,5000:1001H,5000:1002H,BB,AA,TAB:,AX,AHAL,AABB,间接寻址,数据段起始,1000H,BX,内存,操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。(BX)(SI)(DI),有效地址=,段寄存器为DS,物理地址计算方法:物理地址=DS*10H+BX或SI或DI注意:间址寄存器只能用BX、SI、DI,例:已知:(DS)=2100H,(DI)=2000H指令:MOVAX,DI;物理地址=DS*10H+DI=2100H*10H+2000H=21000H+2000H=23000H指令结果:将23000H单元内容送AL中,将23001H单元内容送AH中。,使用寄存器可形成地址指针,通过修改指针可实现程序对多个地址单元的间接访问。例如:MOVCX,100MOVBX,2500HL:MOVAL,BXINCBXLOOPL,2500H2501H2502H2503H2504H.,内存,(3)、基址寻址方式操作数在存储器内,指令中地址码给出一个基址寄存器,EA=基址寄存器+DISP(位移量)。基址寄存器:BX-数据段BP-堆栈段EA=BX+DISP8/DISP16物理地址=DS*10H+BX+DISP8/DISP16EA=BP+DISP8/DISP16物理地址=SS*10H+BP+DISP8/DISP16,段寄存器为DS,段寄存器为SS,基址寻址示意图:,内存,例:如果DS=3000H,BX=2000H,COUNT=3000H,则执行指令MOVAX,CONUTBX,求出此种寻址方式对应的有效地址和物理地址。有效地址=2000H+3000H=5000H物理地址=DS*10H+5000H=30000H+5000H=35000H指令也可以写成:MOVAX,BX+CONUT;MOVDX,BP+3000H;基址寻址可用于访存地址的再定位,用于数组数据的访问。,(4)、变址寻址方式操作数在存储器内,指令中地址码给出一个变址寄存器,EA=变址寄存器+DISP(位移量)。变址寄存器:SI或DI-数据段EA=SI+DISP8/DISP16物理地址=DS*10H+SI+DISP8/DISP16EA=DI+DISP8/DISP16物理地址=DS*10H+DI+DISP8/DISP16,段寄存器为DS,变址寻址的示意图:,内存,例:如果DS=4000H,SI=1000H,COUNT=500H,则执行指令MOVAX,CONUTSI,求出此种寻址方式对应的有效地址和物理地址。有效地址=1000H+0500H=1500H物理地址=(DS)*10H+1500H=40000H+1500H=41500H指令也可以写成:MOVAX,SI+CONUT;MOVDX,DI+3000H;变址寻址可用于访问数组数据,SI、DI可形成数组元素的下标,通过修改SI、DI中的变址值可以实现对数组不同元素的访问。,例如:ADBa0,a1,a2,a3,a4,a5,a99;MOVSI,0;SI执行数组元素a0MOVCX,100;循环100次L:MOVAL,ASI;取数组元素INCSI;SISI+1,指向下一元素LOOPL;循环,(4)、基址变址寻址方式:操作数在存储器中,指令中地址码给出一个基址寄存器(BX或BP)、一个变址寄存器(SI或DI)。EA=基址寄存器+变址寄存器有以下4条寻址指令的EA:EA=BX+SI;对应的段为DSEA=BX+DI;对应的段为DSEA=BP+SI;对应的段为SSEA=BP+DI;对应的段为SS,基址变址寻址的示意图:,OP,基址寄存器,变址寄存器,基地址,BX/BP,+,变址地址,SI/DI,内存,BXSIBPDI,有效地址=,+,物理地址=DS*10H+BX+SI或DI物理地址=SS*10H+BP+SI或DI例:MOVAX,BX+DI或MOVAX,BXDI(DS:BX+DI)字存储单元内容送AX。例:MOVAX,BP+SI或MOVAX,BPSI(SS:BP+SI)字存储单元内容送AX。,例:如果DS=2100H,BX=0158H,DI=10A5H,EA=11FDH,则执行指令MOVAL,BXDI有效地址:EA=BX+DI=0158H+10A5H=11FDH物理地址=DS*10H+有效地址EA=21000H+11FDH=221FDH执行结果:将221FDH单元内容送入寄存器AL中。,(5)、相对基址变址寻址方式:操作数在存储器中,指令中地址码给出一个基址寄存器(BX或BP)、一个变址寄存器(SI或DI)、一个相对位移量D。EA=基址寄存器+变址寄存器+DISP8/16有以下4条寻址指令的EA:EA=BX+SI+DISP;对应的段为DSEA=BX+DI+DISP;对应的段为DSEA=BP+SI+DISP;对应的段为SSEA=BP+DI+DISP;对应的段为SS,相对基址变址寻址的示意图:,OP,基址寄存器,变址寄存器,基地址,BX/BP,+,变址地址,SI/DI,内存,DISP,物理地址=DS*10H+BX+SI/DI+DISP8/16物理地址=SS*10H+BP+SI/DI+DISP8/16例:已知:DS=3000H,BX=2000H,SI=1000H,MK=0250H指令:MOVAX,MKBXSI或MOVAX,MKBX+SI或MOVAX,MK+BX+SI有效地址=MK+BX+SI=0250H+2000H+0100H=3250H物理地址=DS*10H+EA=30000H+3250H=33250H执行结果:将33250H单元内容送AL,33251H内容送AH。,段超越:当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。段超越前缀形式为-段寄存器名:例如:MOVAX,ES:BP;段地址在ESMOVAX,CS:BXSI;段地址在CS,段地址的基本约定和允许超越的情况如表所示:,对8086内存寻址方式的注解(1)在汇编后,指令中的变量名由具体的偏移地址所取代。(2)在寄存器相对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。(3)在Microsoft宏汇编MASM(MicrosoftMacroAssembler)中,内存操作数可以采用多种书写形式。(4)操作数中使用变量的地方也可以用下列形式:变量名整数表达式。,(5)计算出的有效地址以16位表示,若超过FFFFH,CPU将忽略所有溢出。(6)记忆8086内存操作数形式的简易方法如下:BX、SI、DIBX+disp、BP+dispSI+disp、DI+dispBX+SI、BX+DIBP+SI、BP+DIBX+SI+disp、BX+DI+dispBP+SI+disp、BP+DI+disp(7)不允许:BX+BP、SI+DI,4、程序转移寻址,段内转移:是指在同一段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的,程序中的转移地址为16位(一个字)IP。段间转移:则是要转到另一个段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成,程序中的转移地址为32位(双字)CS、IP。,转移地址有二种产生方式:(1)相对产生:目标地址(偏移)=IP+DISP8/16-段内(2)绝对产生:由指令、寄存器、存储器给出。-段内或段间。转移地址有三种寻址方式:直接寻址(16位段内-相对、32位段间-绝对)寄存器间接寻址(16位段内-绝对)存储器间接寻址(16位段内、32位段间-绝对),直接寻址:直接给出转移地址:以标号(符号地址)表示。标号的类型属性有NEAR,FAR,SHORT。寄存器寻址:给出寄存器名,寄存器的内容即转移的目的地址(仅段内用)。存储器寻址:指令中给出内存的有效地址EA,转移去的目的地址在数据段的内存单元中。,(1)相对寻址-只能实现段内转移,以IP的内容为基准地址,转移地址是以基准地址为基础在加上一个位移量产生。转移地址的偏移地址=IP+D,IP是转移地址的下条指令地址的偏移值。D为补码,可以是8位或16位。D=8位:转移范围为-128-+127,称为段内短转移。位移量D只有一个字节,是2字节指令。D=16位:转移范围为-32768-+32767,称为段内近转移。位移量D有二个字节,是3字节指令。,段内短转:加属性SHORT说明,为2字节指令。段内近转:加属性NEAR说明,为默认值,是3字节指令。例如:JMPSHORTA;IPIP+D8如果该转移地址的偏移地址是2052H,程序要转到A=205BH,D8=205B-(2052+2)=7(下条指令地址=2052+2=2054H)例如:JMPADDR;IPIP+D16(下条指令地址=当前指令偏移地址+3)寻址的示意图:P49-图3-1,(2)段内寄存器寻址:转移地址在通用寄存器中,执行时:IPreg,是一个段内转移。Reg为AX、BX、CX、DX、SP、BP、SI、DI例如:设AX=250BH执行指令:JMPAX;IPAX,IP=250BH(3)段内存储区间接寻址:转移地址在由EA寻址的字存储单元中。执行时:IP(EA),(EA)是用WORDPTR说明的字单元。例如:JMPWORDPTRBX;执行时:IP(DS*10H+BX)注意:EA同数据寻址的寻址方式。,(4)段间直接转移寻址:32位的转移地址在转移指令的第2、3字节和第4、5字节。,第2、3字节为转移的偏移地址,执行时送入IP.第4、5字节为转移的段地址,执行时送入CS.寻址示意图:P50图3-2,转移指令,第1字节第2字节第3字节第4字节第5字节,(5)段内存储器间接转移:转移地址在由EA寻址的双字存储单元中。执行时:IP(EA),CS(EA+2),EA是用DWORDPTR说明的双字单元。例如:JMPDWORDPTRBX;执行时:IP(DS*10H+BX)CS(DS*10H+BX+2)注意:EA同数据寻址的寻址方式。寻址到的前两个单元存的是转移的偏移地址,后两个单元存的是转移的段地址。寻址的示意图:P50图3-3,3.1.28086指令系统简析8086/8088的指令系统可以分为6组共100多条:(1)数据传送指令;(2)算术运算指令;(3)逻辑指令与移位指令;(4)串操作指令;(5)控制转移指令;(6)处理机控制指令;1、数据传送指令:共14条,可分为4组,见表3-1数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中。,指令中常用的符号:,src/s:源地址数,dest/d:目的地址数reg/r:通用寄存器mem/m:存储器(内存),有EA决定存储单元。sreg:段寄存器B:字节数据,W:字数据,数据传送指令表,(1)MOV(Move):传送指令MOV指令的格式为:MOVdest,src;destsrc功能:将源操作数src复制到目的操作数dest中,结果目的操作数的内容等于源操作数的内容,源操作数src的内容不变。对标志位的影响:无语法格式:MOVreg/mem/seg,reg/mem/seg/data8/16,可以实现的传送:REGREG;通用寄存器通用寄存器REGDATA;通用寄存器立即数REGMEM;通用寄存器存储器REGSREG;通用寄存器段寄存器MEMREG;存储器通用寄存器MEMDATA;存储器立即数MEMSREG;存储器段寄存器SREGREG;段寄存器通用寄存器(除CS)SREGMEM;段寄存器存储器(除CS),说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。MOVseg1,seg2;错误MOVmem1,mem2;错误(2)立即数不能传送到段寄存器中。MOVseg,data;错误(3)目的操作数不允许使用CS段寄存器。MOVCS,AX,(4)dest与src必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。有时MASM不能确定内存操作数的类型,需要用byteptr(字节属性说明)和wordptr(字属性说明)明确指出是字节或字类型。关于PTR的详细介绍在本章伪指令部分。(5)存储器数据由寻址方式产生的EA决定存储的单元。(6)不能直接传送时可以间接传送。例:MOVDS,2000H;错误改为正确传送:MOVAX,2000HMOVDS,AX,例:错误的MOV指令如下所示:MOVAX,BL;类型不匹配MOVDS,1000H;不允许立即数送段寄存器MOVBX,SI;不允许内存操作数之间传送MOVES,CS;不允许段寄存器之间传送MOVCS,AX;CS不能作为目的操作数例:设A、B是已定义的字节变量,以下是一些错误和正确的指令。MOVAX,A;错误,类型不匹配改为:MOVAX,WORDPTRA;类型匹配MOVB,0;正确,MASM可以判断出要送字节0,MOV指令传送示意(红色的线路不允许传送),REG,MEM,SREG,DATA,CS除外,CS除外,例:DS=3000H,SS=5000H,BX=1000H,BP=2000H,SI=3000H,DI=4000H,AX=1234H,(31000H)=5678H,(56000H)=35ACH,分别写出下列指令执行后的结果。(1)MOVAL,BH;ALBH,AL=10H(2)MOVCX,AX;CXAX,CX=1234H(3)MOVDX,BX;DX(DS*10H+BX)DX(31000H),DX=5678H(4)MOVSI,BP+DI;SI(SS*10H+BP+DI)SI(56000H),SI=35ACH,(5)MOVSP,0100H;SP0100H,SP=0100H(6)MOVBXSI,AX;(DS*10H+BX+SI)AX(34000H)AX(34000H)=1234H(7)MOVBXSI,0A58DH;(34000H)=A58DH(8)MOVES,BX;ES=1000H,(2)PUSH、(3)POP-堆栈操作指令堆栈概念-存储器的一段区域,按“先进后出”的原则进行存取的特殊存储区域。堆栈一端固定(栈底),另一端浮动(栈顶),数据只能从栈顶单元进出。用于指示堆栈栈顶单元地址的寄存器-SP(在CPU内部)。使用SP后,堆栈操作可以实现CPU自动管理存储地址指针(不用编程管理存储地址指针),该寻址也可称为隐含寻址。堆栈的作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。,8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元,堆栈操作是字数据操作。初始的时候需要设置栈底单元。每压入(PUSH)一次数据,首先SPSP-2,形成新的栈顶地址。(SS:SP)数据信息取出(POP)数据,首先数据(SS:SP)SPSP+2,形成PUSHPOP新的栈顶地址。,栈顶单元,SS:SP,栈底单元,堆栈操作指令:,指令格式:(2)进栈PUSHsrc;操作:SPSP-2;形成新栈顶(SS:SP)SRC;数据存入新栈顶(3)出栈POPDST;操作:dest(SS:SP);从栈顶取出数据SPSP+2;形成新栈顶,堆栈操作要求:,(1)必须是字操作。例如:PUSHAX例如:PUSHDL-不允许正确:PUSHDX;DH、DL一起压栈,实际只有DL是有效压入。(2)src允许reg或内存单元。不允许为字节B、立即数、sreg(3)dest允许reg或内存单元。不允许为字节B、立即数、sreg,堆栈,SS:01FB,SS:01FC,SS:01FD,SS:01FE,SP,(执行PUSHAX之前,设AX=A=1234H),堆栈,SS:01FB,SS:01FC,SS:01FD,SS:01FE,SP,执行PUSHAX;SPSP-2;SP=01FCH(SS:SP)AX,12H,堆栈,SS:01FB,SS:01FC,SS:01FD,SS:01FE,SP,执行POPAX;AX(SS:SP);AX=1234HSPSP+2;SP=01FEH,12H,1,2,3,SS:01FF,SS:01FA,SS:01FF,SS:01FA,34H,SS:01FF,34H,8086/8088系统的堆栈具有如下特点:堆栈是在内存的堆栈段中,具有“先进后出”的特点;堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;堆栈操作只能作字操作;SS:SP在任何时候都指向当前的栈顶。,(4)换码指令XLATXLAT-用于查表操作。查表操作:对一些函数值的产生,为了提高速度,计算机不是通过程序计算产生的,而是通过查表产生的。例如:求X2(0X15)平方值分别为:0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225建表操作(字节表)TABDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,TAB+1,TAB+2,TAB+3,TAB+4,TAB+5,TAB+6,TAB+7,TAB+8,TAB+9,TAB+10,TAB+11,TAB+12,TAB+13,TAB+14,TAB+15,TAB+0,产生X2的方法:设指针BX=TAB取查表值X计算X2值表指针=BX+X由(BX+X)单元取出X2值。例如:x=6表指针=BX+X=TAB+662=(BX+X)=(TAB+6)=36,实现的程序:TABDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225;平方表参数XDB6;X=要查询的值(0X15)YDB?;保留一个空单元MOVBX,offsetTAB;BX指向表首单元MOVAL,X;取查表索引值,AL=6MOVAH,0;转为16位,AX=0006ADDBX,AX;计算表地址BX=TAB+0006MOVAL,BX;AL(TAB+0006),AL=36MOVY,AL;(Y)=36,查表可以实现各种函数值的产生、代码变换、程序的多路分支等,用途很广。在8086实现上字节表查询可采用换码指令XLAT。XLAT的操作:AL(BX+AL)要求(1)只能用于字节表。(2)查表的索引值送AL.(3)查表得到的结果在AL中。,用XLAT实现的程序:TABDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225;平方表参数XDB6;X=要查询的值(0X15)YDB?;保留一个空单元MOVBX,offsetTAB;BX指向表首单元MOVAL,X;取查表索引值,AL=6XLAT;AL(TAB+06),AL=36MOVY,AL;(Y)=36使用XLAT可简化编程。,(5)、地址传送指令将操作数所在存储器的地址送入目标寄存器。指令格式:有效地址送寄存器:LEAreg16,mem;reg16mem指针送寄存器和DS:LDSreg16,mem32;把源操作数指定的4个相继字节到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。指针送寄存器和ES:LESreg16,mem32;把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI寄存器。,LEA指令与MOV指令的区别:LEASI,BUFF;指令是将标号BUFF的偏移地址送入寄存器中;MOVSI,BUFF;指令是将标号BUFF所指存储单元的内容送入SI。,BUFF=,2000H,2001H,2002H,2003H,2004H,2005H,48,00,FE,FF,LEASI,BUFF;或:MOVSI,offsetBUFF执行后:SI=2002HMOVSI,BUFF;执行后:SI=0048H,DS:,LDS或LES指令将源操作数指定的4个连续字节单元内容分别送入指令指定的寄存器以及DS或ES中。其中:低16位送到一个指定的字寄存器,高16位送到DS或ES中。,57H,13H,68H,24H,例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H,DS:2480H,DS:2481H,DS:2482H,DS:2483H,1357,2468,SI,DS,LDSSI,2480,(6)XCHG(Exchange):交换指令XCHG指令的格式为:XCHGopr1,opr2;交换oprd1与oprd2的内容语法格式为:XCHGreg/mem,reg/mem例:XCHGBX,BP+SI如指令执行前:BX=6F30H,BP=0200H,SI=0046H,SS=2F00H,(2F246H)=5154H,OPR2的物理地址=2F000+0200+0046=2F246H则指令执行后:BX=5154H(2F246H)=6F30H。,标志寄存器传送指令指令格式:LAHF;AHFR低字节SAHF;FR低字节AHPUSHF;SPSP-2,(SS:SP)FRPOPF;FR(SS:SP),SPSP+2,说明:LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。PUSHF/POPF指令是标志寄存器FR(PSW)与堆栈间进行的字型数据传送。注意:指令SAHF/POPF将影响标志位,其它传送指令执行后均不影响标志位。,2算术运算指令1、加法指令ADD/ADC不带进位的加:ADDdest,src;destdest+src带进位加法:ADCdest,src;destdest+src+CF要求:(1)dest可以为reg、memsrc可以为reg、mem、data(2)可以做W/B(字/字节)运算(3)dest、src不能同为mem。(4)运算后影响标志位。(5)运算的数据由编程人员指定为是否有符号。,例:MOVAL,25HADDAL,58H;AL=7DH00100101+0101100001111101CF=0结果无进位ZF=0结果非零SF=0结果为正OF=0结果无溢出,例:MOVAX,5250HMOVBX,0B58AHADDAX,BX;AL=07DAHCF=1ZF=0SF=0OF=0例:MOVDH,0MOVDL,7FHADDDL,0A0H;DL=1FH,CF=1ADCDH,0;DH=1,DX=011FH,(2)、减法指令SUB/SBB指令格式:不带借位减:SUBdest,src;destdest-src带带借位减:SBBdest,src;destdest-src-CF要求:同ADD注意:减法运算是将减数自动求机器负数后做补码加,此时计算CF用的是:CF=D7C或D15C,即求出的结果有进位时-借位=0,求出的结果无进位时-借位=1.不采用将减数自动求机器负数后做补码加时,即直接做减运算的时候,可根据是否有借位产生CF.(手工计算),不带进/借位加减用于单字节或单字数据的加减运算。带进/借位加减用于多字节或多字数据的加减运算。运算时可将上一个数据加减运算时产生的进/借位在下一个数据运算时加进位或减借位。多字节或多字数据的加减运算做循环编程时初值CF必须置为零。以便在第一次使用ADC/SBB时CF=0。例如:894558A9+7567477BFEACA024,(3)增量/减量指令INC/DEC:INCdest;destdest+1DECdest;destdest-1要求:dest可以为reg、mem,(B/W)INC、DEC指令不影响标志CF。常用于地址加1、减1或循环次数减一。对存储单元操作时注意需加属性说明。例如:INCBX;地址指针加1(如果是字地址需要用二条即加2或用ADDBX,2)DECCX;计数次数减1.INCBYTEPTRBX+SI;字节存储单元内容加1.INCWORDPTRBX+SI;字存储单元内容加1,(4)比较指令CMPCMPdest,src;destsrc,执行后不保存结果,设标志寄存器。注意:指令要求同SUB.该指令主要可用于比较-转移操作。例如:实现AX=0转L,否则顺序执行。CMPAX,0;AX-0JZL;结果为0则转L.;结果不为0顺序执行L:.,(5)求补指令NEGNEGdest;destdest+1要求:dest可以为reg、mem.(B/W)求补时是连同符号位一起按位变反,末位加一,不论正负,相当于求机器负数。例如:MOVAL,5AH;AL=01011010NEGAL;AL=10100110mem求补时需加属性说明是字节或字单元。,运算指令执行后对标志位的影响:在标志寄存器FLAGS中有若干标志位,这些标志用来表CPU当前的操作方式和状态信息。与普通应用程序有关的主要是FLAGS中的9个标志:6个状态标志(CF、OF、SF、ZF、AF、PF)3个控制信息标志(DF、IF、TF)深入认识CF和OFCF表示无符号溢出,即运算结果超出了无符号数的表示范围。OF表示带符号溢出,即运算结果超出了带符号数的表示范围。,CF和OF判断方法(1)加法CF的判断方法从十进制角度来看,若无符号数加的结果大于2n(n为位数),则CF=1,否则CF=0。从二进制角度来看,若结果最高位向前有进位,则CF=1,否则CF=0。OF的判断方法从十进制角度来看,若带符号加的结果不在范围n1n-11(n为位数)内,则OF=1,否则OF=0。从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则OF=1,否则OF=0。例:8位数加法,判断CF和OF,二进制加法看作无符号数看作带符号数00000110B66+00001001B+9+9,00001111B(15)15(CF=0)15(OF=0)00000111B7+7+11111011B+251+(5),00000010B(2)258(CF=1)+2(OF=0)1现为2结果错00001001B9+9+01111100B+124+(+124),10000101B(133/-123)133(CF=0)+133(OF=1)现为123,结果错10000111B135(121)+11110101B+245+(11),01111100B(124)3801321CF=1OF=1现为124,结果错现为124,结果错,(2)减法CF的判断方法从十进制角度来看,若无符号减数大于被减数,则CF=1,否则CF=0。从二进制角度来看,若结果最高位向前有借位,则CF=1,否则CF=0。OF的判断方法从十进制角度来看,若带符号减的结果不在范围n-1n-11(n为位数)内,则OF=1,否则OF=0。从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则OF=1,否则OF=0。,(6)压缩BCD码十进制加法调整指令DAA格式:DAA;调整指令执行的操作:这条指令执行前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。(7)压缩BCD码十进制减法调整指令DAS格式:DAS;DAS调整指令执行的操作:这条指令执行之前,必须先执行SUB或SBB指令,减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。,调整的方法:累加器AL低4位大于9或辅助进位标志位AF=1,则累加器AL加06H修正。累加器AL高4位大于9或进位标志位CF=1,则累加器AL加60H修正。累加器AL高4位大于等于9,低4位大于9,则累加器AL进行加66H修正。,例:进行BCD码加法运算59+68=1270101100159+011010006811000001C1+0110011066100100111127,加法运算结果为C1,AF=1,高位大于9,加66H进行压缩BCD调整,说明:压缩BCD码加法或减法十进制调整指令必须在ADD(ADC)或SUB(SBB)指令之后,调整结果对标志OF无影响,对其它状态标志位均有影响。减法十进制调整方法与加法十进制调整方法类同,只是将加6变为减6操作。,非压缩BCD码十进制调整指令指令格式:加法十进制调整AAA;减法十进制调整AAS;乘法十进制调整AAM;除法十进制调整AAD;,AAA指令将AL的内容变换成一位非压缩的十进制数。AAA检查AL低四位,如低四位是0-9的数字,AAA就清除AL的高四位,以及AF和CF标志;如AL低四位表示的数大于9或AF=1,AAA执行:加6到AL寄存器;加1到AH寄存器;置AF=1,CF=1;清除AL高四位为0。例:ADDAL,BL;AL和BL中的数相加AAA;非压缩BCD码调整,AAS指令检查AL低四位,如低四位表示的数是0-9的数字,ASS清除AL高四位及CF和AF标志;如AL低四位表示的数大于9或AF=1,AAS进行如下调整:,AL减去6;AH减去1;置AF=1,CF=1;清除AL中高四位。例:SUBAL,BL;AAS,AAM指令的作用是用10(0AH)来除AL寄存器的内容,并将除得的商和余数分别送到AH和AL来实现转换。例:MULBL;AL*BLAAM,(8)、乘法指令无符号数乘法MULSRC;AXAL*SRC字节乘;DX、AXAX*SRC字乘带符号数乘法IMULSRC;操作同上运算时,n位的被乘数*n位的乘数=2n的积字节乘:8位的被乘数必须存放在累加器AL,乘数可以用8位的reg/mem,乘积在寄存器AX中;字乘:16位的被乘数必须存放在累加器AX,乘数可以用16位的reg/mem,乘积在寄存器DX,AX中。源操作数不允许使用立即数。乘法指令运算结果只影响状态标志CF、OF。,例:MOVAL,25HMOVBL,20HMULAL,BL;AXAL*BL(MULBL)例:MOVAX,2500HMOVBX,20A5HMULAX,BX;DX、AXAX*BX(MULBX)不允许:MULAX,20A5H,(9)、除法指令无符号数除法:字节除:DIVSRC;ALAX/SRC除法的商AHAX/SRC除法余数字除:DIVSRC;AXDX、AX/SRC除法的商DXDX、AX/SRC除法余数带符号数除法IDIVSRC;操作同上。,除法:2n位被除数n位的除数n位的商和n位的余数当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。除数可以为reg/mem,不能是立即数。除法指令运算结果对状态标志无定义。除法运算要求被除数的高半部分除数(AHBL),产生商溢出,进入除法错中断。,(10)符号扩展指令:CBW/CWD带符号数除法运算中当被除数位数不够时,可进行扩展。字节扩展到字CBW;将AL中的符号位扩展到AH.在ALD7=0,则扩展AH=0;在ALD7=1,则扩展AH=FFH.字扩展到双字CWD;将AX中的符号位扩展到DX.在AXD15=0,则扩展DX=0;在AXD15=1,则扩展DX=FFFFH.,7,0,AL,7,0,AH,0,15,AX,DX,15,0,CBW,CWD,注意:不能对其他寄存器做符号扩展,例:MOVAL,75HCBW;AX=0075H例:MOVAL,85HCBW;AX=0FF85H例:MOVAL,25HMOVAL,25HMOVBL,06HCBWDIVBL;MOVBL,06H错误:不允许8位除8位。DIVBL;正确,注意:无符号数扩展位数时扩出的高位为全0.例:MOVAL,85HMOVBL,06HDIVBL;错误:不允许8位除8位。正确:MOVAL,85HMOVAH,0MOVBL,06HDIVBL;,注意:乘、除指令需要根据操作数是否有符号决定用不带符号或带符号的乘除运算。例:MOVAL,0AHMOVBL,0FFHMULBL;AX=2550(AL=10,BL=255)例:MOVAL,0AHMOVBL,0FFHIMULBL;AX=-10(AL=10,BL=-1),3、位处理指令(逻辑运算指令与循环移位指令)共有13条,分为3组,如表3-3逻辑运算指令:对字节或字数据进行按位的操作。(1)逻辑与:ANDdest,src;destdestsrc(2)逻辑或:ORdest,src;destdestsrc(3)异或:XORdest,src;destdestsrc(4)测试:TESTdest,src;destsrc,设标志(5)逻辑非:NOTdest;destdest,逻辑指令的要求与特点:可以进行字节或字运算。运算时按位进行,位与位之间无进借位的关系,CF=0目的dest允许为reg/mem,源src允许为reg/mem/data非指令NOT不影响标志位。测试指令TEST不回送结果,由与运算后产生的结果设置标志位。,逻辑指令的功能:AND指令主要用来屏蔽掉一个数中某些位(拆字),以便对剩下的其它位进行某些处理。方法:屏蔽的位同0与,保留位同1与。例如:设AL=00110101(ASCII码数字5)如果要拆去高四位,保留低四位的BCD码执行:ANDAL,0FH;AL=00000101(05H),例:ANDAX,BX;两个寄存器逻辑与ANDAL,MEM-BYTE;寄存器和存储单元逻辑与ANDMEM-BYTE,AL;存储单元和寄存器逻辑与ANDAL,0;AL=0,CF=0可用于清除累加器,同时又清除了进位标志。,OR指令可用于装字(装1)方法:装1位同1或(相或后=1),保留位同0或(相或后原值不变)。例:ORBX,0C000B;BX1100000000000000,将BX的两位最高的有效位(D15和D14位)置成1,而其它位不变。例:设AX=00000101B(低4位是BCD码的5)现需要把它变为ASCII的5-00110101。执行:ORAL,00110000B;执行后AL=00110101.,XOR指令主要用于判断两个操作数中那些位是不同的。如两个操作数相对应位的值不同时,在目的操作数产生一个1。相同为0,不同为1。也可用于对指定位求反,方法是:求反位同1异或,保留位同0异或。例:设BL=10101111对D7D6D3D1位求反,执行的指令为:XORBL,11001010B;BL=01101010B101011111100101001100101,TEST指令是一条测试指令,它执行的操作与AND相同,不过它不送回结果,只影响标志位。TEST指令主要可用于形成测试转移操作,其功能类似于比较转移.例:测试AL的D7位为0时,转移到L执行,否则顺序执行,实现的指令为:TESTAL,10000000B;测D7是否为0JZL;为0,转L;不为0,顺序执行下一条L:.,NOT指令改变寄存器或存储单元的每一位状态,对原值求反(连同符号位一起按位变反,原来为0变为1,原为1变为0)。例:设AX=5AAFHNOTAX;AX=A550H5AAFH=01011010101011111求反后:=1010010101010000,移位指令(6)逻辑左移:SHLdest,count(7)算术左移:SALdest,count(8)逻辑右移:SHRdest,count(9)算术右移:SARdest,count,要求:dest允许为reg/mem.可以是B/W.count=1时可以直接表示在源地址里。count1时可以在源地址里需要用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年保安技师考试大题及答案
- 哲学漫画类试题专项突破导学案 高考政治一轮复习统编版必修四
- 2025年安装计量计价考试及答案
- 2025年xyz考试题及答案
- 2025年衡水教师招聘真题及答案
- 泥绒网铺挂施工方案
- 项目草皮种植方案范本
- 2025合同解除协议范本-终止劳动合同协议
- 街道栏杆拆除方案范本
- 商丘水包水建筑施工方案
- 租赁沐足店合同协议书
- 拆迁权利转让协议书
- 微电子器件(4-11)多栅结构MOSFET与FinFET
- 伴郎伴娘租赁协议合同
- 鄂托克高新技术产业开发区固废处理场建设项目环评报告书
- 老年焦虑障碍课件
- 产科护理个案分享案例
- 结肠癌根治术后护理
- 《婚姻家庭辅导》课件
- 新统计法培训
- 养老院有限空间环境安全管理制度
评论
0/150
提交评论