《微机原理指令系统的学习.ppt》由会员分享,可在线阅读,更多相关《微机原理指令系统的学习.ppt(132页珍藏版)》请在三一办公上搜索。
1、1,微型计算机原理及应用,2,第二章 8086/8088指令系统,3,2.1 寻址方式 2.2 8086/8088指令系统 2.2.1 数据传送指令 2.2.2 算术运算指令 2.2.3 逻辑运算和移位指令 2.2.4 程序控制指令 2.2.5 串操作指令 2.2.6 标志处理与CPU控制指令,4,2.1 8086/8088寻址方式,指令格式:,操作码 操作数,操作码:计算机所要执行的操作,或指出操作类型,是一种助记符。,操作数:操作的对象,可以是操作数本身或存放操作数的内存(I/O端口)地址或其它有关操作数的信息。,5,汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操
2、作数或操作数地址,它与机器指令是一一对应的。,6,寻址方式:是指令中用于说明如何寻找操作数的方法。,计算机中操作数常存放在以下几个地方:指令代码中,存放常量;MOV AX,2070H寄存器中:MOV AX,BX内存中:MOV AX,2000HI/O端口中(仅对IN/OUT指令):IN AL,40H,7,80868088的基本寻址方式有六种:,寄存器寻址;操作数存放在寄存器中立即寻址;操作数存放在内存代码段直接寻址;操作数存放在内存寄存器间接寻址;操作数存放在内存变址寻址;操作数存放在内存基址加变址寻址;操作数存放在内存,8,一、寄存器寻址,操作数放在CPU内部的寄存器中,可以是8位或16位寄存
3、器,注意源操作数和目的操作数的位数应一致。,MOV AX,BX,;将 BX中的内容传送到AX中去,MOV AL,BH,;将 BH中的内容传送到AL中去,MOV CL,AX,错误!不匹配,9,二、立即寻址,操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在存储器的代码段中(8/16位)。,MOV AX,2030H 对应机器码:B8H 2030H,内存偏移地址,单元内容,注意别错!,高字节 高地址低字节 低地址,20H,30H,10,三、直接寻址,操作数存放在内存中,在指令中给出存放单元的偏移地址,如果不加说明,操作数默认在数据段。,MOV AX,0020H,;将 数据段偏移地址为0020
4、H的地址中的内容传送到AX中去,相当于:MOV AX,DS:0020H注意:书写时加方括号。,物理地址:(DS)16指令中给的16位偏移地址,11,码段,堆栈段,数据段,DS:0000H,偏移地址,内存内容,MOV AX,0020H,34,12,AX:3412H,12,也可以指向内存中其他段的数据,这时要在相应的偏移地址前加段超越符和“:”。,MOV AL,ES:0020H,;将 扩展段中偏移地址为0020H单元中的内容传送到AL中去,MOV SS:0100H,BX,;将 BX中的内容传送到堆栈段中偏移地址为0100H、0101H的单元中去,13,四、寄存器间接寻址,操作数存放在内存中,但其偏
5、移地址存放在指令中给出的寄存器中。,MOV AX,BX,BX中存放操作数的偏移地址,其中,作为间接寻址的寄存器只能有4个:BX,SI,DI,BP,其他寄存器无此功能。,14,1、对DI、SI、BX间接寻址,2、对BP间接寻址,注意:用BP间接寻址,操作数默认在堆栈段,用其余3个寄存器时,操作数默认在数据段。,物理地址:(DS)16DI/SI/BX中给的16位偏移地址,物理地址:(SS)16BP中给的16位偏移地址,15,码段,堆栈段,数据段,DS:0000H,偏移地址,内存内容,MOV AX,BX,00,78,AX:0078H,MOV BX,1100H,16,例1:MOV AX,ES:BX,;
6、传送的操作数在附加段中,偏移地址存放在BX中。,例2:MOV BP,BX,;将BX中的内容传送到堆栈段中,其目的地的偏移地址存放在BP中。,例3:MOV CX,2000H,;错,不能对CX间接寻址,17,五、变址寻址,操作数在内存中,由指定的寄存器内容,加上指令中给出的8位或16位偏移量作为操作数的偏移地址,计算方法:,偏移地址寄存器内容指令中给定的偏移量,同样,作为变址的寄存器只能有4个:BX,SI,DI,BP,其他寄存器无此功能。,18,1、对DI、SI、BX变址寻址,2、对BP变址寻址,物理地址:(DS)16计算出的偏移地址,物理地址:(SS)16计算出的偏移地址,注意:用BP变址寻址,
7、操作数默认在堆栈段,用其余3个寄存器时,操作数默认在数据段。,19,MOV AX,TABDI,变址寻址可以有多种格式:,MOV AX,BX+0A00H,如:MOV AX,0200H+BX,假设DS:3000H,BX:1000H 则操作数所在地址:,高8位:31201H 低8位:31200H,MOV DH,SI+0200H,;此时传送的操作数在数据段中,其偏移地址是SI寄存器中的内容加上0200H,20,六、基址加变址寻址,操作数存放在内存中,但其偏移地址是由三部分相加而成:,基址寄存器内容变址寄存器内容偏移量,基址寄存器只有2个:BX,默认的操作数在数据段;BP,默认的操作数在堆栈段。,变址寄
8、存器只有2个:SI和DI。偏移量同样由指令给出。,21,1、BX作为基地址,2、BP作为基地址,物理地址:(DS)16计算出的偏移地址,物理地址:(SS)16计算出的偏移地址,22,MOV AX,VALBX+SI,MOV AX,0200HBXSI,MOV AX,0200HBXBP;错误,MOV AX,0200HSIDI;错误,MOV AX,COUNTBP+SI,;欲取的数据在堆栈段,MOV AX,BX+SI+0200H,;欲传送的操作数在数据段中,其偏移地址是BX寄存器中的内容加上SI寄存器中的内容加上0200H,23,DS=2000H SS=3000H BX=1000H BP=3000H,M
9、OV AX,BXMOV AX,3000HMOV AX,BXMOV AL,BPMOV SI,0002HMOV CX,BXSIMOV DL,BX+06H,AX=1000HAX=2010HAX=3412HAL=1BHSI=0002HCX=7856HDL=DEH,24,2.2 8086/8088指令系统,8088/8086指令系统可以分为以下六个功能组:,数据传送(Data Transter)算术运算(Arithmetic)逻辑运算(Logic)程序控制(Program Control)串操作(String Menipulation)标志处理 和CPU控制(Processor Control),25,
10、一、数据传送指令,1.通用数据传送指令,格式:MOV OPRD1,OPRD2功能:(OPRD2)OPRD1CPU内部寄存器之间数据的传送(除CS、IP)立即数传送至CPU内部的通用寄存器组CPU内部的寄存器(除CS、IP)与存储器(所有寻址方式)之间能实现用立即数给存储单元赋值,26,CS,IP不能作为目的操作数 MOV CS,AX两个段寄存器间不能直接传送 MOV SS,DS立即数不能直接传送给段寄存器 MOV DS,2000H内存单元间不能直接传送 MOV SI,2000H立即数不能作为目的操作数 MOV 1000H,AX,注意:,27,MOV BL,AXMOV 100,CXMOV SI,
11、DIMOV CS,AXMOV SI,DIMOV BH,2DIMOV AX,CSMOV SS,2400HMOV BP+4,AX,错误,不匹配错误,立即数不能赋值正确错误,CS不能赋值错误,内存间不能直接传送正确正确错误,段寄存器不能赋立即数正确,28,2.堆栈指令,堆栈是按先进后出的原则组织的一段内存区域,一般作临时存储器用(仓库)。其指针SP为16位的寄存器,始终指向栈顶(货物堆放的位置)。堆栈的空间大小可用户指定。如:,SS的值为 2000H 表示堆栈从20000H处开始,20000H,假设用户定义堆栈为100个字节,则SP自动设置为0064H,20064H,100个字节,SP:0064H,
12、29,1、格式:PUSH OPRD 功能:(OPRD)入栈,20000H,20064H,100个字节,SP,(1)SP-1SP AHSP,SP,12H,(2)SP-1SP ALSP,SP,34H,先减指针,再压数据,先高后低,(1)SPBL SP+1SP,(2)SPBH SP+1SP,先出数据,再加指针,先低后高,弹出低字节,弹出高字节,SP,SP,堆栈的操作有两种:入栈/出栈,例:MOV AX,1234H PUSH AX;入栈,2、格式:POP OPRD 功能:栈顶内容送OPRD,30,注意:只能对16位数进行操作,一次压入弹出一个字,PUSH AH;错,必须对寄存器的内容或内存单元的内容进
13、行操作,PUSH 2000H;错 PUSH 2000H;对,例:设SP为0100H,SS为2000H,PUSH BX后,栈顶的物理地址是:,20100H2H=200FEH,而执行POP BX后,栈顶的物理地址是:,20100H2H=20102H,31,MOV AX,1000HPUSH AXMOV BX,AXPUSH BX POP 1002HPOP BX,例:设DS 2000H SS3000H SP0064H,执行下列程序:,SP,10H,00H,BX 1000H,34H,12H,34H,12H,BX1000H,SP,SP,SP,32,3.交换指令XCHG,格式:XCHG OPRD1,OPRD2
14、,功能:(OPRD1)(OPRD2),完成通用寄存器之间,通用寄存器与累加器之间、与存储器之间8位,16位数据的相互交换。,例如:XCHG BL,AH,XCHG AX,BX,内存之间的数据、累加器之间不可相互交换 CS,IP不能参与交换段寄存器和立即数不能作为一个操作数,33,4.累加器专用指令(只与AX或AL有关,与AH无关),1)输入输出指令,CPU,存储器,输入,输出,IN,OUT,AX或AL,格式:IN AL,PORT IN AX,PORT功能:从PORT口输入数据到AL(AX)。格式:OUT PORT,AL OUT PORT,AX功能:将AL(AX)中的内容从PORT口输出。,34,
15、IN AL,40H,OUT 40H,AL,IN AX,40H,OUT 40H,AX,8位,16位,(40H)AL(41H)AH,AL(40H)AH(41H),当端口地址大于8位(0FFH)时,要用DX间接寻址,MOV DX,352HIN AL,DX,MOV DX,400HOUT DX,AL,IN,OUT只能对AL,AX操作,若传送的数据为16位,则端口地址只能取偶数。,35,2)换码(查表)指令 XLAT,将累加器AL中的内容变换为存储器(默认数据段)表格中的某一个值,常用来实现编码码制的转换。,要求:BX指向表的首地址的偏移地址,AL中的内容为表中某一项与首地址之间的偏移量。在执行查表指令时
16、,CPU将BX与AL的值相加作为偏移地址,将它所对应单元中的内容取出送到AL中去。,DS段,表格首地址,AL,36,注意:使用该指令前,应先建立一张表,该表的最大容量为256字节。(默认在数据段),例:将十进制数09转换成七段数码管的显示编码,0100 0000,0,0111 1001,1,40H,79H,37,例:从5号端口输入十进制数,转换为显示编码后从20号端口输出。,DS段,MOV BX,2000HIN AL,5HXLATOUT 20H,AL,如果改为:MOV BX,2000H MOV AL,5H;不同?XLAT OUT 20H,AL,38,例:向端口40H送字符35的显示编码。,DS
17、段,MOV BX,2000HMOV AL,3XLATOUT 40H,ALMOV AL,5XLATOUT 40H,AL,39,5.地址传送指令,1)取偏移地址指令 LEA,格式:LEA OPRD1,OPRD2,功能:将源操作数的偏移地址送到目的操作数中。,要求源操作数必须为存储器操作数,目的操作数必须为一个16位的通用寄存器。,该指令通常用来使一个寄存器作为地址指针。,LEA BX,TAB;将TAB标号所指位置的偏移地址送 BXMOV AL,BX;以BX为地址指针取一个数据,40,2)LDS,将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS中。,例:数据段2130H2133H单
18、元中存放一个地址,2130H 2131H 为该地址的偏移地址,2132H 2133H 为该地址的段地址,LDS DI,2130H,执行后:DI 7940H DS 3024H,41,3)LES,将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器ES中。,例:DS1000H DI 0400H 10400H=FFH 10401H=00H 10402H=AAH 10403H=00H,LEA SI,DI,;SI=0400H,LES AX,DI,;AX=00FFH ES=00AAH,42,6.标志寄存器传送指令,1)LAHF(Load AH with Flags):读取标志,标志寄存器PSW中
19、的低8位AH,AH,2)SAHF(Set Flags with AH):设置标志,AH标志寄存器中的低8位,43,3)PUSHF:标志寄存器入栈命令4)POPF:将栈顶内容送标志寄存器PSW注意:这个命令将改变PSW的内容。,44,二、算术运算指令,80868088提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。带符号数用补码表示。同时80868088也提供了各种校正操作,故可以进行十进制算术运算。,45,参与加、减运算的操作数可如图所示。,46,1、加法指令1)不带进位的加法,格式:ADD OPRD1,OPRD2,功能:(OPRD1)+
20、(OPRD2)OPRD1 结果影响标志位,ADD BX+DI,2000H;错,ADD BX+DI,2000H;存储器与立即数相加,ADD DX,50HBX+SI;通用寄存器与存 储单元内容相加,47,设 BX=C588H,执行 ADD BH,BL后?,CF=1,OF=1,ZF=0,SF=0,PF=1,AF=0,MOV AL,49HADD AL,0D7H,结果:CF=1,OF=0,ZF=0,SF=0,PF=0,AF=1,48,2)带进位的加法,格式:ADC OPRD1,OPRD2,功能:(OPRD1)+(OPRD2)+CFOPRD1 结果影响标志位,该指令主要用于多字节数相加,49,例:两个四字
21、节无符号数相加,这两个数分别放在数据段以2000H和3000H开始的存储单元内,高位在高地址,低位在低地址,要求运算结果放在2000H开始的单元内。,CLCMOV SI,2000H,MOV AX,SI ADD AX,3000HMOV SI,AXMOV AX,SI+2ADC AX,3000H2MOV SI+2,AX,50,3)增量指令,格式:INC OPRD功能:(OPRD)+1OPRD,不影响CF,影响AF,OF,PF,SF和ZF,INC AL,INC BX,MOV AL,0FFH,;ZF=1,51,2、减法指令1)不带借位的减法,格式:SUB OPRD1,OPRD2,功能:(OPRD1)(O
22、PRD2)OPRD1 结果影响标志位,SUB BX+DI,2000H;错,SUB BX,DX;通用寄存器之间,SUB AL,BX+SI;累加器和存储器之间,52,MOV CX,5049HSUB CX,0E2D7H,结果:CF=1,OF=0,ZF=0,SF=0,PF=1,AF=0,53,2)带借位的减法,格式:SBB OPRD1,OPRD2,功能:(OPRD1)(OPRD2)CFOPRD1 结果影响标志位,LEA BX,BUFFSUB AL,BXSBB AH,BX+1,该指令主要用于多字节数相减,54,3)减量指令,格式:DEC OPRD功能:(OPRD)-1OPRD,不影响CF,影响AF,OF
23、,PF,SF和ZF,MOV CX,1 DEC CX,;ZF=1,55,4)求补指令,格式:NEG OPRD;对操作数取补码后送回,功能:0(OPRD)OPRD,NEG ALNEG COUNT,指令影响标志位AF,CF,OF,PF,SF和ZF,此指令执行时,只有当操作数为0时,CF为0,否则CF总为1。,若操作数为80H或8000H,执行求补指令后,结果没有变化,但OF置1。,56,5)比较指令,格式:CMP OPRD1,OPRD2,功能:(OPRD1)-(OPRD2)不送回结果,只影响标志位,CMP AX,2000H;将AX内容与2000H相比较,CMP AX,BX+DI+100;将AX内容与
24、存储单元的值相比较,比较结果影响标志位AF,CF,OF,PF,SF和ZF。,57,比较指令主要用于比较两个数之间的关系,若两者相等,相减以后结果为零,ZF标志为1,否则为0。,大小的比较(假设CMP AX,BX),对无符号数,若结果没有产生借位(CF=0),则AXBX;若产生了借位(CF1),则AXBX。,对带符号数,则可根据OF与SF异或运算的结果来判断,结果为1,则AXBX,结果为0,则AXBX,58,3、乘法指令,约定:两个8位数相乘,有一个乘数在AL中,另一个乘数在寄存器或内存中,乘积在AX中;两个16位数相乘,有一个乘数在AX中,另一个乘数在寄存器或内存中,乘积的高16位在DX中,低
25、16位在AX中。乘法有有符号数和无符号数两套指令,8位数8位数 16位数,16位数16位数 32位数,59,无符号数乘法指令,格式:MUL OPRD;不出现 AL 或 AX功能:AL/AXOPRD AX/DX,AX,MUL BL;AL BL AX,MUL CX;AX CX DX(高位),AX(低位),MUL BYTE PTR DI;AL?AX,MUL WORD PTR SI;AX?,60,2)有符号数乘法指令,格式:IMUL OPRD;不出现 AL 或 AX,IMUL BL;AL BL AX,IMUL CX;AX CX DX(高位),AX(低位),IMUL BYTE PTR DI;,功能上与M
26、UL相似,要求两个乘数必须为有符号数,61,乘法运算时,结果影响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表示高半部分包含有结果的有效数,62,例:,MOV AL,0FBHMOV BH,02HIMUL BH,结果:AX=0FFF6H,即-10,CF=0,OF=0,MOV AL,0FBHMOV BH,02HMUL BH,结果:AX=01F6H
27、,即502,CF=1,OF=1,63,4、除法指令,约定:除数必须为被除数的一半字长被除数为16位,放在AX中,除数为8位,在寄存器或内存中,8位商在AL中,8位余数AH中;被除数为32位,放在DX(高位),AX(低位)中,除数为16位,在寄存器或内存中,16位商在AX中,16位余数DX中。除法有有符号数和无符号数两套指令,16位数8位数 8位数,32位数 16位数 16位数,64,1)无符号数除法指令,格式:DIV OPRD;不出现 AX 或 DX AX功能:DX,AX/AX OPRD AX/AL,DX/AH,DIV BL;AXBL AL(商),AH(余数),DIV CX;?CXAX(商),
28、DX(余数),DIV BYTE PTR DI;AX?AL(商)AH(余数),65,2)有符号数乘法指令,IDIV OPRD;不出现 AX 或 DX AX,功能上与DIV相似,要求被除数,除数必须为有符号数。,IDIV BL;AXBL AL(商),AH(余数),66,注意:除法运算后,所有的标志位都是不确定的,没有意义;用IDIV指令时,如果是双字除以一个字,则商的范围为-3276832767,如果是一个字除以一个字节,则商的范围为-128127。如果超出这个范围,会作为除数为0来处理,产生0号中断;8086系统规定余数的符号和被除数相同;当8位数除以8位数,16位数除以16位数时,必须对被除数
29、进行扩展。,67,将字节扩展成字的指令:CBW,将AL中的符号位扩展到AH中。当AL=80H时,AH=0FFH。,当遇到两个字节或字相除时,要预先执行CBW指令或CWD指令,扩展被除数,否则不能正确执行除法操作。,将AX中的符号位扩展到DX中。当AX=8000H时,DX=0FFFFH。,将字扩展成双字的指令:CWD,68,5、十进制调整指令,压缩BCD码:一个字节中有两位BCD码 0100 0101非压缩BCD码:一个字节只用低4位表示一位BCD码,高4位为0。0000 0100 0000 0101,BCD码:用二进制形式表示的十进制码。每一位十进制数用4位二进制表示,运算规则是逢十进一。,B
30、CD码运算时,先用一般的二进制运算,然后再进行BCD码调整。,69,BCD码加法十进制调整指令,1)非压缩的BCD码加法调整指令 AAA,两个非压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AX中。,MOV AL,7HADD AL,5HAAA,;AL:0CH,;AX:0102H CF=AF=1,调整原则:在调整前若AL低半部包含的数值大于9或AF=1,则AAA完成下列操作:AL加6,AF和CF置1,AL的高4位清零。,70,7+5=12 用非压缩的BCD码表示运算过程:,BCD码逢十进一,16进制逢16进1,因为低4位大于9,所以在个位上加6,使其产生进位,同时AF=1
31、,CF=1。,16进制加法,AAA指令调整为10进制结果,71,2)压缩BCD码加法调整指令 DAA,两个压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中。,MOV AL,56HADD AL,47HDAA,;AL:9DH,;AL:03H CF=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。,72,MOV AX,1234HMOV BX,5678HADD AL,BLDAAMOV CL,ALMOV AL,AHADC AL,BH
32、DAAMOV AH,ALMOV AL,CL,;AL:ACH,;AL:12H CF=1,;CL:12H,;AL:12H,;AL:69H,;AL:69H CF=0,;AX:6912H CF=0,73,BCD码减法调整指令与加法调整指令类似,只是分别将加06H,60H,66H改为减 06H,60H,66H。,AAS:对非压缩的BCD码减法调整,DAS:对压缩的BCD码减法调整,注意:调整指令使用时,必须紧跟在相对应的加减法指令后进行。,74,BCD码乘法十进制调整指令 AAM,1)BCD码均为无符号数,故只有用MUL乘法指令才能调整;2)BCD码乘法调整指令只能对非压缩的BCD码相乘结果进行调整;,
33、MOV AL,05HMOV BH,06HMUL BHAAM,;AX:001EH,;AX:0300H,75,1)BCD码均为无符号数,故只有用DIV除法指令才能调整,并且在两个数相除前进行调整;2)BCD码除法调整指令只能对非压缩的BCD码相乘结果进行调整;,MOV AX,0300HMOV BL,05HAADDIV BL,;AX:001EH,;AX:0006H,BCD码除法十进制调整指令 AAD,76,三、逻辑运算指令,1)NOT,格式:NOT OPRD 功能:OPRD按位取反,设:AX=73H DX=85H,MOV AX,DXNOT AX,0000 0000 1000 0101,1111 11
34、11 0111 1010,对标志位没有影响,77,2)AND、OR、XOR,格式:AND(OR/XOR)OPRD1,OPRD2,功能:OPRD1 AND(OR/XOR)OPRD2 OPRD1,这三条指令执行后,CF=0,OF=0,SF,PF,ZF发生变化。,MOV AX,2050HAND AX,0FFH;取AX的低8位,AX0050H PF=1,SF=0,ZF=0,OR AL,0FH;结果?,AL=5FH,78,AL:00001111,XOR AL,0FFH,XOR AL,00H,与0异或,状态不变;与1异或,状态相反。,对某些位置1用OR;对某些位清零用AND;对某些位取反用XOR。,79,
35、3)TEST,格式:TEST OPRD1,OPRD2,功能:(OPRD1)AND(OPRD2)结果影响标志,TEST CX,0FFFFHJZ P1TEST AL,01HJNZ AGAIN,;检验CX是否为零,;若标志ZF=1即CX为0,转向 P1,;检验AL最低位是否为零,;不为零则转移,80,4)移位指令,非循环移位指令(3条),格式:SAL OPRD,M:功能:OPRD算术左移M位,格式:SHL OPRD,M:功能:OPRD逻辑左移M位,0,CF,左移一位进CF,右边补0,相当于乘2。影响标志,若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。,若移位位数大于1,所移的位数用CL
36、存放。,81,MOV AL,02HSAL AL,1,;AL:0000 0010,;AL:0000 0100,MOV AL,02HSAL AL,4;错,MOV AL,02HMOV CL,4SHL AL,CL,;AL:0000 0010,;AL:0010 0000,82,格式:SAR OPRD,M:功能:OPRD算术右移M位,CF,最低位进CF,左边重复最高位,即操作数符号不变。一般用于有符号数的右移,符号扩展。,若移位位数大于1,所移的位数用CL存放。,MOV AL,-4SAR AL,1,;AL:1111 1100,;AL:1111 1110,-2,83,格式:SHR OPRD,M:功能:OPR
37、D逻辑右移M位,CF,最低位进CF,左边补0。一般用于无符号数的右移。,若移位位数大于1,所移的位数用CL存放。,MOV AL,8SHR AL,1,;AL:0000 1000,;AL:0000 0100,4,0,84,MOV AL,48HMOV AH,AL AND AL,0FH MOV CL,4SHR AH,CLMOV NUM,AX,;AL:0100 1000,;AL:0000 1000,;AH:0000 0100,;NUM:0000 1000 NUM+1:0000 0100,该程序的功能:完成了将AL中的压缩BCD码变成非压缩BCD码存放在NUM开始的存区。,85,试分析下面程序完成什么任务
38、?设(DL)=12H,(BL)=34H,MOV CL,4SHL DL,CLSHR BL,CLOR DL,BL,该程序的功能:完成了将原DL中的低4位与原BL中的高4位拼起来放在DL中。此时,(DL)23H,86,循环移位指令(4条),格式:ROL OPRD,M:功能:不带进位循环左移,CF,若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。,若移位位数大于1,所移的位数用CL存放。,87,格式:ROR OPRD,M:功能:不带进位循环右移,CF,若移位位数大于1,所移的位数用CL存放。,88,格式:RCL OPRD,M:功能:带进位循环左移,CF,可实现多字节的移位,将DX,AX左移
39、1位,SAL AX,1RCL DX,1,89,格式:RCR OPRD,M:功能:带进位循环右移,CF,同样可实现多字节的移位。,90,四、程序控制指令,所有的程序控制转移类指令均不影响标志位,64KB内,段内转移:目标指令与转移指令在同一代码段中,只改变IP的值,LL:新CS:IP,分为两种情况:段内转移和段间转移,CS:IP,91,可以超过64KB,段间转移,目标指令与转移指令分别在不同的代码段,转移时需要改变CS和IP的值,CS:IP,LL:新CS:IP,92,1、无条件转移指令格式:JMP OPRD功能:程序转向由OPRD指向的位置执行,分为两种情况:直接转移和间接转移,93,(1)直接
40、转移,分为三种情况:短程:JMP SHORT OPRD 近程:JMP NEAR PTR OPRD 远程:JMP FAR PTR OPRD,OPRD通常以标号形式出现,NEAR为默认值可以省略。,JMP AGAINJMP FAR PTR DATCHG,94,-128127-3276832767,短程、近程:差别在于转移的距离不同,其位移量一个是8位,一个是16位。,LL:新CS:IP,短程与近程属段内转移,远程属段间转移。,CS:IP,近程、短程时,CS不变,IP=IP+位移量,远程时,新的CS和IP由OPRD指向位置的段地址和段内地址决定。,95,(2)间接转移 操作数一般是一个存储器操作数,
41、真正的转移地址在内存中。(操作数是寄存器时例外)分为两种情况:段内间接转移和段间间接转移,96,1)段内间接转移:格式:JMP WORD PTR OPRD转移地址存放在内存单元中,转移指令后给出的是内存单元的地址。,格式:JMP OPRD,;OPRD为寄存器名,JMP BX,;(BX)IP,JMP WORD PTRSI,;DS:SI+1DS:SIIP,DS:SI,IP,97,2)段间间接转移:格式:JMP DWORD PTR OPRD转移地址存放在内存单元中,一般用寄存器间接寻址。,JMP DWORD PTR SI,;DS:SI+3SI+2CS DS:SI+1SIIP,DS:SI,CS,IP,
42、98,2、条件转移指令:功能:根据条件来判断程序是否转移。满足条件时程序转向指定位置执行,否则,程序顺序执行。(注意:此时程序出现分支),只能转移到距当前指令-128127字节的范围内,即一个字节的补码范围;,127,128,99,根据5个标志位来判断:JZ/JNZ JC/JNC JS/JNS JP/JNP JO/JNO为1/0转移。,判断无符号数大小的指令:JA/JNBE JAE/JNB JB/JNAE JBE/JNA,判断有符号数大小的指令:JG/JNLE JGE/JNL JL/JNGE JLE/JNG,JCXZ rel;如CX中的值为0则转移,判断循环用,100,条件转移指令常用来进行判
43、断,以实现程序分支:,CMP AL,0 JAE NN MOV DL,1 JMP DONE NN:MOV DL,0DONE:,程序执行完以后,若AL的值小于0则DL1,反之则DL0。,101,下面程序段在什么情况下执行的结果是AL=0,BEGIN:IN AL,5FH TEST AL,80H JZ A1 XOR AL,AL JMP STOPA1:MOV AL,0FFHSTOP:HLT,当从5FH端口读到的数据的最高位为1时,102,从数据区BCDBUF开始存放着10个用非压缩BCD码表示的十进制数,要求把它们分别转换成ASCII码后存入另一缓冲区。,LEA SI,BCDBUF LEA DI,ASI
44、BUF MOV CX,10AGAIN:MOV AL,SI;取BCD码 OR AL,30H;转换 MOV DI,AL;存 INC SI INC DI DEC CX JNZ AGAIN,分析:BCD码转换成ASCII码的方法是:BCD码30H,103,3、循环控制指令编程时,可以用条件转移指令控制循环,如:MOV CX,10 AGAIN:ADD AX,1 DEC CX JNZ AGAIN也有专用的循环控制指令(3条)。3条指令控制转移范围均在-128127字节内;循环前必须将循环次数赋值给CX。,104,1)格式:LOOP 标号,CX-1CX,若CX不为0,转移到标号处继续循环,2)格式:LOOP
45、Z/LOOPE 标号,CX-1CX,若CX0且ZF=1时转到标号处继续循环,CX为0并不影响标志位ZF,ZF是否为1是由循环指令前面的指令决定的。,3)格式:LOOPNZ/LOOPNE 标号,CX-1CX,若CX0且ZF=0时转到标号处继续循环,105,下面程序段执行后,AX=?,MOV AX,0FFFFH MOV CX,4LOP1:SHL AX,1 LOOP LOP1,;AX:1111 1111 1111 1111,;AX:1111 1111 1111 1110,;循环4次,结果:AX 0FFF0H其中LOOP LOP1 相当于 DEC CX JNZ LOP1 这两条指令,106,MOV C
46、X,40 LEA SI,TABLENEXT:CMP BYTE PTRSI,0 JNZ OKK INC SI LOOP NEXTOKK:CALL DISPLAY2,下面的程序段用于在40个元素构成的数组中寻找第一个非0元素,数组元素从数据段的TABLE处开始存放。,;设置循环次数,;设置地址指针,;与0比较,;CX-1且CX 0 继续循环,;若ZF 1,说明找到了退出循环,;找到后,调用显示信息,;ZF=1,说明未找到修改地址指针,如果要求寻找第一个为0的元素,程序该如何修改?,107,4、子程序调用和返回指令,调用处,子程序首地址:T,子程序,返回处,返回指令,CALL NEAR PTR OP
47、RDCALL FAR PTR OPRD功能:调用子程序RET 功能:返回主程序,同样分段内调用和段间调用,一般为直接调用,如:CALL T其中T为子程序入口标号,108,1)段内调用:子程序距调用语句不超过64KB,在同一个代码段内,调用时,只改变IP即可。如执行CALL LL,LL标号的偏移地址是8050H,SS,CS,SP,1.将3010H入栈,保护 返回地址,SP,30H,10H,SP,2.将8050H赋给IP,3.执行子程序,4.执行RET,栈顶内容弹出送IP,5.继续运行主程序,SP,109,2)段间调用:子程序距调用语句可以超过64KB,不在同一代码段,调用时,需要同时改变CS和I
48、P。,调用指令,2000H:1500H,3400H:2460H,SS,20H,00H,SP,15H,00H,原CS,原IP,3400HCS,2460HIP,1500HIP,2000HCS,执行CALL NEXT,NEXT指向的地址是 3400H:2460H,110,段间调用步骤:将调用指令后的第一条指令地址的CS入栈;将调用指令后的第一条指令地址的IP入栈;将调用目的地地址的段地址赋值CS;将调用目的地地址的偏移地址赋值IP;执行子程序,直至遇到RET指令;将栈顶当前内容赋值IP;将栈顶当前内容赋值CS;返回主程序。,111,3)返回指令:RET,将当前堆栈内容返回到IP(段内调用)或IP,C
49、S(段间调用),具体是段内调用还是段间调用由定义子程序的语句决定的。,RET n:从栈顶弹出返回地址后,SP+nSP,n为偶数,即栈顶位置跳过n个字节。,返回地址后SP,RET 4,SP+4SP,4,112,5、中断指令(三条)一般格式:INT N功能:响应N号中断;一般格式:INTO功能:对溢出情况进行中断响应;一般格式:IRET功能:从中断服务子程序返回主程序;,113,五、串操作指令,用一条指令实现对一串数据或字符的操作,字符或数据的个数在CX中,每执行一次CX自动减1,直至减到零串操作自动停止;源操作数在DS:SI中,目的操作数在ES:DI中;源操作数和目的操作数都在内存中,是唯一一条
50、从内存到内存的指令;DF=1,地址自动由高至低减量,进行串运算;DF=0,地址自动由低至高增量,进行串运算。,114,1、串传送指令,MOVSB:每次传送一个字节;MOVSW:每次传送一个字;,将位于DS段,由SI所指出的存储单元的字节或字传送到位于ES段,由DI所指的存储单元中,再根据DF修改SI和DI,从而指向下一个元素,继续传送,直到CX为0为止。,115,LEA SI,STAR LEA DI,NEXT MOV CX,100 CLDAGAIN:MOVSB DEC CX JNZ AGAIN,将STAR开始的100个字节传到NEXT开始的存区:,;设置源操作数指针,;设置目的操作数指针,;传