微机原理与接口技术 指令系统_第1页
微机原理与接口技术 指令系统_第2页
微机原理与接口技术 指令系统_第3页
微机原理与接口技术 指令系统_第4页
微机原理与接口技术 指令系统_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

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

文档简介

第4章指令系统4.1寻址方式4.28086指令系统4.3从80286到Pentium系列微处理器的指令系统第4章指令系统指令:计算机用以控制各个部件协调动作的命令。指令系统:一台机器所具有的全部指令。8086/8088指令系统有133条基本指令。4.1.1操作数类型指令操作码(描述指令的操作功能)操作数(指明指令的操作对象)立即数:MOVAX,1234H寄存器操作数:MOVAX,BX存储器操作数:MOVAX,[1234H]

操作码

操作数例如:MOVAX,1234H操作数12341234H0ABCDH[1234H]debug环境下:16进制不要加H4.1.2寻址方式-寻找指令中操作数所在地址的方法1立即寻址MOVAX,080AH2直接寻址MOVBX,[22A0H]3寄存器寻址MOVAX,BX4寄存器间接寻址MOVAX,[SI]MOVCX,[BP]5基址寻址MOVDX,2100H[BP]6变址寻址MOVAX,3000H[SI]7基址加变址寻址MOVAX,[BX+SI+250H]8字符串寻址MOVSB9I/O寻址INAL,20HOUTDX,AL10隐含寻址AAA1.立即寻址操作数是一个立即数,它直接包含在指令中。立即寻址主要用于给存储器或寄存器赋初值。…操作码立即数低字节立即数高字节…高址0AH08HAHALAX【例4-3】MOVAX,080AH,其寻址如图。MOV[1000H],1234H()MOVAX,1234HMOV[1000H],1234h(对)2、直接寻址MOVBX,[22A0H]操作数的有效地址(EA)直接包含在指令中,它与操作码一起存放在代码段中。操作数存放的物理地址=DS×16+16位地址偏移量。【例4-5】MOVBX,[22A0H]执行过程如图。322A0H322A1H32H48H…操作码偏移量A0H偏移量22H……代码段数据段BX直接寻址方式示意图3000+)22A0

322A0HDS48H32H

MOVAX,ES:[22A0H]CS:MOVBX,[3000H]寄存器寻址操作数在内部寄存器中。对16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP,而对8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH、DL。AXBX寄存器寻址示意图3.【例4-4】MOVAX,BX执行过程如图所示。MOVBX,AX4、寄存器间接寻址寄存器间接寻址方式下,操作数在存储器中,而存储器地址存放于寄存器SI、DI、BX或BP中。寄存器间接寻址情况一:若以SI、DI、BX间接寻址,操作数通常在现行数据段中,即DS中的值乘以16,加上SI、DI或BX中的有效地址即为操作数的物理地址。MOVAX,[SI]寄存器间接寻址情况二:若以BP间接寻址,则操作数在堆栈段中,即操作数的物理地址为堆栈段寄存器SS中的值左移四位与BP相加。MOVCX,[BP]【例4-7】MOVAX,[SI]执行过程如图。21000H21001H2000+)SI

1000

21000HDSA0H50H

AX寄存器间接寻址方式示意图50HA0H………代码段数据段操作码【例4-8】MOVCX,[BP]执行过程如图。以BP间接寻址方式示意图代码段数据段32000H32001H3000+)BP

2000

32000HSS

62H

B0H

CXB0H62H………操作码5.基址寻址操作数的有效地址EA等于基址寄存器BX或BP的内容加上指令中给定的8位或16位偏移量。EA=BXBP+8位偏移量或16位偏移量DSSS【例4-9】MOVDX,2100H[BP]执行过程如图。14100H14101H

1000+)BP2000

14100HSS+)210020H30H

基址寻址方式示意图DX30H20H…操作码偏移量00H偏移量21H……代码段数据段6.变址寻址EA=SIDI+8位偏移量16位偏移量操作数的有效地址EA等于变址寄存器SI或DI的内容加上指令中给定的8位或16位偏移量。段寄存器规定为DS段寄存器。【例4-10】MOVAX,3000H[SI]执行过程如图。变址寻址方式示意图35000H35001H

3000+)SI2000

35000HDS+)300020H30H

AX30H20H…操作码偏移量00H偏移量30H……代码段数据段7.基址加变址寻址操作数的有效地址EA等于一个基址寄存器(BX或BP)的内容,加上一个变址寄存器(SI或DI)的内容,再加上指令中给定的8位或16位偏移量。EA=BXBP+8位偏移量16位偏移量DSSS+SIDI【例4-11】MOVAX,[BX+SI+250H]执行过程如图。基址加变址寻址方式示意图30H20H33250H33251H

3000+)BX1000

33250HDS+)SI2000+)0250

20H

30H

…操作码偏移量50偏移量02……代码段数据段操作码AX8.字符(数据)串寻址●数据串寻址用于数据串操作指令。【例4-12】MOVSB执行后:[DI]←[SI]SI←SI±1DI←DI±19.I/O端口寻址端口寻址I/O直接端口寻址间接端口寻址由指令直接给出输入输出设备的端口地址。规定端口地址为8位,能寻址256个端口。由寄存器DX给出输入输出设备的端口地址。由于DX是16位,因此能寻址64K个端口。【例4-13】

INAL,20H;将地址为20H的外设的内容读入AL中

OUTDX,AL;将AL中内容输出给以DX的内容为地址的外设10.隐含寻址●这种寻址方式中,操作数是隐含的。指令中没有明显给出操作数。【例4-14】AAA即对AL中的内容进行十进制加法调整,并把调整后的结果放入AH和AL中。这条指令的隐含操作数是AH和AL。跨段问题(段超越)

针对当前段,各段与寄存器有关的内存寻址之间是固定搭配的。

DS:BX,DI,SISS:BP

加上段前缀,可打破这种关系完成跨段操作。例: ES:MOV AX,[BX] PA=(ES)×16+(BX)

SS:MOV CX,[SI] PA=(SS)×16+(SI)

4.1.2寻址方式-寻找指令中操作数所在地址的方法1MOVAX,080AH2MOVBX,[22A0H]3MOVAX,BX4MOVAX,[SI]MOVCX,[BP]5MOVDX,2100H[BP]6MOVAX,3000H[SI]7MOVAX,[BX+SI+250H]8MOVSB9INAL,20HOUTDX,AL10AAA4、8086指令系统(133条)数据传送算术运算逻辑运算与位移类字符串操作控制转移类处理器控制类输入输出中断4.2.1数据传送指令

指令类型指令功能指令书写格式通用数据传送字节或字传送字压入堆栈字弹出堆栈字节或字交换换码指令MOV目标,源PUSH源POP目标XCHG目标,源XLAT目标地址传送装入有效地址装入DS寄存器装入ES寄存器LEA目标,源LDS目标,源LES目标,源标志位传送将FR低字节装入AH寄存器将AH内容装入FR低字节将FR内容压栈从堆栈中弹出一个字给FRLAHFSAHFPUSHFPOPF通用数据传送指令通用数据传送指令MOV指令堆栈操作指令数据交换指令换码指令压栈指令出栈指令1.(1)MOV指令指令格式:MOVOP目,OP源指令功能:将源操作数传送到目的操作数中。OP目表示目的操作数,可以是寄存器、存储器。OP源表示源操作数,可以是寄存器、存储器和立即数。MOVAL,BLMOVSP,2AC0HMOV[DI],AXMOVSI,ES:[BP]MOVWORDPTR[SI],6070H目的操作数和源操作数不同为段寄存器

MOVDS,ES

立即数不能直接送段寄存器

MOVDS,2000H

注意点:不影响标志位。目的操作数不能是CS,IP,和立即数。MOV 3,AL

MOV CS,AX

源操作数与目的操作数必须类型一致。源操作数和目的操作数不能同时为存储器操作数。MOV[1000H],[2000H]MOV[DI],[SI]

MOV AL,35A6HMOVBX,AL

汇编示例:方法一movax,1234hmov[1000h],axmovax,3456hmov[2000h],axmovax,[1000h]movbx,[2000h]mov[1000h],bxmov[2000h],ax方法二MOVSI,1000HMOVDI,2000HMOVAX,[SI]MOVBX,[DI]MOV[DI],AXMOV[SI],BX实现存储器[1000H],[2000H]内容互换段寄存器CSDSSSES存储器立即数通用寄存器AXBXCXDXSIDISPBP

①压栈指令指令格式:PUSHOP指令功能:将寄存器或存储器单元的内容送入堆栈OP为16位的寄存器或存储器操作数。操作过程:1)SP←SP-1;[SP]←OPH(操作数高字节)

2)SP←SP-1;[SP]←OPL(操作数低字节)(2)堆栈操作指令堆栈结构SS:SP例 PUSH AX(假设AX=2105HSS=1000HSP=0046H)栈底为:SS×16=10000H栈顶为:SS×16+SP=10000H+0046H=10046HAXSS=1000H

21H100431004210041100441004510046SP=46HSP21H05H05H

指令格式:POPOP指令功能:将SP所指向的堆栈栈顶的一个字弹到寄存器或存储单元中。OP为16位操作,可以是寄存器或存储器操作数。操作过程:1)OPL←[SP];SP←SP+12)OPH←[SP];SP←SP+1

②出栈指令(2)堆栈操作指令例 POP CX (假设CX=1045HSS=1000HSP=0042H)栈顶为:SS×16+SP=10000H+0044H=10042HSS=1000HSP=44H56H

05H9AH10043100421004110044100451004678H

21H05HCXSP

21HPOPCS是非法的。POP和PUSH指令只允许按字访问堆栈。不能用立即寻址方式。

PUSH1234H

PUSH[1234H]

PUSH1234H

MOVSI,1234H

PUSH[SI]

正确注意:…PUSHAXPUSHBXPUSHDXPUSHDS…POPDSPOPDXPOPBXPOPAX…⑶数据交换指令指令格式:XCHGOP1,OP2【例4-20】

XCHGAL,BL;AL与BL进行字节互换

XCHGBX,CX;BX与CX进行字互换指令功能:实现OP1和OP2内容的相互交换。操作数为内部寄存器或存储器。注意不允许使用段寄存器

XCHGDS,ES不允许使用立即数

XCHGAX,2000H两个存储单元之间不允许直接交换数据

XCHG[SI],[DI]不影响标志位如何用XCHG实现存储器内两数交换?[1000H],[2000H]⑷换码指令(查表指令)指令格式:XLAT指令功能:将BX的内容和AL的内容相加作为有效地址EA,在一个表格中找出此单元中的内容并传送至AL中。

AL

[BX+AL]例如:已知0~9的ASCII表,其表首地址是当前数据段的 TABLE=0040H,先要找出数字3的ASCII码。

MOVBX,0040HMOVAL,3XLAT指令执行后

AL=33H时间与空间DS=F000HBX30HF004031HF0041AL=333HF0043TABLE34HF0044F004232HAL注意不影响标志位字节表格(长度不超过256)2.目标地址传送指令:LEA、LDS、LES(1)LEA指令指令格式:LEAOP目,OP源【例4-22】LEABX,[BP+SI];BP+SI→BXLEADI,TABLE;取TABLE的有效地址送入DI指令功能:将源操作数的有效地址EA送到目的操作数。例(1)

LEA AX,[2012H]相当于MOVAX,2012H(2) LEA SI,[BX]

相当于MOVSI,BX注意●本指令处理的是变量的地址(偏移量),不是变量的值。它等效于传送有效地址的MOV指令,但MOV指令必须在变量名前使用OFFSET操作符。【例4-23】

MOVDI,TABLELEADI,TABLEMOVDI,OFFSETTABLE2.目标地址传送指令:LEA、LDS、LES(2)LDS指令指令格式:LDSOP目,OP源LDS SI,[2012H]指令功能:把4个字节地址指针(包括一个段地址和一个偏移地址)从源操作数指定的4个存储单元取出,低地址的两字节送目的操作数,高地址的两字节送DS段寄存器。56H34H

9AH2012H2013H2014H2015H78H0000H……DSSI56H34H9AH78H例 LDS SI,[2012H]操作:SI

(2013H:2012H) DS

(2015H:2014H)LES指令指令格式:LESOP目,OP源指令功能:本指令与LDS指令的操作基本相同,所不同的是将源操作数4个字节中高地址的两字节传送到ES段寄存器而不是DS段寄存器。(3)LESDI,[BP+4]3.标志寄存器传送指令●读标志指令:LAHF指令功能:将标志寄存器低8位→AH。●设置标志指令:SAHF指令功能:将AH→标志寄存器低8位。OFDFIFTFSFZF―AF―PF―CF15~1211109876543210CF位操作示例-清CF标志方法一:字节操作LAHFANDAH,0FEHSAHF方法二:位操作CLC●

PUSHF指令指令格式:PUSHF指令功能:将16位标志寄存器入栈,同时修改栈指针。●POPF指令指令格式:POPF指令功能:将栈顶的一个字送标志寄存器,同时修改栈指针SP。4.2.2算术运算指令1、具备加、减、乘、除运算指令。2、可处理8、16位,带符号、不带符号的二进制整数,及不带符号十进制整数。3、对标志寄存器有影响。加法:ADD、ADC、INC减法:SUB、SBB、DEC、NEG、CMP乘法:MUL、IMUL除法:DIV、IDIV乘除法辅助:CBW、CWD、AAA、DAA、AAS、DAS、AAM、AAD1.加法指令(1)不带进位的加法指令指令格式:ADDOP目,OP源指令功能:将源操作数和目的操作数相加,结果保留在目的操作数中,并根据结果设置标志。ADDAL,50H;AL+50H→ALADDDI,SI;DI+SI→DIADDAX,[DI];AX+([DI+1],[DI])→AX)n=8bit带符号数(-128~127)无符号数(0~255)有符号数和无符号数都不溢出

00000100+0000101100001111有:(+4)+(+11)=+15OF=0无:4+11=15CF=0无符号数溢出

00000111+11111011

100000010有:(+7)+(-5)=+2OF=0无:7+251=2CF=1有符号数和无符号数都溢出

10000111+11110101

101111100有:(-121)+(-11)=+124OF=1无:135+245=124CF=1有符号数溢出

00001001+0111110010000101有:(+9)+(+124)=-123OF=1无:9+124=133CF=0【例4-24】ADDBX,AX若AX=65A0H,BX=0B79EH(2)带进位的加法指令指令格式:ADCOP目,OP源指令功能:将源操作数、目的操作数及CF的值相加,结果保留在目的操作数中,并根据结果设置标志。【例4-25】有两个4字节数分别放在自FIRST和SCEOND开始的存储区,低字节在低地址,编一程序将两数相加,将结果存入从FIRST开始的存储区。MOVAX,FIRSTADDAX,SECONDMOVFIRST,AXMOVAX,FIRST+2ADCAX,SECOND+2MOVFIRST+2,AX(3)加1指令指令格式:INCOP指令功能:将操作数加1,再送回该操作数。这条指令一般用于循环程序的指针修改。操作数可以是8位/16位通过寄存器或存储器,不能为立即数。INCAL;AL+1→ALINCBYTEPTR[BX+DI];[BX+DI]+1→[BX+DI]1、INC不影响CF2、INC3

2、减法指令不带借位的减法指令: SUBBX,CX带借位的减法指令: SBBAX,2030H减1指令: DECAX取补指令: NEGAL比较指令: CMPAX,BX

2、减法指令(1)不带借位的减法指令:SUB指令格式:SUBOP目,OP源指令功能:将目的操作数减去源操作数,结果送回到目的操作数中,并根据结果设置标志。例句:SUBBX,CX;BX-CX→BXSUBAL,[SI+2];AL-[SI+2]→AL(2)带借位的减法指令:SBB指令格式:SBBOP目,OP源指令功能:将目的操作数减去源操作数再减去借位标志CF的现行值,结果送回到目的操作数中,并根据结果设置标志。例句:SBBAX,2030H;AX-2030H-CF→AXSBBWORDPTR[DI],1000H

;将DI和DI+1所指的两个单元的内容减去1000H再减去CF,结果送DI和DI+1单元2、减法指令(3)减1指令:DEC指令格式:DECOP指令功能:将操作数的值减1后送回源操作数中,根据结果置标志位。操作数可以是8位/16位内部寄存器和存储器操作数,不能为立即数。例句:DECAX;AX-1→AXDECBYTEPTR[BX];[BX]-1→[BX]注意:1、DEC不影响CF2、DEC3

(4)取补指令:NEG指令格式:NEGOP指令功能:将操作数取补后送回原操作数,即将OP连同符号位逐位取反再加1(0-OP→OP)。操作数可以是8位/16位内部寄存器或存储器操作数,不能为立即数。例句:NEGALNEGWORDPTR[SI+1]注意:只有当OP=0时,CF=0,否则CF=12、减法指令(5)比较指令:CMP指令格式:CMPOP目,OP源指令功能:将目的操作数与源操作数相减,不回送结果,

只根据结果置标志位。例句:CMPAX,BX;AX-BX后置标志位判断两数是否相等:若ZF=1,则A=B若ZF=0,则A≠B判断两数大小:无符号数

若CF=1,则A<B若CF=0,则A≥B有符号数

若两操作数符号相同SF=1时,A<BSF=0时,A≥B若两操作数符号不同SFXOROF=1时,A<BSFXOROF=0时,A≥B减法指令示例有两组50个字节的数据,分别放在自FIRST和SECOND开始的内存单元中,试比较两组数据是否相同。相同则AL=0,否则AL=0FFH。(P86)MOVSI,OFFSETFIRST MOVDI,OFFSETSECOND MOVCX,50P:MOVAL,[SI] CMPAL,[DI] JZNEXT MOVAL,0FFH JMPSTOP NEXT:INCSI INCDI DECCX JNZP MOVAL,0STOP:HLT3.乘法指令(1)无符号数乘法指令指令格式:MULOP指令功能:完成两个不带符号的8位/16位二进制数的乘法运算。例句:MULBLMULWORDPTR[DI](2)带符号数乘法指令指令格式:IMULOP指令功能:完成两个带符号的8位/16位二进制数的乘法运算。有关IMUL的其它约定与MUL相同。特点:指令中给出的操作数是乘数被乘数存于AL(8位)或AX(16位)中结果存于AX(16位)、DXAX(32位)中AL8位操作数AHAL×AX16位操作数DXAX×乘法运算示意图●指令中给出的操作数是乘数,它可以是8位/16位内部寄存器及存储器;另一操作数被乘数隐含在AL/AX中,乘积存放在AH:AL或DX:AX中,如图所示。乘法例程设在M1和M2单元中各有一个16位数,求其乘积,将结果存于从R开始的字单元中。MOVAX,M1MULM2MOVR,AXMOVR+2,DXMUL与IMUL区别MUL指令乘积的高一半为零: CF=OF=0否则 CF=OF=1IMUL指令乘积的高一半是符号扩展CF=OF=0

否则CF=OF=1例题若AL=0B4H,BL=11H求执行指令IMULBL和MULBL后的乘积值。分析:AL=0B4H为无符号数的180D,带符号数的-76D,BL=11H为无符号数的17D,执行IMULBL的结果为:AX=-1292D=FAF4H;CF=OF=1执行的MULBL的结果为:AX=3060D=0BF4H;CF=OF=04.除法指令(1)无符号数除法指令格式:DIVOP指令功能:完成两个不带符号的二进制数的除法运算。指令中给出的操作数是除数,它可以是8位/16位内部寄存器及存储器;被除数隐含在AX(字节除)或DX、AX(字除法)中。例句:DIVCLDIVWORDPTR[DI]说明:商溢出时,产生类型0中断。(2)带符号数除法指令格式:IDIVOP指令功能:完成两个带符号的二进制数的除法运算,操作数的规定同DIV指令。商的符号根据代数规则确定,余数的符号与被除数相同。说明:若商超出此范围,则将产生一个类型0的中断。4.除法指令除法指令特点除数OP:在指令中给出,可为8位或16位被除数:根据除数位数确定若除数是8位,则被除数位AX(16位)若除数是16位,则被除数位DXAX(32位)结果字节除(OP8位)商: AL=AX/OP余数: AH=AX%OP字除(OP16位)商: AX=DXAX/OP余数: DX=DXAX%OP

为此要除法操作有时需引入字节、字扩展指令4.除法指令-符号扩展指令(3)字节扩展指令指令格式:CBW指令功能:将AL中的单字节数的符号扩展到AH中。若AL<80H,则0→AH;若AL≥80H,则0FFH→AH。(4)字扩展指令指令格式:CWD指令功能:将AX中的数的符号扩展到DX中。若AX<8000H,则0→DX;若AX≥8000H,则0FFFFH→DX。注意这两条符号扩展指令常常放在IDIV指令之前,对标志位没有影响。【例】MOVAL,81HCBWMOVCL,30HIDIVCLAX:0ff81H:-127CL:48-127/48=商:-2(0feH)余数:-31(0E1H)【例4-38】在内存中有一个从DATA1开始的存储区。此存储区的前两个字节是一个16位的带符号被除数,第三、四个字节是一个16位的带符号的除数,其后的四个单元依次存放商和余数。实现此除法的运算程序为:LEABX,DATA1MOVAX,[BX]CWDIDIVWORDPTR[BX+2]MOV[BX+4],AXMOV[BX+6],DX5.十进制运算调整指令BCD码组合(或压缩)式BCD码用一个字节表示两位十进制数(12H、1234H)非组合(或非压缩)式BCD码用一个字节表示一位十进制数(高4位为0)(02H、0502H)问题提出:求解18+27,48+29。十进制运算16进制运算调整指令(对AH、AL中的数据调准后向AH、AL输出)AAA:AsciiAddAdjustDAA:DecimalAddAdjustAAS:

AsciiAdjustSubstractDAS:DecimalAdjustSubstractAAM:AsciiAdjustMulAAD:AsciiAdjustDivAAA:非组合BCD码的加法调整指令DAA:组合BCD码的加法调整指令AAS:

非组合BCD码的减法调整指令DAS:

组合BCD码的减法调整指令AAM:非组合BCD码的乘法调整指令AAD:非组合BCD码的除法调整指令(1)AAA:AsciiAddAdjust

非组合BCD码的加法调整指令指令格式:AAA指令功能:对AL中的由两个非组合BCD码相加所得的结果进行调整,并将调整后的结果存于AX中.MOVAX,05HMOVBL,09HADDAL,BLAAA执行完成后:AH=01HAL=04H(2)DAA:DecimalAddAdjust

组合BCD码的加法调整指令指令格式:DAA指令功能:对AL中的由两个组合BCD码相加所得的结果进行调整,并将调整后的结果存于AL中。MOVAL,34HADDAL,89HDAA执行完成后:AL=23HAF=CF=1

注意:AAA与DAA指令使用时必须紧跟在ADD或ADC指令后。且这两条指令只能对AL中的结果进行调整,因此对多字节的十进制数运算,只能从低字节开始逐个字节的进行运算和调整。加法调整指令应用示例求解:1834+2789=4623分析:1834H+2789H=40BDHMOV AL,34H ;(AL)=34HADD AL,89H ;(AL)=34H+89H=BDHDAA ;(AL)=BDH+60H+06H=23H(AF=CF=1)MOV AH,AL ;(AH)=23HMOV AL,18H ;(AL)=18HADC AL,27H ;(AL)=18H+27H+1=40HDAA ;(AL)=40H+06H=46H(AF=0CF=0)XCHG AH,AL ;DAA4623H(3)AAS:AsciiAdjustSubstract

非组合BCD码的减法调整指令指令格式:AAS指令功能:对AL中的由两个非组合BCD码相减所得的结果进行调整,并将调整后的结果存于AL中。

MOVAX,09HMOVBL,05HSUBAL,BLAAS执行完成后:AL=04H(4)DAS:DecimalAdjustSubstract

组合BCD码的减法调整指令指令格式:DAS指令功能:对AL中的由两个组合BCD码相减所得的结果进行调整,并将调整后的结果存于AL中。

MOVAX,19HMOVBL,05HSUBAL,BLDAS使用AAS、DAS指令必须紧跟在SUB或SBB指令之后。(5)AAM:AsciiAdjustMul

非组合BCD码的乘法调整指令指令格式:AAM指令功能:对AX中的由两个非组合BCD码相乘所得的结果进行调整,并将调整后的结果存于AX中。AH←AL/10(商),AL←AL%10(余数)

MOVAL,08HMOVBL,05HMULBL;AX=40DAAM;执行完成后:AH=04HAL=00H本指令必须紧跟在MUL指令之后使用(6)AAD:AsciiAdjustDiv

非组合BCD码的除法调整指令指令格式:AAD指令功能:把AX中的由两个非组合BCD码进行调整,然后可按DIV指令实现两个非组合BCD码的除法运算。MOVAX,0502HMOVBL,10DAAD执行完成后:AH=00DAL=52D

DIVBL执行完成后:AH=2(余数)AL=5(商)本指令必须在DIV运算前使用4.2.3逻辑运算指令位与: ANDAL,0FH位或: ORAL,30H位异或:XORAL,0FFHXORAL,AL着重介绍位取反:NOTAL

区别NEGAL位测试:TESTAL,80H*4.2.3逻辑运算指令逻辑指令应用举例对AL.0置1对AL.0清0对AL.0取反取AL的低4位对AL的低4位取反判断AL.0是否为1对AL.5、AL.4置1ORAL,01HANDAL,0feHXORAL,01HANDAL,0fHORAL,0f0HXORAL,0fHTESTAL,01HORAL,30H(1)逻辑与运算指令AND指令格式:ANDOP目,OP源指令功能:对两个操作数按位进行与操作,结果回送到目标操作数。源操作数:可以是8位/16位内部寄存器存储器立即数;目的操作数只允许内部寄存器存储器。功能:AND指令常用对某位或某些位清零(屏蔽)。ANDAL,0FEHANDAL,0FH(2)逻辑或运算指令OR指令格式:OROP目,OP源指令功能:对两个操作数进行逻辑或运算,结果回送到目标操作数。功能:OR指令常用于对某位或某些位置1ORAL,01HORAL,0fH非组合BCD码转换成ASCII码。ORAL,30H(3)逻辑异或运算指令XOR指令格式:XOROP目,OP源指令功能:对两个操作数进行逻辑异或运算,结果回送到目标操作数。功能:XOR指令常用于常用于对某位或某些位取反XORAL,01HXORAL,0FFH对寄存器清零。XORAL,AL(4)逻辑非运算指令NOT指令格式:NOTOP指令功能:对操作数逐位取反后回送到原处。NOT指令对标志位没有影响MOVAL,0f0hNOTAL(5)逻辑测试指令TEST指令格式:TESTOP目,OP源指令功能:将目标操作数与源操作数进行逻辑与运算,不回送结果,只根据结果置标志位。功能:常用于判断(测试)寄存器或存储器中的数某位是0还是1。TESTAL,80H;测试AL的D7位若为1则 ZF=0否则 ZF=1ANDAL,80H;区别4.2.4移位指令逻辑移位:SHL、SHR算术移位:

SAL、SAR循环移位:

ROL、ROR带进位标志(CF)的循环移位:

RCL、RCR注意:这类指令的目标操作数可以是8位/16位通用寄存器存储器;计数值若大于1,必须先装入CL中,因此最多可移动255位。(1)逻辑移位指令逻辑左移指令指令格式:SHLOP目,计数值指令功能:将操作数的内容左移,每移一次,最低位补0,最高位→CF。SHL AX,1MOVCL,4SHL DH,CL逻辑右移指令指令格式:SHROP目,计数值指令功能:将操作数的内容右移,每移一次,最高位补0,最低位→CF。CF0D7D15D0CF0D7D15D0(2)算术移位指令算术左移指令指令格式:SALOP目,计数值指令功能:同SHL算术右移指令指令格式:SAROP目,计数值指令功能::将操作数的内容右移,每移一次,最高位的值不变,最低位→CF。CF0D7D15D0D7D15D0CF保持符号位不变移位指令应用示例1实现AL=AL*10,假设扩大后的数值小于255。(P93)SHLAL,1;原数×2ALMOVBL,AL;原数×2BLMOVCL,2SHLAL,CL;原数×8ALADDAL,BL(3)循环移位指令循环左移指令指令格式:ROLOP目,计数值指令功能:将操作数的内容循环左移,每移一次,最高位移入CF,同时移入最低位。循环右移指令指令格式:ROROP目,计数值指令功能:将操作数的内容循环右移,每移一次,最低位移入CF,同时移入最高位。CFD7D15D0CFD7D15D0(4)带进位的循环移位指令带进位循环左移指令指令格式:RCLOP目,计数值指令功能:包括进位位在内,一起循环左移,每移一次,最高位移入CF,原CF移入最低位。带进位循环右移指令指令格式:RCROP目,计数值指令功能:包括进位位在内,一起循环右移,每移一次,最低位移入CF,原CF移入最高位。D7D15D0CFCFD7D15D0移位指令应用示例2-程序分析DATASEGMENTDATA1DB12HDATAENDSMOVDL,DATA1MOVDH,DLMOVCL,4SHRDL,4ORDL,30HMOVAH,2INT21HMOVDL,DHANDDL,0FHORDL,30HMOVAH,2INT21H说明:1、DATASEGMENTDATA1DB12HDATAENDS表示在内存中定义了一字节型变量,其数值为12H2、左程序中黄色部分功能为MOVDL,’A’MOVAH,2INT21H提示:2号系统功能调用:将置入DL寄存器中的ASCII字符(‘A’)向屏幕输出。

移位指令应用示例2(略)将一组BCD码转换成ASCII码。设缓冲区从BUF单元开始连续存放着8个组合BCD码,要求将它们转换成ASCII码,存放在以RES单元开始的缓冲区。高位BCD码转换成的ASCII码,放在高地址单元。将AL中的无符号数扩大10倍,假设扩大后的数值小于255。(P93)LEASI,BUFLEADI,RESMOVBL,8TRAT:MOVAL,[SI]MOVBH,ALANDAL,0FHORAL,30HMOV[DI],ALINCDIMOVCL,4SHRBH,CLORBH,30HMOV[DI],BHINCSIINCDIDECBLJNZTRATHLT4.2.5字符串操作指令字符串字符串是存储区中的一个数据序列。字符串操作:是指对串中的每个字或字节数据做相同的操作。包括串传送:MOVS、MOVSB、MOVSW串比较:CMPS、CMPSB、CMPSW串搜索:SCAS、SCASB、SCASW串存取:LODS、LODSB、LODSW所有基本的字符串指令共同点用寄存器SI寻址源操作数,用寄存器DI寻址目的操作数;每次执行串操作后自动修改指针SI、DI;若DF=0,则每次操作后SI和DI自动加1或加2;若DF=1,则每次操作后SI和DI自动减1或减2。串长存放在CX中。(1)字符串传送指令指令格式:MOVSOP目,OP源

MOVSBMOVSW指令功能:从源串中取一个字节/字,传送到目标串中,并自动修改SI/DI,使之指向下一元素。例:将DATA1开始的100个字节的数据传送到DATA2开始的存储区中。;初始化语句MOVSI,OFFSETDATA1MOVDI,OFFSETDATA2MOVCX,100(1)字符串传送指令方法一lbl1:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZlbl1HLT方法二:串传送

CLD;清方向标志lbl1:MOVSBDECCXJNZlbl1HLT方法三:重复

CLD REPMOVSB

;重复传送至CX=0 HLT字符串传送指令前可以加重复前缀REP,表示每传送完一个元素使CX减1,直到CX=0。(2)字符串比较指令指令格式:CMPSOP目,OP源

CMPSBCMPSW指令功能:取源串一个字节/字,与目标串的一个字节/字相减,不回送结果,根据结果置标志位,并修改串地址指针,使之指向下一个字节/字单元。例:比较存储区中分别以DATA1和DATA2开始的50个字节的数据是否完全相同,如完全相同则AL=0,否则AL=0FFH。;初始化语句MOVSI,OFFSETDATA1MOVDI,OFFSETDATA2MOVCX,50CLD(2)字符串比较指令方法一lbl1:MOVAL,[SI]MOV[DI],ALCMPSBJNZlbl2

INCSIINCDIDECCXJNZlbl1

MOVAL,0

JMPstoplbl2:MOVAL,0ffHstop:HLT方法二:

REPZ

CMPSB;两串比较直到CX=0,或ZF=0JZlbl2MOVAL,0FFHJMPSTOPlbl2:MOVAL,0stop:HLTREPZ/REPE:CX≠0且ZF=1,继续循环REPNZ/REPNE:CX≠0且ZF=0,继续循环(3)字符串搜索指令指令格式:SCASOP目,OP源

SCASBSCASW指令功能:将AL/AX寄存器中的关键字,减去由DI所指向的目标串中的元素,不回送结果,根据结果置标志位,并修改DI寄存器内容,指向下一元素。例:在DATA1开始的100个存储单元中查找是否存在字符‘$’。;初始化语句MOVDI,OFFSETDATA1MOVCX,100MOVAL,‘$’(3)字符串搜索指令方法

MOVDI,OFFSETDATA1MOVAL,‘$’MOVCX,64HCLDREPNZSCASB ;查找‘$’直到ZF=1或CX=0JZFOUNDMOVBX,0FFFFHJMPSTOPFOUND:DECDIMOVBX,DI ;求出关键字地址送BXSTOP:HLTREPZ/REPE:CX≠0且ZF=1,继续循环REPNZ/REPNE:CX≠0且ZF=0,继续循环(4)取字符串和存字符串指令(1)取字符串指令指令格式:LODSOP目,OP源

LODSBLODSW指令功能:将源串中SI所指向的存储单元中的一个字节/字取到AL/AX寄存器中,并修改SI的内容,指向下一字节/字单元。LODS指令一般不使用重复前缀REP。例:将0700H单元开始的5个字节的内容逐一取来,放在累加器中进行处理,处理后再送到0700H的内存区域。

CLDMOVSI,0700HMOVCX,5lbl1:LODSB

;处理

DECCXMOV[DI],ALJNZlbl1(4)取字符串和存字符串指令(1)存字符串指令指令格式:STOSOP目,OP源

STOSBSTOSW指令功能:将AL/AX中的一个字节/字,存到由DI所指向的目标串的存储单元,并修改DI的内容,指向下一个字节/字的存放单元。STOS指令常使用REP前缀。字符串操作综合示例例:将从数据区DATA1开始的100个数中的非负数、负数分开,并分别存入处于同一数据段从DATA2和DATA3开始的数据区。;初始化语句MOVSI,OFFSETDATA1MOVDI,OFFSETDATA2MOVBX,OFFSETDATA3MOVCX,100lbl1:LODSBTESTAL,80HJNZlfu

STOSBJMPnext

lfu:XCHGBX,DISTOSBXCHGBX,DInext:DECCXJNZlbl1

HLT4.2.6转移指令(1)无条件转移指令:JMP(2)条件转移指令标志位转移指令JC、JNCJZ、JNZJS、JNSJP、JNPJO、JNO(3)循环控制指令无条件循环指令:LOOP条件循环指令:LOOPZ、LOOPNZ(4)计数为0转移:JCXZ无符号数转移指令:JA(JNBE)JNA(JBE)JB(JNAE)JNB(JAE)有符号数转移指令:JG(JNLE)JNG(JLE)JL(JNGE)JNL(JGE)(1)无条件转移指令指令格式:JMPOPJMP的几种跳转方式段内直接转移JMP1000H段内间接转移JMPCX段间直接转移JMP2000H:1000H段间间接转移JMPDWORDPTR[SI](2)

条件转移指令条件转移都是短转移,转移距离只能在(-128~+127)内完成。FRCFZFSFPFOFJC目标标号CF=1JNC目标标号CF=0JNZ目标标号ZF=0JS目标标号

SF=1 JNS目标标号SF=0JP目标标号

PF=1JNP目标标号PF=0JO目标标号

OF=1JN

温馨提示

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

评论

0/150

提交评论