微机学习课件第三章_第1页
微机学习课件第三章_第2页
微机学习课件第三章_第3页
微机学习课件第三章_第4页
微机学习课件第三章_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

2.38086指令系统和汇编语言第三章8086的寻址方法和指令系统3.18086寻址方式3.28086指令系统2.3.1寻址方式3.18086寻址方式概念:指令:是微处理器执行某种操作的命令.指令系统:微处理器全部指令的集合。指令有两种书写格式:机器指令和符号指令。符号指令是用规定的助记符和规定的书写格式书写的指令。符号指令的书写格式为:操作码助记符操作数助记符MOVAL,110110000000000011.操作数的寻址方式

寻址方式:寻找指令中操作数地址的方式。操作数有三种可能的存放方式:直接包含在指令中立即数立即数寻址包含在某个寄存器中寄存器操作数寄存器寻址在内存中存储器操作数(内存操作数)存储器寻址(1)立即寻址(2)寄存器寻址(3)直接寻址(4)寄存器间接寻址(5)寄存器相对寻址方式(6)基址变址寻址方式(7)相对基址变址寻址方式内存实际地址由两部分组成:存储单元所在段的基地址/段内偏移地址(偏移量)MOVES:[3000H],AL段内偏移地址(EA)可以由如下四个部分组成(偏移地址四元素):基址寄存器内容变址寄存器内容比例因子位移量有效地址EA:由四元素组合形成的偏移地址称为有效地址EA:EA=基址+(变址比例因子)+位移量对于实模式(16位寻址):基址寄存器:BX,BP变址寄存器:SI,DI比例因子:0,1位移量:0,8,16位对于保护模式(32位寻址):基址寄存器:任何32位通用寄存器变址寄存器:除ESP外的任何32位通用寄存器比例因子:1,2,4,8位移量:0,8,32位各种寻址方式(1)立即寻址:操作数作为立即数直接存在指令中,可为字节、字、双字。仅用于源操作数,主要是给寄存器赋初值。例如:MOVAX,1234H;十六进制数1234H送入AX。如图所示。MOVECX,12345678H低地址高地址CS段操作码78H56H34H12H78H56H34H12HECX(2)寄存器寻址

操作数存放在指令规定的寄存器中,对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP或BP;而对8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH或DL。注意:源操作数的长度必须与目标操作数一致。例如:MOVAX,BX;将寄存器BX的内容送入AX中。MOVECX,EDX如图所示。78H56H34H12HECX78H56H34H12HEDX寄存器寻址由于无需从存储器中取操作数,故执行速度快(3)直接寻址

指令中的操作数部分直接给出操作数的有效地址EA,操作数可以是16位或32位整数,操作数默认在DS段中例如:MOVAL,DS:[2000H];将逻辑地址为DS:2000单元内的字节送入AL。若段基址DS=4000H,则段起始物理地址为4000H左移4位,即40000H,此指令将数据段中物理地址为42000H单元的内容56H传至AL寄存器。如图所示。MOVAX,[3000H]低地址CS段操作码00H30H34H12H34H12HAXDS段5000053000DS50000300053000+如果操作数在DS以外的其他段(CS,SS,ES,FS,GS)中,指令中必须指明段寄存器,这称为段超越。MOVAX,ES:[3000H]低地址高地址CS段操作码00H30H34H12H34H12HAXES段2000023000ES20000300023000+4.寄存器间接寻址操作数地址的偏移量(有效地址EA)存放在寄存器中16位寻址:偏移地址放在SI,DI,BP,BX中以SI,DI,BX间接寻址,默认操作数在DS段中MOVAX,[SI]以BP间接寻址,默认操作数在SS段中MOVAX,[BP]32位寻址:偏移地址放在8个32位通用寄存器中除ESP,EBP默认段寄存器为SS外,其余均默认段寄存器为DSMOVEAX,[ESP]例如:MOVAX,[BX];BX内容为有效地址EA(偏移量)。若DS=4000H,BX=100H,此指令将物理地址40100H单元的内容传至AL寄存器(段基地址同样为40000H)。如图所示。低地址高地址CS段操作码34H12H34H12HAXSS段7000073000SS70000300073000+MOVAX,[BP]BP(5)基址寻址(寄存器相对寻址)EA=[基址寄存器]+位移量16位寻址:BP,BX为基址寄存器BX,DS为默认段寄存器BP,SS为默认段寄存器32位寻址:8个32位通用寄存器均可作为基址寄存器,除ESP,EBP默认段寄存器为SS外,其余均默认段寄存器为DSMOVEAX,[BX+24]MOVDX,[EAX](5)基址寻址例如:MOVAL,[BX+5];若DS=6000H,BX=2000H,BX的内容加上8位位移量05H作为操作数的有效地址。传送数据段中的一个字节到AL中。如果使用BP,则隐含地表示操作数存放在堆栈段中。如图所示。低地址高地址CS段操作码00H15H34H12H34H12HAXFS段7000073500BX150073500+MOVDX,[BX]DS700002000(6)变址寻址EA=[变址寄存器]+位移量16位寻址:SI,DI为变址寄存器,DS为默认段寄存器32位寻址:除ESP外其余7个32位通用寄存器均可作为变址寄存器,EBP默认SS为段寄存器,其余均默认段寄存器为DSMOVAH,[SI+5]变址寻址适用于对一维数组的元素进行操作。(7)比例变址寻址EA=[变址寄存器]比例因子+位移量只适用于32位寻址

MOVEAX,[ESI*4+50]比例变址寻址适用于一维数组操作,当数组元素大小为2/4/8字节时,它更方便、有效(8)基址变址寻址方式

EA=[基址寄存器]+[变址寄存器];适用于16位和32位寻址MOVAX,[BX+SI]MOVEAX,[EDX+EBP]基址加变址寻址主要用于二维数组操作和二重循环例如:MOVAX,[BX+SI];BX的内容与SI的内容之和作为操作数的有效地址。传送数据段中的一个字。如图所示。(9)基址加比例变址寻址EA=[变址寄存器]比例因子+[基址寄存器]只适用于32位寻址

MOVEAX,[EDX*8+EAX]适用于数组元素大小为2/4/8字节时二维数组操作(10).带位移的(相对)基址加变址寻址EA=[基址寄存器]+[变址寄存器]+位移量适用于16位和32位寻址

MOVAX,[BX+SI+50]MOVEAX,[EDX+EBP+0FFFF000H]主要用于二维数组操作,位移量为数组起始地址(10).带位移的基址加变址寻址

--相对基址变址寻址方式

例如:MOVAH,[BX+DIH]

;BX的内容加上DI的内容再加上位移量1234H作为操作数的有效地址。如图2-17所示。(11).带位移的基址加比例变址寻址EA=[变址寄存器]比例因子+[基址寄存器]+位移量只适用于32位寻址

MOVAX,[BX+SI+50]MOVEAX,[EDX+EBP+0FFFF000H]适用于数组元素大小为2/4/8字节时二维数组操作,位移量为数组起始地址存储器操作时段和偏移地址寄存器的约定存储器操作类型默认段寄存器允许超越段寄存器段内偏移地址来源取指令

CS无

IP堆栈操作

SS无

SP通用数据读写

DSCS,ES,SS按寻址方式取得串操作源串地址

DSCS,ES,SS

SI串操作目标串地址

ES无

DIBP作为基址寄存器

SSCS,DS,ES按寻址方式取得程序只能在代码段,堆栈操作数只能在堆栈段、目的串操作数只能在附加数据段外,其他的操作虽然有默认段,但都允许进行段超越。

其它的寻址方式:(1)隐含寻址(2)I/O端口寻址(3)转移类指令寻址3.28086的指令系统1.数据传送类2.算术运算类3.逻辑运算与移位指令4.字符串处理5.控制转移指令6.处理器控制指令要求:掌握每条指令的助记符、操作数和正确书写格式及指令执行后对标志位的影响。部分8088常用指令指令类型助记符数据传送数据传送MOV,PUSH/POP,XCHG、XLAT等地址传送LEA,LDS,LES标志位传送LAHF、SAHF、PUSHF、POPF输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET1.数据传送类(执行后不影响标志位,源操作数不变)(1)通用数据传送指令这种指令共5条,如表3-4所示。(2)输入/输出指令(3)标志位传送指令这组指令包括三条指令。(4)目标地址传送指令表3-1通用数据传送指令格式一、通用数据传送指令1.MOV指令MOV目标操作数,源操作数源操作数可以是8/16/32位的立即数、寄存器、内存储器。目标操作数不允许为立即数和CS。其余同源操作数。源、目不能同时为内存操作数。注:(P101图3-8)(1)立即数和段寄存器CS不能作为目标操作数;(2)立即数不能直接传送到段寄存器;(3)两个存储单元之间不能直接传送数据;(4)两个段寄存器之间不能直接传送数据;(5)源、目的操作数类型要匹配。例:MOVDS,1000H;(2)MOVCS,AX;(1)MOVVALUE1,CX;(1)MOV[BX],[SI];(3)MOVDS,ES;(4)MOVAX,[CX]MOVDAT[BP+DI],ESMOVAH,BX;(5)MOVBYTEPTR[BX],1000;(5)2.堆栈操作指令(子程序调用或处理中断时,堆栈用来存放当前的断点地址和现场数据,断点地址的保存是由子程序调用指令和中断响应来完成的,现场数据保存可通过堆栈操作指令来实现)PUSH源操作数进栈指令.SP-2->SP,再把16位源操作数压入堆栈,先高位后低位。源操作数可以是通用寄存器、段寄存器、存储器。PUSHAX(P102例)POP目标操作数出栈指令,先从栈顶弹出16位操作数到目标操作数,SP+2->SP。目标操作数可以是通用寄存器、段寄存器(CS除外)、存储器。POPAX3.交换指令(将一个字或字节的源操作数与目的操作数进行交换)XCHG目标操作数,源操作数例:XCHGBX,[BP+SI]BX=6F30HBP=0200HSI=0046HSS=2F00H[2F246H]=1234H例如:XCHGAL,BL;AL与BL间进行字节交换

XCHG[2200H],DX;DX与[2200H]、[2201H]两单元间的字交换注:(1)源、目不能同为内存储单元;(2)段寄存器和立即数不能作为操作数结果:(BX)=1234H(2F246H)=6F30H4.查表指令(完成一个字节的查表转换)XLAT表头变量名查表指令,用来取表中某指定数的值,完成一个字节的查表转换。将AL<-[BX+AL];其中BX表示表的首地址,AL表示所要查找对象在表中的下标。TABLEDB48,49,50,51,52,53,54,55,56,57MOVBX,OFFSETTABLEMOVAL,5XLATTABLE执行后AL=53适用于无规律的代码转换。P102例二.目标地址传送指令LEA目标寄存器,源操作数有效地址传送指令,源操作数为内存操作数,将内存单元的有效地址(而不是内容,MOV传送的是内容)传送到目标寄存器例:LEABX,[BX][SI]

执行前BX=1000hSI=2000h

执行后BX=1000hh=3000h例:LEABX,[BP+SI];执行后,BX中为BP+SI的值

LEASP,[0520H];执行后,使堆栈指针SP=0520H二.目标地址传送指令LDS/LES目标寄存器,源操作数指针传送指令:由源操作数偏移地址决定的双字单元中的第一个字的内容送入指令指定的16位通用寄存器,第二字的内容传送给段寄存器DS或ESADDRDD1A2B3C4DHLDSSI,ADDR结果是:SI=3C4DHDS=1A2BHDS=1000h10100h00020020

0200h

2000hSIDS例:LDSSI,[100h]ES=1000h10100h00020020

0200h

2000hDIES例:LESDI,[100h]三.标志位传送指令标志寄存器读写指令LAHF:将标志寄存器的低字节读出送到AH。标志位不受影响SAHF:将AH的内容写入标志寄存器的低字节,标志位被AH相应的位取代。

(为标志寄存器的状态位附初值)

O

DIT

SZAPC

D7D6D4D2D0FlagAH

O

DIT

SZAPCFlagAH

D7D6D4D2D0三.标志位传送指令标志寄存器进栈/出栈指令PUSHF;将标志寄存器Flag的内容压入堆栈保存。POPF;把堆栈中内容弹出至标志寄存器Flag。

PUSHF指令将标志寄存器内容推入堆栈顶部,同时修改堆栈指针:(SP)←(SP)-2。该指令执行后,标志寄存器内容不变。POPF指令功能正好相反。注:该指令影响标志位O、S、Z、A、P、C。子程序调用和中断服务中用来保护和恢复需要的标志位可用来修改标志寄存器中的任一位的状态。例:PUSHFPOPAXORAH,01H;将TF置1。PUSHAXPOPF4.I/O数据传送指令完成累加器和I/O端口之间的数据传送IN累加器,端口号端口号为8位时,直接寻址,最多可访问256个端口INAX,PORT端口地址为16位时,间接寻址,端口地址必须放在DX寄存器中,最多可访问65536个端口INAL,DXOUT端口号,累加器INAX,20HMOVDX,3F0HINAL,DXOUT27H,ALOUTDX,AX3.4算术运算指令加、减、乘、除,运算对象8/16位有符号/无符号整数,以及无符号的压缩、非压缩BCD码.除(CBW,CWD)外,其余均会影响标志位1.加法指令ADD目标操作数,源操作数源操作数+目标操作数——>目标操作数ADC目标操作数,源操作数源操作数+目标操作数+CF——>目标操作数影响A,C,O,P,S,Z6个标志位P106例题INC目标操作数目标操作数+1——>目标操作数影响A,O,P,S,Z5个标志位用于在循环中修改地址指针及循环次数等例1:MOVDX,4652HADDDX,0f0f0h

4652+f0f037421

0100011001010010+111100001111000000110111010000111执行后:(DX)=3742H

z=0s=0c=1o=0

对无符号数溢出结果错对有符号数不溢出结果正确

问:对带符号数和无符号数怎样判断是否溢出?

有符号数的溢出用溢出标志o判断;无符号数的溢出用进位标志c判断。例2:在内存的First和Secontd开始的区域中分存放着2F365H和5E024H两个数,要求求其和,并存入Third中。

2F365+5E0248D389

FirstSecondThird65F3020024E00500MOVAX,FirstADDAX,SecondMOVThird,AXMOVAX,First+2ADCAX,Second+2MOVThird+2,AX

2F365F365+5E024+E0248D389D38910002+0005000821FirstSecondThird65F3020024E0050089D308002.减法指令SUB目标操作数,源操作数目标操作数-源操作数——>目标操作数注:(1)要求源和目标操作数同时为带符号数或同时为无符号数,且长度相等,源操作数可以是寄存器、存储器、或立即数。目标操作数只能是寄存器或存储器,且两个操作数不能同时为存储器。(2)减法(换为补码的加法时)无进位,表示有借位。(3)对于有符号数OF表示溢出,结果超出范围,对于无符号数CF表示溢出,结果出错。SBB目标操作数,源操作数目标操作数-源操作数-CF——>目标操作数DEC目标操作数目标操作数-1——>目标操作数用于在循环中修改地址指针及循环次数等。NEG目标操作数例:NEGAL0-目标操作数——>目标操作数ADDAL,100影响A,C,O,P,S,Z6个标志位完成100-AL

例:SUBDH,[BP+4](DH)=41H(SS)=0000H(BP)=00E4H(00E8H)=5AH结果:(DH)=0E7HS=1Z=0C=1O=0

如果为有符号数则结果正确(无溢出)如果为无符号数则结果错误(有溢出)

41-5AE7

01000001-010110101110011111例:双精度数运算

W=X+Y+24-ZXYZW65F3020024E0050089D30800MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;X+YADDAX,24ADCDX,0;X+Y+24SUBAX,ZSBBDX,Z+2;X+Y+24-ZMOVW,AXMOVW+2,DX;送入w

CMP目标操作数,源操作数比较指令

OPRD1-OPRD2只影响标志位不改变操作数比较结果判断:(1)若ZF=1,则两数相等,否则不等。(2)对无符号数,(JA)若CF=1,则OPRD1<OPRD2

若CF=0,则OPRD1>OPRD2(3)对有符号数,(JG)若SF异或OF=0,则OPRD1>OPRD2若SF异或OF=1,则OPRD1<OPRD2例:比较两个无符号数的大小,并将大数存入AL中。

XY65F3020024E0050089D30800结果结果AL=F3

MOVAL,XMOVBL,YCMPAL,BL;AL-BL

JNCNEXT;当CF=0,转移

XCHGAL,BLNEXT:HLT例:比较两个带符号数的大小,并将大数存入AL中。XY65F3020024E0050089D30800结果AL=65

MOVAL,XMOVBL,YCMPAL,BLJGNEXT;大于则转移

XCHGAL,BLNEXT:HLT3.乘法指令MULOPRD无符号乘法IMULOPRD有符号乘法对字节AL*OPRD乘积存于AX中对字AX*OPRD乘积高16位存于DX,低16位存于AX中4.除法指令DIV除数无符号除法IDIV除数有符号除法对字节,被除数在AX中,OPRD为除数,商在AL中,余数在AH中对字被除数高位在DX中,低位在AX中,OPRD(字)为除数,商在AX中,余数在DX中。若商超过寄存器的容量,则产生0型中断注:在除法运算中,要求被除数的长度位除数长度的两倍。当被除数的长度与除数具有相同的字或字节,就需要将被除数扩展。符号扩展指令(不影响标志位)CBW字节->字CWD字->双字操作数隐含规定在累加器中,将符号位扩展。扩展规则:1、若AL<80H,则AH<-0若AL>=80H,则AH<-FFH2、若AX<8000H,则DX<-0若AL>=8000H,则DX<-FFFFH例P109对无符号数可采取高位置0的方法。例:编写45ABH÷2132H的程序段。设被除数、除数分别按低字节在前,高字节在后存放在数据段中,其起始地址为BUFFER,并在其后保留4个字节以存放商和余数。MOVBX,OFFSETBUFFERMOVAX,[BX]CWD;对被除数进行符号扩展IDIV2[BX]MOV4[BX],AX;商放在AX中MOV6[BX],DX;余数放在DX中若相除的两数为无符号数,则被除数扩展应使用指令:MOVDX,0。BUFFERAB453221例9:计算w=(v-(xy+z-540))/xx、y、z、v均为16位带符号数,分别存放在X、Y、Z、V单元中,求结果并送入W单元中。XYZVW65F3020024E00500MOVAX,XIMULY;结果在(DX,AX)中MOVCX,AXMOVBX,DXMOVAX,ZCWD;CWD将AX中的字扩展成双字,结果(DX,AX)中ADDCX,AXADCBX,DXSUBCX,540SBBBX,0MOVAX,VCWDSUBAX,CXSBBDX,BXIDIVXMOVW,AXMOVW+2,DXw=(v-(xy+z-540))/x5.十进制调整指令(P109)DAA加法的压缩BDC码调整指令AAA加法的非压缩BDC码调整指令DAS减法的压缩BDC码调整指令AAS减法的非压缩BDC码调整指令AAM乘法的非压缩BDC码调整指令AAD除法的非压缩BDC码调整指令(1)组合十进制加法调整指令DAA

DAA指令用于对组合BCD码相加的结果进行调整,使结果仍为组合的BCD码。

DAA指令应紧跟在加法指令之后,执行时,先对相加结果进行测试,若结果的低4位(或高4位)二进制大于9(非法码)或大于15(即产生进位CF或辅助进位AF)时,DAA自动对低4位(或高4位)结果进行加6的调整。调整在AL中进行,结果放在AL中。89=1000100175=01110101+1111111001100110=FEH+=164011001001例如:两个十进制数89+75的正确结果应为164,可是,相加运算后的结果为FEH,要进行以下调整:例:MOVAX,06MOVBX,07ADDAX,BX;AX=0DHDAA;执行后AX=13H(2)非组合十进制数加法调整指令AAAAAA指令用于对非组合BCD码相加结果进行调整,指令的操作如下:若(AL)&0FH>9,或AF=1则(AL)←(AL)+6(AF)←1(CF)←(AF)(AH)←(AH)+1(AL)←(AL)&0FH例如:两个非组合的十进制数06+07,结果应为非组合的十进制数0103,其操作过程如下:0000011000000111000011010001001100000000000000010000111100000011011011&00000001====AX0103+ALAFAH=++06070DH;非组合BCD;不是非组合BCD;调整;组合BCD;再调整AF←1;AH←AH+1;AL&0FH;结果送AX中程序为:MOVAX,06MOVBX,07ADDAX,BX;AX=0DHAAA;执行后AX=0103H(3)组合十进制数减法调整指令DASDAS指令对组合BCD码相减结果进行调整,紧跟在减法指令之后,调整后的结果仍为组合BCD码,DAS对结果是进行-6调整。例:SUBAL,BHDAS

执行指令前,AL=86H,BH=07H执行SUB指令后,AL=7FH,CF=0,AF=1执行DAS指令后,因AF=1,需进行调整。AL=AL-6=7FH-6=79H。CF=0,AF=1。结果调整为79的压缩BCD码。(4)非组合十进制数减法调整指令AASAAS与AAA类似,但有两点不同:(1)AAA指令中的(AL)←(AL)+6操作对应

AAS中则应改为(AL)←(AL)-6;(2)AAA指令中的(AH)←(AH)+1操作对应AAS中则应改为(AH)←(AH)-1;(5)非组合十进制数乘法调整指令AAM调整后的结果仍为一个正确的非组合BCD码,放回AX中。例如:实现08×09=0702的程序为:

MOVAL,08MOVBL,09MULBL;(AL)×(BL)(AX)

AAM;结果(AX)=0702(6)非组合十进制除法调整指令AAD除法调整指令AAD应放在除法指令之前,先将AX中的非组合BCD码的被除数调整为二进制数,再进行相除。例如:要实现0103÷06=02余01,程序如下:

MOVAX,0103;取被除数

MOVBL,06;取除数

AADDIVBL;相除,得(AL)=02,(AH)=13.2.3逻辑运算与移位指令逻辑运算指令AND 目标操作数,源操作数OR 目标操作数,源操作数XOR 目标操作数,源操作数NOT 目标操作数注:(1)所有指令都对操作数进行按位操作,操作数可以是字节或字。(2)目标操作数不能是立即数;(3)两个操作数不能都为存储器操作数。(4)操作数不能是段寄存器。位操作AND(与)主要用于将二进制数的某些位清0ANDBL,0FHxxxxxxxx(BL)000011110F0000xxxx结果AND位操作OR 主要用于将二进制数的某些位置1ORBL,0FHxxxxxxxx(BL)000011110Fxxxx1111结果OR位操作XOR 主要用于将二进制数的某些位求反或将寄存器和CF同时清0。XORAL,ALXORBL,0FHxxxxxxxx(BL)000011110Fxxxxxxxx结果XOR位测试TEST OPRD1OPRD2

用于测试二进制数的某些位(一般为1位)当被测试位为0时,ZF置位(ZF=1);当被测试位为1时,ZF复位(ZF=0)不将结果送回目标操作数,只影响标志位。TESTAL,01HJNZTHERE;ZF=0,则寄存器的第0位为1,转移到THERETEST AL,1JNZ RIGHTTESTAL,128JNZ LEFT移位操作(P95-96图3.17-3.18)指令格式:SHL/SAL/SHR/SAR目标操作数,计数移1位时,计数值可以为立即数1移多位时,计数值必须先存入CL寄存器MOVCL,3SHLAX,CL循环移位指令ROL/ROR/RCL/RCR目标操作数,计数移1位时,计数值可以为立即数1移多位时,计数值必须先存入CL寄存器3.2.4串操作指令串传送(MOVS)目标串,源串(MOVSB/MOVSW)串比较(CMPS)目标串,源串(CMPSB/CMPSW)

串搜索(SCAS)目标串,源串(SCASB/SCASW)取操作(LODS)目标串(LODSB/LODSW)存操作(STOS)目标串(STOSB/STOSW)串操作指令的共同点:(1)约定DS:SI为寻址源串,以ES:DI为寻址目标串,指令中不被显式指明操作数。源串DS可加段超越前缀而改变,目串ES不可段超越。(2)用方向标志规定串处理方向。DF=0从低地址向高地址处理。(3)每次操作后SI和DI根据DF的值自动增或减。(4)当在串操作前加重复指令或重复前缀时。必须以CX为计数器,存放处理元素的个数。串操作指令执行一次,CX自动减一,为0时停止。(5)重复的数据串处理过程可以被中断。重复前缀(不能单独使用,只能加在串操作指令之前,用来控制其后的基本串操作指令是否重复)在MOVS、LODS、STOS指令前加REP,执行步骤如下:(1)若CX=0,则退出,否则:(2)CX<-CX-1(3)执行REP后面的数据串指令(4)重复(1)-(3)2.将REPE/REPZ加在CMPS或SCAS指令之前,(1)变为(1)若CX=0或ZF=0,则停止重复过程。3.将REPNE/REPNZ加在CMPS或SCAS指令之前,(1)变为(1)若CX=0或ZF=1,则停止重复过程。REP/REPE/REPNE/REPZ/REPNZ3.2.4串操作指令串传送MOVSMOVSBMOVSW将一个字节/字从DS:SIES:DI指令前要先将源串首地址DS:SI

目标串首地址ES:DI完成操作后自动修改SI、DI,使其指向串的下一个元素串操作方向由CLD和STD指令设置

CLD地址递增方向(DF=0) STD地址递减方向(DF=1)串传送(注:MOVS与MOV指令不同,它可实现内存单元之间的数据传送)例:将数据段内起始地址为SOURCE的数据块传送到同一段内的地址在DEST的存储单元中去。数据长度为100。LEASI,SOURCELEADI,DESTMOVCX,100

CLDAGAIN:MOVS

DECCX

JNZAGAIN采用重复前缀:

LEASI,SOURCELEADI,DESTMOVCX,100CLDREPMOVSDEST,SOURCE注:令DS=ES例:串传送MOVSI,OFFSETS1MOVDI,OFFSETS2MOVCX,18CLDREPMOVSB….S1DB‘Thisisastring!$’S2DB18DUP(0)串比较CMPSCMPSBCMPSW比较地址为DS:SI、ES:DI的两个字节/字,完成操作后自动修改SI、DI,使其指向串的下一个元素指令前通常加重复前缀REPZ/REPE,从而当发现两个串不同时结束比较。

LEASI,SOURCELEADI,DESTMOVCX,count

CLDREPZCMPSB

JNZUNMAT;若串不相同,在RESULT单元中置0FFHMOVAL,0;若串相同,在RESULT单元中置0JMPOUTPTUNMAT:MOVAL,0FFHOUTPT:MOV

RESULT,ALHLT例:串比较MOVSI,OFFSETS1MOVDI,OFFSETS2MOVCX,xxCLDREPZCMPSBJNZNot_EqualEqual : ……Not_Equal: …...例:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们是否相同。若不相同,则给出不同处的源地址。

Leasi,souceLeadi,destMovcx,50CldAgain:CmpsbJnzFoundDeccxJnzAgainmovax,0jmpexitFound:decsimovax,siExit:hlt[si]-[di]

ODSZAPC00100100

0

23D005AB

92SouceDest23D005A192SIDI例:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们是否相同。(与Repe/Repz配合使用)

Leasi,souceLeadi,destMovcx,50CldRepeCmpsbJnzFoundmovax,0jmpexitFound:decsimovax,siExit:hlt

CX不为0且[si]与[di]相等(ZF=1)时重复

检测CX=0?或ZF=0?是,退出否,进行②CX–1CX执行REPNE后的串操作。重复①~③23D005AB

92SouceDest23D005A192SIDI例3-2:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们是否相同。(与Repne/Repnz配合使用)

Leasi,souceLeadi,destMovcx,50CldRepneCmpsbJzFoundmovax,0jmpexitFound:decsimovax,siExit:hlt

CX不为0且[si]与[di]不相等(ZF=0)时重复

检测CX=0?或ZF=1?是,退出否,进行②CX–1->CX执行REPNE后的串操作。重复①~③538005A3

72SouceDest23D005A192SIDI例:字比较

Leasi,souceLeadi,destMovcx,25CldAgain:CmpswJnzFoundDeccxJnzAgainmovax,0jmpexitFound:decsidecsimovax,siExit:hlt[si]-[di]

ODSZAPC00100100

0

23D005AB

92SouceDest23D005A192SIDI串搜索SCASSCASBSCASW在首地址为ES:DI的串中搜索某个元素(字节/字),自动修改指针DI事先要将待搜索的元素存入AL/AX,然后与ES:DI指定的目标串进行比较.该指令不改变累加器和目标串的内容。通过标志位来体现结果指令前通常加重复前缀REPNZ/REPNE,从而当发现待搜索的元素时结束搜索。例:串搜索MOVDI,OFFSETStringMOVCX,xxMOVAL,‘h’CLDREPNZSCASBJNZNot_FoundFound: ……Not_Found: …...例:寻找字符串中是否有字符‘A’。

Leadi,souceMovcx,30Moval,‘A’cldagain:ScasbJzfindDeccxJnzagainMovbx,0Jmpexitfind:DecdiMovbx,diexit:Hltal-[di]

ODSZAPC00100100

0

53714149

68SouceDI例:寻找字符串中是否有字符‘A’。al-[di]

ODSZAPC00100100

0

5300710041004900

6800SouceDILeadi,souceMovcx,30Movax,‘A’cldagain:ScaswJzfindDeccxJnzagainMovbx,0Jmpexitfind:DecdiDecdiMovbx,diexit:Hlt例:寻找字符串中是否有字符‘A’。与Repe/Repz,Repne/Repnz配合使用。

Leadi,souceMovcx,30Moval,‘A’cldRepneScasbJzfindMovbx,0Jmpexitfind:DecdiMovbx,diexit:Hlt53714149

68SouceDI

CX不为0且AL与[di]不相等(ZF=0)时重复

检测CX=0?或ZF=1?是,退出否,进行②CX–1CX执行REPNE后的串操作。重复①~③串装入LODSLODSBLODSW将地址为DS:SI的一个字节/字装入AL/AX,同时自动修改SI串装入指令一般没有重复前缀例:MOVSI,OFFSETStringMOVCX,xxMOVAH,2CLDLODSBMOVDL,ALINT21;显示器输出字符LOOPNextCharNextChar:串装入例:在数据段DS中有一字符串,试将其每一个字符加1后送入附加段ES中。

Leasi,souceLeadi,destMovcx,30Cldagain:Lodsb;只自动修改SIIncalMoves:[di],alIncdiDeccxJnzagainHlt23D005AB92SouceDest24D106ACSIDI[SI]ALSI+1SI例:在数据段DS中有一字符串,试将其每一个字加一后送入附加段ES中。

Leasi,souceLeadi,destMovcx,20Cldagain:LodswIncaxMoves:[di],axIncdiIncdiDeccxJnzagainHlt23D005AB92SouceDest24D006ABSIDI[SI]AXSI+2SILods指令一般不与Rep指令配合使用串存储STODSSTODSBSTODSW将AL/AX的值存入地址为ES:DI的内存单元,自动修改DI,使其指向下一个单元利用重复前缀REP,可以建立一个取值相同的数据串CX=0?CX-1CXSTOSREPSTOSYN例:初始化内存,使其内容全部为0。

Leadi,destmoval,0Movcx,30Cldagain:StosbDeccxJnzagainHlt23D005AB92Dest00000000DI(AL)[DI](DI)+1DI例:初始化内存,使其内容全部位0。

Leadi,destmovax,0Movcx,15Cldagain:StoswDeccxJnzagainHlt23D005AB92Dest00000000DI(AL)[DI](DI)+2DI例:初始化内存,使其内容全部为0。与Rep指令配合使用。

Leadi,destmoval,0Movcx,30CldRepStosbHlt23D005AB92Dest00000000DI例:在数据段DS中有一字符串,试将其每一个字符加一后送入附加段ES中。

Leasi,souceLeadi,destMovcx,30Cldagain:LodsbIncalStosbDeccxJnzagainHlt23D005AB92SouceDest24D106ACSIDI例:在起始地址为Block的内存中有一数据块,其中有正数,也有负数,要求将正负数分开,分别送至同一段的两个区域p_data和M_data中Leasi,blockLeadi,P_dataLeabx,M_dataMovax,segblockMovds,axMoves,axcldGoon:LodsbTestal,80hJnzminuStosbJmpagain538205blockM_data82DIDSP_dataBXSI5305minu:Xchgbx,diStosbxchgbx,diagain:deccxjnzgoonhlt五、控制转移指令分类指令功能无条件转移指令条件转移指令循环指令子程序调用及返回指令中断指令JMPOPRDJNZOPRD(等)LOOPOPEDLOOPE/LOOPZOPRDLOOPNE/LOOPNZOPRDCALLOPRDRETINTNINTOIRET无条件转移根据上一条指令设置的标志位的情况转移计数非零循环计数非零循环且结果为0循环计数非零循环且结果不为0循环调用子程序从子程序返回软中断溢出时中断中断返回1.无条件转移调用和返回类指令JMP和CALL指令都是通过改变CS和IP值改变程序执行的,但不同的是,CALL指令要先将IP和CS的当前值入栈保存,以务返回时使用;RET指令则将CALL指令入栈保存的值弹回到CS和IP中,实现正确的返回。8086的转移、调用和返回指令根据转移地址在段内或段外,又分为段内转移和段间转移即近转移(NEAR)和远转移(FAR)若转移到当前代码段,则目标属性为NEAR,只修改IP;若目标地址在其他的段,则目标属性为FAR,称为段间转移,同时修改IP与CS。段内和段间的转移指令寻址方法又有两种,即:直接寻址和间接寻址直接转移:转移的目标地址直接出现在指令中;间接转移:转移的目标地址间接存储在某一寄存器或内存变量中。段内转移段间转移段内直接短转移段内直接近转移段内间接转移段间直接转移段间间接转移JMPSHORTOPRDJMPNEARPTROPRDJMPWORDPTROPRDJMPFARPTROPRDJMPDWORDPTROPRD(1)无条件转移指令JMP<转向地址>分类名称指令-128~127-32768~32767-32768~32767转移范围段间段间

JMPSHORTOPRD——段内直接短转移操作数:短-标号执行的操作:(IP)(IP)+8位位移量转移范围:-128~+127

JMPNEAROPRD——段内直接近转移操作数:NEAR-标号执行的操作:(IP)(IP)+16位位移量转移范围:-32768~段内直接转移JMP标号

05A20010EB03A200

20F4Short当前IP+8位移量Near当前IP+16位移量

moval,blcmpal,0jnSpdatamov[1000],aljmpnextpdata:mov[2000],alnext:hlt

JMPnext+127-128-32768

10510610710810910a10b10c10d10eNextpdataJmpbx

(bx)=120jmp120Ip=(bx)=120Jmpdata[si]data=1000SI=500jmp1500Ip=1500Jmpbx10510610710810910a120121122123MovJMPWORDPTROPRD——段内间接转移操作数:16位通用寄存器、存储器执行的操作:(IP)(EA)转移范围:-32768~例:JMPFARPTROPRD——段间直接转移

操作数:far-标号执行的操作:(IP)标号所在段的段内偏移地址

(CS)标号所在段的段地址转移范围:段间例如:JMPFARPTRTABLEJMPDWORDPTROPRD——段间间接转移

操作数:存储器(32位)执行的操作:(IP)(EA)

(CS)(EA+2)转移范围:段间例如:JMPDWORDTABLE[SP][SI]例:间接转移若BX=0002H,且变量定义为:DBT1DW0400HDBT2DD01000020HTABDW0600H,0640H06A0H………………JMPBX……段内间接转移IP=0002HJMPDBT1…段内间接转移IP=0400HJMPDBT2…段间间接转移

CS:IP=0100:0020HJMPTAB[BX+2]………….段内间接转移IP=06A0HJMPWORDPTR[BX]……段内间接转移(2)子程序调用及返回指令

段内调用段间调用直接调用间接调用直接调用间接调用CALLNEARPTROPRDCALLFARPTROPRDCALLDWORDPTROPRDCALL<调用地址>RET分类名称指令CALLWORDPTR

温馨提示

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

评论

0/150

提交评论