微机原理及单片机应用技术第3章-汇编语言与汇编程序设计基础课件_第1页
微机原理及单片机应用技术第3章-汇编语言与汇编程序设计基础课件_第2页
微机原理及单片机应用技术第3章-汇编语言与汇编程序设计基础课件_第3页
微机原理及单片机应用技术第3章-汇编语言与汇编程序设计基础课件_第4页
微机原理及单片机应用技术第3章-汇编语言与汇编程序设计基础课件_第5页
已阅读5页,还剩447页未读 继续免费阅读

下载本文档

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

文档简介

微机原理、汇编与接口技术微机原理、汇编与接口技术第三章程序设计的基本技术3.13.23.33.5符号指令的格式8088/8086CPU的寻址方式8088/8086CPU的指令系统汇编语言程序实现3.4伪指令3.6程序设计举例第三章程序设计的基本技术3.13.23.33.5符号指令操作助记符[目的操作数][,源操作数][;注释]操作助记符,它以符号形式给出该指令进行什么操作,如数据传送MOV、加ADD、减SUB和逻辑与AND等。操作数可以是操作数本身,可以是寄存器,也可以是地址表达式。有的操作数隐含在助记符中(形式上无操作数),有的只有1个操作数,有的有2个操作数,有的有3个操作数,故符号指令的表示中使用了可选择符号[]。3.1符号指令格式操作助记符[目的操作数][,源操作数][;注释]3.1指令格式:

标号:操作码,操作数

;注释标号:内存码段中存放该指令的第一个字节的地址。操作码:操作的性质。操作数:操作的对象,可以是操作数本身或存放操作数的内存(I/O端口)地址。注释:查看程序用,不参加编译运行。指令格式:标号:操作码,操作数;注释标号:内存码寻址方式:指令中如何求出操作数有效地址的方法。(1)立即寻址(2)寄存器寻址(3)直接寻址(4)寄存器间接寻址(5)寄存器相对寻址(6)基址变址寻址(7)相对基址变址寻址3.28088/8086CPU的寻址方式寻址方式:指令中如何求出操作数有效地址的方法。3.280寻址方式:寻找操作数的方式。计算机中操作数可以存放在以下几个地方:指令代码中,存放常量;MOVAX,2070H寄存器中:MOVAX,BX内存中:MOVAX,[2000H]I/O端口中:INAL,40H寻址方式:寻找操作数的方式。计算机中操作数可以存放在以下几个…………码段堆栈段数据段附加数据段…………码段1堆栈段数据段码段2每段的长度均小于64KB,即16位寄存器能表示的最大范围。…………码段堆栈段数据段附加数据段…………码段1堆栈段数据段(1)立即寻址操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在存储器的码段区域中。MOVAX,2030HB820304004H4003H4002H4001H4000H……30H20HB8H……4004H4003H4002H4001H4000H……20H30HB8H……内存地址内存内容错误!高字节高地址低字节低地址AXAHAL20H30H(1)立即寻址操作数直接放在指令中,紧跟在操作码的后面,与操(2)寄存器寻址操作数放在CPU内部的寄存器中,可以是8位或16位寄存器,注意源操作数和目的操作数的位数应一致。MOVAX,BX;将BX中的内容传送到AX中去MOVAL,BH;将BH中的内容传送到AL中去MOVAL,BX错误!不匹配(2)寄存器寻址操作数放在CPU内部的寄存器中,可以是8位或(3)直接寻址操作数存放在内存中,在指令中给出存放操作数的偏移地址,如果不加说明,默认的段基址是数据段。MOVAX,[0020H];将

数据段偏移地址为0020H的地址中的内容传送到AX中去,相当于:MOVAX,DS:[0020H](3)直接寻址操作数存放在内存中,在指令中给出存放操作数的偏………………12H34H56H…………码段堆栈段数据段……0000H0001H……0020H0021H0022H…………DS:0000H偏移地址内存内容MOVAX,[0020H]AXAHAL3412AX:3412H………………12H34H56H…………码段堆栈段数据段……0也可以传送内存中其他段的数据,在相应的偏移地址前加段超越符“:”。MOVAX,SS:[0020H];将

堆栈段偏移地址为0020H的地址中的内容传送到AX中去MOVES:[0100H],BX如果不加段超越,默认为数据段的偏移地址。也可以传送内存中其他段的数据,在相应的偏移地址前加段超越符“(4)寄存器间接寻址操作数存放在内存中,但其偏移地址存放寄存器中。在指令中只给出这个寄存器。MOVAX,[BX]BX中存放操作数的偏移地址其中,作为间址的寄存器只能有4个:BX,SI,DI,BP,其他寄存器无此功能。用BP寻址,段基址默认为堆栈段SS,其余3个的段基址默认为数据段DS,同时指令允许段超越。(4)寄存器间接寻址操作数存放在内存中,但其偏移地址存放寄存………………12H34H56H…………码段堆栈段数据段……0000H0001H……0020H0021H0022H…………DS:0000H偏移地址内存内容MOVAX,[BX]AXAHAL3412AX:3412HMOVBX,0020H………………12H34H56H…………码段堆栈段数据段……0MOVAX,ES:[BX];传送的操作数在附加段ES中,偏移地址存放在BX中。MOV[BP],BX;将BX中的内容传送到堆栈段中,其目的地的偏移地址存放在BP中。MOV[DI],2000H;将立即数2000H传送到数据段中,其目的地的偏移地址存放在DI中。MOVAX,ES:[BX];传送的操作数在附加段(5)寄存器相对寻址操作数存放在内存中,但其偏移地址需要计算。偏移地址=寄存器内容+指令中给定的偏移量MOVAX,[SI+0200H];欲传送的操作数在数据段中,其偏移地址是SI寄存器中的内容加上0200H同样,作为变址的寄存器只能有4个:BX,SI,DI,BP,其他寄存器无此功能。(5)寄存器相对寻址操作数存放在内存中,但其偏移地址需要计算用BP寻址,段基址默认为堆栈段SS,其余3个的段基址默认为数据段DS,同时指令允许段超越。MOVAX,0200H[BX]变址寻址可以有多种格式:MOVAX,[BX+0200H]MOVAX,0200H+[BX]例如:DS:3000H,BX:1000H数据所在的地址:高位:31201H低位:31200H用BP寻址,段基址默认为堆栈段SS,其余3个的段基址默认为数(6)基址加变址寻址操作数存放在内存中,但其偏移地址由两部分相加而成:基址寄存器内容+变址寄存器内容MOVAX,[BX+SI];欲传送的操作数在数据段中,其偏移地址是BX寄存器中的内容加上SI寄存器中的内容基址寄存器只有2个:BX,默认的段基址为DS;BP,默认的段基址为SS。(6)基址加变址寻址操作数存放在内存中,但其偏移地址由两部分变址寄存器只有2个:SI和DI。允许段超越。MOVAX,[BX+SI+0200H]MOVAX,0200H[BX+SI]MOVAX,0200H[BX][SI]MOVAX,0200H[BX][BP]MOVAX,0200H[SI][DI]必须是基址(BX或BP)加变址(DI或SI)MOVAX,0200H[BP+SI];欲取的数据在堆栈段变址寄存器只有2个:SI和DI。允许段超越。MOVAX,(7)相对基址加变址寻址操作数存放在内存中,但其偏移地址是由三部分相加而成:基址寄存器内容+变址寄存器内容+偏移量MOVAX,[BX+SI+0200H];欲传送的操作数在数据段中,其偏移地址是BX寄存器中的内容加上SI寄存器中的内容加上0200H基址寄存器只有2个:BX,默认的段基址为DS;BP,默认的段基址为SS。(7)相对基址加变址寻址操作数存放在内存中,但其偏移地址是由变址寄存器只有2个:SI和DI。允许段超越。MOVAX,[BX+SI]MOVAX,[BX+SI]MOVAX,[BX][SI]MOVAX,[BX][BP]MOVAX,[SI][DI]必须是基址(BX或BP)加变址(DI或SI)MOVAX,[BP+SI];欲取的数据在堆栈段变址寄存器只有2个:SI和DI。允许段超越。MOVAX,12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H10H20H30H40H50H60H70H80H23000H23001H23002H23003H23004H23005H23006H23007H1AH2AH3AH4AH5AH6AH7AH8AH31000H31001H31002H31003H31004H31005H31006H31007H1BH2BH3BH4BH5BH6BH7BH8BH33000H33001H33002H33003H33004H33005H33006H33007HDS:2000HSS:3000HBX:1000HBP:3000HSI:3004HMOVAX,3000HMOVAX,BXMOVAX,[3000H]MOVAX,[BX]MOVAX,BPMOVAX,[BP]MOVAX,[SI]MOVSI,0002HMOVAX,[BX][SI]MOVAX,[BP+02H]MOVAL,[BX+06H]MOVAX,[BX+SI+4H]AX:3000HAX:1000HAX:2010HAX:3412HAX:3000HAX:2B1BHAX:6050HSI:0002HAX:7856HAX:4B3BHAL:DEHAX:F0DEH12H34H56H78H9AHBCHDEHF0H21000H3.38086/8088指令系统数据传送指令算术运算指令逻辑指令串操作指令程序控制指令处理机控制指令3.38086/8088指令系统数据传送指令微机原理及单片机应用技术第3章--汇编语言与汇编程序设计基础课件3.3.1数据传送指令

1.通用数据传送指令所有的MOV传送指令都不能改变标志CS,IP不能作为目的操作数MOVCS,AX两个段寄存器间不能直接传送MOVSS,DS立即数不能直接传送给段寄存器

MOVDS,2000H内存单元间不能直接传送MOV[SI],[2000H]立即数不能作为目的操作数MOV1000H,AXMOVdest,src3.3.1数据传送指令1.通用数据传送指令所有的MOVMOVBL,AXMOV100,CXMOV[SI],AXMOVCS,AXMOV[SI],[DI]MOVBX,2[DI]MOVAX,CSMOVSS,2400HMOVAX,[BP+4]错误,不匹配错误,立即数不能赋值正确错误,CS不能赋值错误,内存间不能直接传送正确正确错误,段寄存器不能赋立即数正确MOVBL,AX错误,不匹配堆栈操作指令:堆栈是按先进后出的原则组织的一段内存区域,一般作临时存储器用(仓库)。其指针SP为16位的寄存器,始终指向栈顶(货物堆放的位置)。堆栈的空间大小是用户指定的。SS:2000H;堆栈段的段基址;表示堆栈从20000H处开始20000H假设用户定义堆栈为100个字节,则SP自动设置为0064H20064H100个字节SP:0064H进栈:PUSHsrc出栈:POPdest堆栈操作指令:堆栈是按先进后出的原则组织的一段内存区域,一般MOVAX,1234HPUSHAX20000H20064H100个字节SP(1)SP-1SPAH[SP]SP12H(2)SP-1SPAL[SP]SP34H先减指针,再压数据,先高后低POPBX(1)[SP]BLSP+1SP(2)[SP]BHSP+1SP先出数据,再加指针,先低后高BLBHSPSPMOVAX,1234H20000H20064H100个只能对16位数进行操作,一次压入弹出两个字节PUSHAH必须对寄存器的内容或内存单元的内容进行操作PUSH2000H设SP为0100H,SS为2000H,PUSHBP后,栈顶的物理地址是:20100H-2H=200FEH下列指令中,错误的是:PUSHDS B)POPCSC)PUSH30H[BX][SI] D)MOVSI,ES:[BP]B)POPCS只能对16位数进行操作,一次压入弹出两个字节PUSHAHMOVAX,1000HPUSHAXMOVBX,AXPUSH[BX]PUSH[1000H]POP[1002H]POPAXPOPBX12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H30000H30001H………………30060H30061H30062H30063H30064HDS:2000HSS:3000HSP:0064HSP:0064H100个字节10H00HBX:1000H34H12H34H12H34H12HAX:3412HBX:1000HMOVAX,1000H12H34H56H78H9AHB交换指令XCHGdest,srcdestsrc在寄存器之间,寄存器和内存之间的8位,16位数据可以相互交换。XCHGAL,AHXCHGAX,[BX]内存之间的数据不可相互交换

CS,IP不能参与交换段寄存器不能作为一个操作数交换指令XCHGdest,srcdest

累加器专用指令(只与AX或AL有关,与AH无关)输入输出指令CPU存储器输入输出INOUTAX或AL只能用IN、OUT指令向外设发命令;外设只能与CPU内部寄存器AL或AX进行数据传输。累加器专用指令(只与AX或AL有关,与AH无关)输入输出INAL,40HOUT40H,ALINAX,40HOUT40H,AX8位16位(40H)AL(41H)AHAL(40H)AH(41H)INAL,352HOUT400H,AL当外口地址大于8位(0FFH)时,用DX作间址MOVDX,352HINAL,DXMOVDX,400HOUTDX,ALINAL,40HOUT40H,ALIN,OUT只能对AL,AX操作,若传送的数据为16位,则外口地址只能取偶数。INAX,35HIN,OUT只能对AL,AX操作,若传送的数据为16表格查找指令(换码指令)

XLAT使累加器AL中的一个值变换为存储器表格中的某一个值,一般用来实现编码码制的转换。用BX指向表的首地址,AL中的内容为表中某一项与首地址之间的位移量。在执行查表指令时,将BX与AL中的内容相加,把得到的值作为地址,然后将此地址所对应单元中的值取到AL中去。DS段表格首地址[BX+AL]AL11H…………20H…………33H22HBXALBX+0…………BX+AL…………BX+2BX+1AL表格查找指令(换码指令)XLAT使累加器AL中的一个值执行该指令前,应该先建立一张表格,该表的最大容量为256字节。例:将十进制数字0~9变换成七段显示码的译码表01000000001111001140H79H40H79H24H30H19H12H02H78H00H10H0123456789执行该指令前,应该先建立一张表格,该表的最大容量为256字节例:从5号端口输入十进制数,转换为7段码后输出到20号端口。40H79H24H30H19H12H02H78H00H10H01234567892000H2001H2002H2003H2004H2005H2006H2007H2008H2009HDS段MOVBX,2000HINAL,5HXLATOUT20H,AL例:从5号端口输入十进制数,转换为7段码后输出到20号端口例:向端口40H送字符35。40H79H24H30H19H12H02H78H00H10H01234567892000H2001H2002H2003H2004H2005H2006H2007H2008H2009HDS段MOVBX,2000HMOVAL,3XLATOUT40H,ALMOVAL,5XLATOUT40H,AL例:向端口40H送字符35。40H79H24H30H19H12.地址传送指令取有效地址指令LEA:取存储器单元的偏移地址LEAAX,[2728H];地址为2728H,AX为2728H功能:将存储器地址送到一个寄存器。要求源操作数必须为存储器单元地址,目的操作数必须为一个16位的通用寄存器。该指令通常用来使一个寄存器作为地址指针。LEABX,[BP+SI];BX为BP+SI

的值2.地址传送指令取有效地址指令LEA:取存储器单元的偏取内存中的数

LDS将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS中。30H19H…………79H40H24H2133H2134H…………2131H2130H2132HDS段例:2130H~2133H这4个单元中存放着一个地址[2130H][2131H]为该地址偏移量[2132H][2133H]为该地址段值LDSDI,[2130H]执行后:DI:7940HDS:3024H取内存中的数LDS将指定内存中的4个字节(32位)分别取内存中的数LES将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器ES中。例:DS:1000HDI:0400H[10420H]=FFH[10421H]=00HLEAAX,20[DI];AX:0420HLEAAX,[DI];AX:0400H取内存中的数LES将指定内存中的4个字节(32位)分别12H34H56H78H9AHBCHDEHF0H00H10H23000H23001H23002H23003H23004H23005H23006H23007H23008H23009H例:DS:2000HMOVBX,3004HMOVAL,02HXLATLEABX,[3000H]LESSI,[BX+04H]LDSDI,[BX+02H]AL:DEHBX:3000HSI:BC9AHES:F0DEHDI:7856HDS:BC9AH12H34H56H78H9AHBCHDEHF0H00H10H3.标志传送指令读取标志:LAHF(LoadAHwithFlags):将标志寄存器FR中的低8位AH中OFDFIFTFSFZFAFPFCF1514131211109876543210D7D6D4D2D0AH设置标志:SAHF(SetFlagswithAH)上述指令的反向传输只提供8位标志位指令,保持对8位机指令的兼容性3.标志传送指令读取标志:LAHF(LoadAHw标志寄存器入栈命令:PUSHF将栈内内容进入标志寄存器:POPF:只有这个命令可以改变TF的内容。标志寄存器入栈命令:PUSHF3.3.2算术运算指令概念:算术运算涉及两种类型的数据:有符号型和无符号型,对加减法这两种类型采用同一套指令,对乘除法不能采用同一套指令。有符号数在计算机中以补码的形式存储。加减法:两个加数或减数同为一种数据类型;两种类型用不同的标准比较大小。有符号数加减运算要考虑溢出。3.3.2算术运算指令概念:算术运算涉及两种类型的数据:有微机原理及单片机应用技术第3章--汇编语言与汇编程序设计基础课件当相同符号数相加但结果变号时,产生溢出标志。例如:8+124000010000111110010000100结果:OF=1,CF=0例:8-5=8+(-5)0000100011111011100000011结果:OF=0,CF=1有符号数和无符号数指令相同,结果相同,但结果的意义不同。当相同符号数相加但结果变号时,产生溢出标志。例如:8+124当无符号数运算时,若CF=1,则超界。当有符号数运算时,若OF=1,则溢出,结果错误若运算结果为0,则ZF=1若运算结果为负数,则SF=1,即SF与最高位一致若运算结果中低8位有偶数个1,则PF=1若运算过程中低8位的位3向位4有进位,则AF=1当无符号数运算时,若CF=1,则超界。1.加减法指令一览表1.加减法指令一览表加法指令1)不带进位的加法ADDdest,srcdest+srcdest结果影响标志位两个操作数不可同为内存单元ADD[BX+DI],[2000H]ADD[BX+DI],2000HADDDX,50H[BX+SI]加法指令ADDdest,srcdest+src设AX=C544H,执行ADDAH,AL后,CF,OF?

C544109CF=1,OF=0MOVAX,5049HADDAX,0E2D7H5049E2D713320结果:CF=1,OF=0,ZF=0,SF=0,PF=0,AF=1设AX=C544H,执行ADDAH,AL后,2)带进位的加法ADCdest,srcdest+src+CFdest结果影响标志位两个操作数不可同为内存单元ADC[BX+DI],[2000H]ADC[BX+DI],2000HADCDX,50H[BX+SI]该指令主要用于多字节数相加2)带进位的加法ADCdest,srcdest例:两个四字节无符号数相加,这两个数分别放在以2000H和3000H开始的存储单元内,要求运算后得到的结果放在2000H开始的单元内。40H79H24H30H2000H2001H2002H2003H40HB9HA4H30H3000H3001H3002H3003HCLCMOVSI,2000HMOVAX,[SI]SIADDAX,[3000H]MOV[SI],AXMOVAX,[SI+2]ADCAX,[3002H]MOV[SI+2],AX例:两个四字节无符号数相加,这两个数分别放在以2000H和33)增量指令INCdestdest+1dest不影响CF,影响AF,OF,PF,SF和ZFINCALINC[BX]MOVAL,0FFHCF=0,ZF=13)增量指令INCdestdest+1dest减法指令1)不带借位的减法SUBdest,srcdest-srcdest结果影响标志位两个操作数不可同为内存单元SUB[BX+DI],[2000H]SUB[BX+DI],2000HSUBDX,50H[BX+SI]减法指令SUBdest,srcdest-srcMOVAX,5049HSUBAX,0E2D7H5049E2D76D72结果:CF=1,OF=0,ZF=0,SF=0,PF=1,AF=0MOVAX,5049H50496D2)带借位的减法SBBdest,srcdest-src-CFdest结果影响标志位两个操作数不可同为内存单元SBB[BX+DI],[2000H]SBB[BX+DI],2000HSBBDX,50H[BX+SI]该指令主要用于多字节数相加2)带借位的减法SBBdest,srcdest-3)减量指令DECdestdest-1dest不影响CF,影响AF,OF,PF,SF和ZFDECALDEC[BX]MOVAL,00HCF=0,ZF=03)减量指令DECdestdest-1dest不4)求补指令NEGdest;对操作数取补码后送回0–destdestNEGALNEGCX指令影响标志位AF,CF,OF,PF,SF和ZF,此指令执行时,只有当操作数为0时,CF为0,否则CF总为1。若操作数为80H或8000H,执行求补指令后,结果没有变化,但OF置1。4)求补指令NEGdest;对操作数取补码后送回5)比较指令CMPdest,src;dest-src不送回结果,只影响标志位

CMPAX,2000H;将AX内容与2000H相比较,结果影响标志位CMPAX,[BX+DI+100];比较结果影响标志位AF,CF,OF,PF,SF和ZF。5)比较指令CMPdest,src;desCMPAX,BX若结果ZF=1,可以判断AX与BX相等;若AX与BX均为无符号数,若CF为0,AX>BX;CF为1,AX<BX。若AX与BX均为有符号数,若OF与SF相同(同为1或0),AX>BX;否则AX<BX。指令系统针对有符号数和无符号数的比较分别提供了不同的判断指令。用户只需在应用时根据数据类型选择不同的指令即可。CMPAX,BX若结果ZF=1,可以判断AX与BX将字节扩展成字的指令:CBW将AL中的符号位扩展到AH中。当AL<80H,执行CBW后,AH=0;当AL>=80H时,AH=0FFH。当遇到两个字节相除时,要预先执行CBW指令,扩展被除数,否则不能正确执行除法操作。将AX中的符号位扩展到DX中。当AX<8000H,执行CWD后,DX=0;当AX>=8000H时,DX=0FFFFH。将字扩展成双字的指令:CWD2.扩展指令将字节扩展成字的指令:CBW将AL中的符号位扩展到AH中。当3.乘法指令约定:两个8位数相乘,有一个乘数在AL中,另一个乘数在寄存器或内存中,乘积在AX中;两个16位数相乘,有一个乘数在AX中,另一个乘数在寄存器或内存中,乘积的高16位在DX中,低16位在AX中。乘法有有符号数和无符号数两套指令8位数×8位数16位数16位数×16位数32位数3.乘法指令约定:8位数×8位数16位数16位数×无符号数乘法指令MULsrc;不出现AL或AXMULBL;AL×BLAXMULCX;AX×CXDX(高位),AX(低位)MULBYTEPTR[DI];AL×[DI]AXMULWORDPTR[SI];AX×[SI+1][SI]DX(高位),AX(低位)无符号数乘法指令MULsrc;不出现AL或2)有符号数乘法指令IMULsrc;不出现AL或AXIMULBL;AL×BLAXIMULCX;AX×CXDX(高位),AX(低位)IMULBYTEPTR[DI];AL×[DI]AXIMULWORDPTR[SI];AX×[SI+1][SI]DX(高位),AX(低位)功能上与MUL相似,要求两个乘数必须为有符号数2)有符号数乘法指令IMULsrc;不出现乘法运算时,结果影响CF和OF,AF,PF,SF,ZF标志位无意义。对MUL指令:当乘积的高半部分不为0,CF=1,OF=1;否则,CF=0,OF=0。对IMUL指令:当乘积的高半部分是低半部分最高位的扩展,乘积的高半部分每位与低半部分最高位相同时:CF=0,OF=0;否则,CF=1,OF=1。CF=1,OF=1表示高半部分包含有结果的有效数乘法运算时,结果影响CF和OF,AF,PF,SF,ZF例:MOVAL,0FBHMOVBH,02HIMULBH结果:AX=0FFF6H,即-10,CF=0,OF=0MOVAL,0FBHMOVBH,02HMULBH结果:AX=01F6H,即502,CF=1,OF=1例:MOVAL,0FBH结果:AX=0FFF6H,即4.除法指令约定:除数必须为被除数的一半字长被除数为16位,放在AX中,除数为8位,在寄存器或内存中,8位商在AL中,8位余数AH中;被除数为32位,放在DX(高位),AX(低位)中,除数为16位,在寄存器或内存中,16位商在AX中,16位余数DX中。除法有有符号数和无符号数两套指令16位数÷8位数8位数32位数÷16位数16位数4.除法指令约定:除数必须为被除数的一半字长16位数÷8位无符号数除法指令DIVsrc;不出现AX或DXAXDIVBL;AX÷BLAL(商),AH(余数)DIVCX;DXAX÷CXAX(商),DX(余数)DIVBYTEPTR[DI];AX÷[DI]AL(商)AH(余数)DIVWORDPTR[SI];DXAX÷[SI+1][SI]AX(商),DX(余数)无符号数除法指令DIVsrc;不出现AX或2)有符号数除法指令IDIVsrc;不出现AX或DXAX功能上与DIV相似,要求被除数,除数必须为有符号数。IDIVBL;AX÷BLAL(商),AH(余数)2)有符号数除法指令IDIVsrc;不出现注意:除法运算所有的标志位都没有意义;用IDIV指令时,如果是双字除以一个字,则商的范围为-32768~32767,如果是一个字除以一个字节,则商的范围为-128~127。如果超出这个范围,会作为除数为0来处理,产生0号中断;8086系统规定余数的符号和被除数相同;当8位数除以8位数,16位数除以16位数时,必须对被除数进行扩展。5)无符号数被除数扩展:将AH或DX清0。6)有符号数被除数扩展:对AH或DX符号扩展。注意:5)无符号数被除数扩展:将AH或DX清0。6)5.BCD码运算指令压缩BCD码:一个字节中有两位BCD码01000101非压缩的BCD码:一个字节只用低4位表示一位BCD码,高4位为0。0000010000000101BCD码:用二进制形式表示的十进制码。每一位十进制数用4位二进制表示,运算规则是逢十进一。十进制BCD码00000100012001030011401005010160110701118100091001BCD码运算时,先用一般的二进制运算,然后再进行BCD码调整。5.BCD码运算指令压缩BCD码:一个字节中有两位BCDBCD码加法十进制调整指令1)非压缩BCD码运算调整指令AAA两个非压缩BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AX中。MOVAL,7HADDAL,5HAAA;AL:0CH;AX:0102HCF=AF=1调整原则:在调整前若AL低半部包含的数值大于9或AF=1,则AAA完成下列操作:AL加6,AF和CF置1,AL的高4位清零。BCD码加法十进制调整指令1)非压缩BCD码运算调整指令A7+5=12用组合的BCD码表示运算过程:000001110000010100001100BCD码逢十进一,16进制逢16进1,因为低4位大于9,所以在个位上加6,使其产生进位,同时AF=1,CF=1。0000110000000110

0001001016进制加法AAA指令调整为10进制结果7+5=12用组合的BCD码表示运算过程:000009+9=18用组合的BCD码表示运算过程:000010010000100100010010BCD码逢十进一,16进制逢16进1,因为低4位有进位,AF=1,所以在个位上加6,使其成为十进制运算结果,同时AF=1,CF=1。0001001000000110

0001100016进制加法AAA指令调整为10进制结果9+9=18用组合的BCD码表示运算过程:000012)压缩BCD码运算调整指令DAA两个压缩BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中。MOVAL,56HADDAL,47HDAA;AL:9DH;AL:03HCF=1调整原则:如果AF=1或AL的低4位大于9,则AL加06H并置AF=1如果CF=1或AL的高4位大于9,则AL加60H并置CF=1。如果满足上述2条,则AL加66H,并置AF=1,CF=1。2)压缩BCD码运算调整指令DAA两个压缩BCD码相加,结MOVAX,1234HMOVBX,5678HADDAL,BLDAAMOVCL,ALMOVAL,AHADCAL,BHDAAMOVAH,ALMOVAL,CL;AL:ACH;AL:12HCF=1;CL:12H;AL:12H;AL:69H;AL:69HCF=0;AX:6912HCF=0MOVAX,1234H;AL:ACH;ALMOVAX,‘8’ADDAL,‘9’AAA;AX:0038H;AX:0071HAF=1;AX:0107HAF=1因为AF=1,所以AH=1,CF=1,AF=1,AL高4位清零。MOVAX,‘8’;AX:0038H;AXBCD码减法调整指令与加法调整指令类似,只是分别将加06H,60H,66H改为减06H,60H,66H。AAS:对非压缩BCD码减法调整DAS:对压缩BCD码减法调整必须紧跟在相对应的加减法指令后进行调整。BCD码减法调整指令与加法调整指令类似,只是分别将加06H,BCD码乘法十进制调整指令AAM1)BCD码均为无符号数,故只有用MUL乘法指令才能调整(将AL中小于64H的二进制数变换为非压缩BCD数送AX);2)BCD码乘法调整指令只能对非压缩BCD码相乘结果进行调整;MOVAL,05HMOVBH,06HMULBHAAM;AX:001EH;AX:0300HBCD码乘法十进制调整指令AAM1)BCD码均为无符1)BCD码均为无符号数,故只有用DIV除法指令才能调整,并且在两个数相除前进行调整;2)BCD码除法调整指令只能对非压缩BCD码相乘结果进行调整;MOVAX,0300HMOVBL,05HAADDIVBL;AX:001EH;AX:0300HBCD码除法十进制调整指令AAD1)BCD码均为无符号数,故只有用DIV除法指令才能调整1.逻辑运算指令1)NOT按位取反NOTdestAX:73HDX:85HMOVAX,DXNOTAXADDAX,DXINCAX0000000010000101111111110111101011111111111111110000000000000000对标志位没有影响3.3.3逻辑运算和移位指令1.逻辑运算指令1)NOT按位取反NOT2)AND与,

OR或,

XOR异或ANDdest,srcdestANDsrcdest这三条指令执行后,CF=0,OF=0,SF,PF,ZF发生变化。MOVAX,2050HANDAX,0FFHAX:0050HPF=1,SF=0,ZF=02)AND与,OR或,XOR异或ANDdXOR:相同出0,相异出1AL:00001111XORAL,0FFH000011111111111111110000XORAL,00H000011110000000000001111与0异或,状态不变;与1异或,状态相反。对某些位置1用OR;对某些位清零用AND;对某些位取反用XOR。XOR:相同出0,相异出1AL:0000111假设BX=11100011B,变量VALUE的值为:01111001B,确定下列各条独立指令的结果。XORBX,VALUEANDBX,VALUEORBX,VALUEXORBX,11111111B100110100110000111100011011110010110000111111011100110101111101111100011111111110001110000011100假设BX=11100011B,变量VALUE的值为:XO3)TESTTESTdest,src按位相与,结果只影响标志位destANDsrc影响标志TESTCX,0FFFFHJZP1;检验CX是否为零;若标志ZF=1,转向P13)TESTTESTdest,src按位相与,

2.非循环移位指令SAL(ShiftArithmeticLeft):算术左移SHL(ShiftLogicLeft):逻辑左移0CF左移一位进CF,右边补0,相当于乘2。影响标志若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。若移位位数大于1,所移的位数用CL存放。2.非循环移位指令SAL(ShiftArithmeticMOVAL,02HSALAL,1;AL:00000010;AL:00000100MOVAL,02HSALAL,4MOVAL,02HMOVCL,4SALAL,CL;AL:00000010;AL:00100000MOVAL,02H;AL:00000010SAR(ShiftArithmeticRight):算术右移CF最低位进CF,左边重复最高位,即操作数符号不变。一般用于有符号数的右移,符号扩展。若移位位数大于1,所移的位数用CL存放。MOVAL,-4SARAL,1;AL:11111100;AL:11111110-2SAR(ShiftArithmeticRight):算SHR(ShiftLogicRight):逻辑右移CF最低位进CF,左边补0。一般用于无符号数的右移。若移位位数大于1,所移的位数用CL存放。MOVAL,8SHRAL,1;AL:00001000;AL:0000010040SHR(ShiftLogicRight):逻辑右移CFMOVSI,-1MOVCL,4SALSI,CLANDSI,7FFFHORSI,8000HNOTSI;SI:1111111111111111;SI:111111111111000011111111111100000111111111111111;SI:0111111111110000;SI:1111111111110000;SI:0000000000001111MOVSI,-1;SI:1111111111试分析下面程序完成什么任务MOVCL,4SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BLAX0BL0DX0DXAX0试分析下面程序完成什么任务MOVCL,4AX0BL03.循环移位指令ROL(RotateLeft):不带进位循环左移CF若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。若移位位数大于1,所移的位数用CL存放。3.循环移位指令ROL(RotateLeft):不带进ROR(RotateRight):不带进位循环右移CF若移位位数大于1,所移的位数用CL存放。ROR(RotateRight):不带进位循环右移CF若RCL(RotatethroughCFLeft):带进位循环左移CFRCL(RotatethroughCFLeft):带RCR(RotatethroughCFRight):带进位循环右移CF可实现多字节的移位,将DX,AX左移1位SALAX,1RCLDX,1CFAX0CFDXCFRCR(RotatethroughCFRight):假定DX:10111001B,CL:3,CF:1SHRDX,1SARDX,CLSHLDX,CLSHLDL,1RORDX,1RORDX,CLSALDH,1RCLDX,CLRCRDL,1;DX:01011100CF:1;DX:00010111CF:0;DX:10111001000CF:0;DX:01110010CF:1;DX:100000000101

1100CF:1;DX:0010000000010111CF:0;DX:0000000010111001CF:0;DX:0000010111001100CF:0;DX:0000000011011100CF:1假定DX:10111001B,CL:3,C3.3.4串操作指令用一条指令实现对一串数据或字符的操作,字符或数据的个数在CX中,每执行一次CX自动减1,直至减到零串操作自动停止;源操作数在DS:[SI]中,目的操作数在ES:[DI]中;源操作数和目的操作数都在内存中,是唯一一条从内存到内存的指令;DF=1,地址自动由高至低,减量进行串运算;DF=0,地址自动由低至高,增量进行串运算。1.串操作指令3.3.4串操作指令用一条指令实现对一串数据或字符的操作串传送指令MOVSB:每次传送一个字节;MOVSW:每次传送一个字;将位于DS段,由SI所指出的存储单元的字节或字传送到位于ES段,由DI所指的存储单元中,再根据DF修改SI和DI,从而指向下一个元素,继续传送,直到CX为0为止。DS:SIES:DIDS:SIES:DIDS:SIES:DI串传送指令MOVSB:每次传送一个字节;将位于DS段MOVSI,1000HMOVDI,2000HMOVCX,100CLDKKK:MOVSBDECCXJNZKKK假设DS与ES段已经赋值;设置源操作数指针;设置目的操作数指针;传送的元素个数;DF=0,每传送一次,地址自动加1,继续传送;每次传送一个字节;传送一次,CX减1;CX不为0,继续转向KKK处MOVSB:相当于[DS:SI][ES:DI]SI=SI+1DI=DI+1(DF=0)MOVSI,1000H假设MOVSI,1000HMOVDI,2000HMOVCX,100CLDREPMOVSB通常,在串传送指令前加段前缀REP,程序可自动计数并判别是否传送完毕。REPMOVSB相当于

[DS:SI][ES:DI]SI=SI+1DI=DI+1CX=CX-1CX!=0MOVSI,1000H通常,在串传送指令前加段前缀串比较指令CMPSB:每次比较一个字节;CMPSW:每次比较一个字;将位于DS段由SI所指出的存储单元的字节或字和ES段由DI所指的字节或字相比较,并且在比较之后根据DF自动修改SI和DI,通过段前缀的控制,可以实现在两个字符串中寻找第一个不相等的元素或第一个相等的元素。串比较指令CMPSB:每次比较一个字节;将位于DS段依次比较两个字符串是一个循环过程,这个循环过程有两种退出条件,一是满足比较条件,比如找到第一个相等字符或找到第一个不相等的字符;二是没有满足比较条件但已比较完所有的字符。依次比较两个字符串是一个循环过程,这个循环过程有两种退出条件串操作指令前缀CX不影响ZF1)REP:

无条件重复前缀串操作指令前缀CX不影响ZF1)REP:无条件重复前缀2)REPE/REPZ:

相等时重复前缀2)REPE/REPZ:相等时重复前缀3)REPNZ/REPNE:

比较结果不相等时重复前缀3)REPNZ/REPNE:比较结果不相等时重复前缀3. 加前缀的串操作指令重复串传送REPMOVSBREPMOVSW重复串送存REPSTOSBREPSTOSW重复串装入REPLODSBREPLODSW3. 加前缀的串操作指令重复串传送判断一个微型机系统是否为初次加电,如果不是初次加电可以检测到在RAM的400H单元开始的4个字节分别设置了加电标志12,23,34,45。这4个字节的加电标志是在初次加电时,由ROM区(位于0E2DH单元开始的4个字节)复制过去的。当然,ROM区中的E2DH处的加电标志是永存的。假设ES指向RAM区,DS指向ROM区MOVSI,0E2DHMOVDI,0400HMOVCX,4CLDREPZCMPSB

JZ

DONE

RETDONE:……;后续处理相等继续比较如果4个字节都符合,表明设置好了加电标志否则返回ZF与CX无关判断一个微型机系统是否为初次加电,如果不是初次加电可以检测到MOVSB/STOSB/LODSB指令完成后指针(SI,DI)自动增加或减少(DF);加上段前缀后CX自动减1,并判断CX是否为0。若为0,终止循环。REPREPNZ/REPNEREPZ/REPECMPSBCMPSWMOVSW/STOSW/LODSWMOVSB/STOSB/LODSB指令完成后指针(SI,D取字符串指令LODSB/LODSW(LoadString)将位于DS段SI所指的存储单元的内容取到AL或AX中。用LODSB时,每次取一个字节,取完后,地址自动加1或减1;用LODSW时,每次取一个字,取完后,地址自动加2或减2。该指令一般不用段前缀,否则,AL或AX中的内容会被后一次操作覆盖,最后只能得到内存中字符串的最后一个字节或字。取字符串指令LODSB/LODSW(LoadStrALLODSBDS:SIDS:SIDS:SIDS:SIALLODSBDS:SIDS:SIDS:SIDS:SI存字符串指令STOSB/STOSW(StoreString)把AL或AX中的数据存放到位于ES段DI所指的存储单元中,并自动修改地址指针。该指令可加段前缀,使内存中连续的空间填满相同的数据。将从0404H开始的256个单元清零CLDLEADI,[0404H]MOVCX,80HXORAX,AXREPSTOSW存字符串指令STOSB/STOSW(StoreSt将从0700H单元开始的5个字节的内容逐一取来,放在累加器中进行处理,处理完后再送到0700H的内存区域。CLD MOVSI,0700H MOVDI,0700H MOVCX,5L1:

LODSB PUSHCX …… POPCX

STOSB DECCX JNZL1处理字符指令不用考虑指针DI,SI的变化将从0700H单元开始的5个字节的内容逐一取来,放在累加器中字符串检索指令SCASB/SCASW(ScanString)将AL或AX中的数据与位于ES段DI指针所指的内存单元的数据相比较,通过段前缀的控制,可以寻找到内存单元中的第一个与AL(或AX)不同或相同的数据。REPNZSCASB:(AL)-[ES:DI],不为0(不相等)时继续比较,DI自动加1或减1,CX自动减1,直到相等或CX为0时退出循环。寻找第一个相同的数据REPZSCASB:(AL)-[ES:DI],为0(相等)时继续比较,DI自动加1或减1,CX自动减1,直到不相等或CX为0时退出循环。寻找第一个不同的数据。字符串检索指令SCASB/SCASW(ScanSt有一字符串放在以2000H单元为始地址的内存中,从中搜索串结束符$,若有,将串长度x放入2100H单元,若没有$,2100H单元放入0FFH。CLDMOVDI,2000HMOVCX,100MOVAL,‘$’REPNESCASBJZDONEMOVAL,0FFHJMPSTODONE:MOVBX,100 SUBBX,CX DECBLMOVAL,BLSTO:MOV[2100H],AL不等继续比较若相等,转向DONE比较完毕CX=0,不等,设立标志计算字符串长度有一字符串放在以2000H单元为始地址的内存中,从中搜索串结3.3.5控制转移类指令1.转移指令64KB内段内转移,目标指令与转移指令在同一个代码段CS,只改变IPCS:IP新CS:IP均不影响标志位3.3.5控制转移类指令1.转移指令64KB内段内转移可以超过64KB段间转移,目标指令与转移指令分别在不同的代码段,转移时需要改变CS和IP的值CS:IP新CS:IP可以超过64KB段间转移,目标指令与转移指令分别在不同的代码格式:JMPtarget操作:将控制转向目的标号target:(1)target在段内:target的偏移地址→IP(2)target在段外:target的偏移地址→IPtarget的段首址→CS<1>.无条件直接转移指令格式:JMPtarget<1>.无条件直接转移指令段内直接转移:转移指令后直接给出目的指令处的地址。CS不变JMP立即数JMP2000H;立即数为16位或8位,是目的地的IP;IP=2000H段内直接转移:JMP立即数JMP2000H;立即数为段间直接转移:转移指令后直接给出目的指令处的地址CS:IP。JMP立即数JMP2000H:1236H;立即数为CS:IP的形式;CS=2000HIP=1236HJMP语句标号(子程序名)语句标号自动产生段间调用。段间直接转移:JMP立即数JMP2000H:1236

<2>.无条件间接转移指令格式:JMPdest

操作:

目的操作数为寄存器→寄存器内容送IP

目的操作数为字变量→字变量内容送IP

目的操作数为双字变量→双字变量内容送CS和IP

<2>.无条件间接转移指令格式:JMPdest段内间接转移:目的地指令处的地址存放在寄存器或内存单元中,转移指令后给出的是寄存器或内存单元的地址。JMPdest;dest为寄存器或内存单元地址JMPAX;AXIPJMPWORDPTR[2000H];[DS:2001H][DS:2000H]IPJMPWORDPTR[SI];[DS:SI+1][DS:SI]IP段内间接转移:JMPdest;dest为寄存器或内存单段间间接转移:目的地指令处的地址存放在内存单元中,一般用寄存器间接寻址。JMPDWORDPTR[SI];DS:[SI+3][SI+2]CSDS:[SI+1][SI]IPDS:SICSIP段间间接转移:JMPDWORDPTR[SI];DS设DS:2000H,BX:1256H,SI:528FHTABLE:20A1H,[232F7H]=80H,[232F8H]=32H,[264E5H]=50H,[264E6H]=24HJMPBX;IP=1256HJMPTABLE[BX];IP=3280HJMP[BX][SI];IP=2450H设DS:2000H,BX:1256H,SI:528<3>条件转移指令:根据标志位来判断程序是否转移。只能转移到距当前指令-128~127字节的范围内,即一个字节的补码范围;比较两数大小的指令,分有符号数和无符号数两套指令。127128<3>条件转移指令:只能转移到距当前指令-128~12通用格式:Jcondshort_lable操作:若满足条件,则OFFSETshort_lable→IP,实现转移;否则顺序执行.short_lable→短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128~127(从本指令则为-126~+129,因为条件转移指令均为双字节指令),故只能实现段内转移.通用格式:Jcondshort_lable根据5个标志位来判断,SF,ZF,PF,CF,OF共有10个状态,分别是:JS/JNSJZ/JNZJP/JNPJC/JNCJO/JNO为1/0转移。JSrel;rel为8位补码,在实际应用中一般为指令标号

判断无符号数大小的指令(CF和ZF):JA/JNBEJAE/JNBJB/JNAEJBE/JNA判断有符号数大小的指令(OF,SF和ZF):JG/JNLEJGE/JNLJL/JNGEJLE/JNG根据5个标志位来判断,SF,ZF,PF,CF,OF仅判断一个标志位实现转移.PF=0奇转移JNP/JPOPF=1偶转移

JP/JPEOF=0无溢出转移JNOOF=1溢出转移JOSF=0为正转移JNSSF=1为负转移JSCF=0无进(借)位转移JNCCF=1有进(借)位转移JCZF=0不相等/不等于0转移JNE/JNZZF=1相等/等于0转移JE/JZ标志设置功能指令助记符简单条件转移指令仅判断一个标志位实现转移.PF=0奇转移JNP/JPOPF=无符号数条件转移指令有4条指令助记符功能

JB/JNAE

低于/不高于等于转移

JNB/JAE

不低于/高于等于转移

JA/JNBE

高于/不低于等于转移

JNA/JBE

不高于/低于等于转移无符号数条件转移指令有4条无符号数条件转移指令有4条指令助记符功能

JB/JNAE

低于/不高于等于转移

JNB/JAE

不低于/高于等于转移

JA/JNBE

高于/不低于等于转移

JNA/JBE

不高于/低于等于转移无符号数条件转移指令有4条JCXZrel;如CX中的值为0则转移,判断循环用下面程序段在什么情况下的执行结果是AL=0BEGIN:INAL,5FHTESTAL,80HJZA1XORAX,AXJMPSTOPA1:MOVAL,0FFHSTOP:

温馨提示

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

评论

0/150

提交评论