1、3.1 8088的寻址方式 3.2 8088指令系统 3.3 基本程序设计方法 3.4 汇编语言与汇编程序,第3章 指令系统及汇编语言程序设计,3.1 8088的寻址方式,3.1.1 说明操作数所在地址的寻址方式1.立即寻址这种寻址方式所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中,如图3.1所示。例:MOV AX,im立即数im可以是8位的,也可以是16位的。若是16位的,则imL在低地址字节,imH在高地址字节。,图3.1 立即寻址示意图,2. 直接寻址操作数地址的16位段内偏移地址直接包含在指令中,它与操作码一起存放在代码段区域。操作数一般在数据段区域
2、中,它的地址为数据段寄存器DS加上这16位的段内偏移地址,如图3.2所示。,图3.2 直接寻址示意图,例:MOVAX,DS:200H指令中的16位段内偏移地址的低字节在前,高字节在后。这种寻址方法以数据段的段地址为基础,故可在多达64KB的范围内寻找操作数。本例中,取数的物理地址就是:DS的内容16(即左移4位),变为20位,再在其低端16位上加上偏移地址2000H。偏移地址2000H是由指令直接给出的。,3.寄存器寻址操作数包含在CPU的内部寄存器中,例如AX、BX、CX、DX等,如图3.3所示。,图3.3 寄存器寻址示意图,例:MOV DS,AX虽然操作数可存放在CPU内部任意一个通用寄存
3、器中,而且它们都能参与算术或逻辑运算并存放运算结果,但是,AX是累加器,若将结果存放在AX中的话,通常指令执行时间要短一些。,4. 寄存器间接寻址在这种寻址方式中,操作数存放在存贮器中,操作数的16位段内偏移地址却放在以下4个寄存器SI、DI、BP、BX中之一。由于上述4个寄存器所默认的段寄存器不同,这样又可以分成两种情况:若以SI、DI、BX进行间接寻址,则操作数通常存放在现行数据段中。此时数据段寄存器内容加上SI、DI、BX中的16位段内偏移地址,即得操作数的地址,如图3.4所示。例:MOV AX,SI,图3.4 寄存器间接寻址示意图,若以寄存器BP间接寻址,则操作数存放在堆栈段区域中。此
4、时堆栈段寄存器内容加上BP中的16位段内偏移地址,即得操作数的地址,如图3.5所示。,图3.5 BP间接寻址示意图,若以寄存器BP间接寻址,则操作数存放在堆栈段区域中。此时堆栈段寄存器内容加上BP中的16位段内偏移地址,即得操作数的地址,如图3.5所示。 例:MOV AX, BP,5. 寄存器相对寻址在这种寻址方式中,操作数存放在存贮器中。操作数的地址是由段寄存器内容加上SI、DI、BX、BP之一的内容,再加上由指令中所指出的8位或16位相对地址偏移量而得到的,如图3.6所示。在一般情况下,若用SI、DI或BX进行相对寻址时,以数据段寄存器DS作为地址基准,而用BP寻址时,则以堆栈段寄存器作为
5、地址基准。例:MOV AX,DISPSI,图3.6 寄存器相对寻址示意图,6. 基址、变址寻址在8088中,通常把BX和BP作为基址寄存器,而把SI、DI作为变址寄存器。将这两种寄存器联合起来进行的寻址就称为基址、变址寻址。这时,操作数的地址应该是段寄存器内容加上基址寄存器内容(BX或BP内容),再加上变址寄存器内容(SI或DI内容)而得到的,如图3.7所示。同理,若用BX作为基地址,则操作数应放在数据段DS区域中;若用BP作为基地址,则操作数应放在堆栈段SS区域中。例:MOV AX,BXSI,图3.7 基址、变址寻址示意图,7. 基址、变址、相对寻址这种方式实际上是第6种寻址方式的扩充。即操
6、作数的地址是由基址、变址方式得到的地址再加上由指令指明的8位或16位的相对偏移地址而得到的,如图3.8所示。例:MOV AX,DISP BX SI,8. 隐含寻址在有些指令的指令码中,不仅包含有操作码信息,而且还隐含了操作数地址的信息。例如乘法指令MUL的指令码中只需指明一个乘数的地址,另一个乘数和积的地址是隐含固定的。这种将操作数的地址隐含在指令操作码中的寻址方式就称为隐含寻址。,图3.8 基址、变址、相对寻址示意图,3.1.2 说明转移地址的寻址方式1. 段内相对寻址在这种寻址方式中,指令应指明一个8位或16位的相对地址位移量DISP(它有正负符号,用补码表示)。此时,转移地址应该是代码段
7、寄存器CS内容加上指令指针IP内容,再加上相对地址位移量DISP,如图3.9所示。例:JMP DISP1图3.9中,1000H是CPU读取这条指令的位移量50H后IP的内容。所以,该指令使CPU转向21050H去执行。,图3.9 段内相对转移示意图,图3.10 段内间接寻址示意图,2. 段内间接寻址在这种寻址方式中,转移地址的段内偏移地址要么存放在一个16位的寄存器中;要么存放在存贮器的两个相邻单元中。存放偏移地址的寄存器和存贮器的地址将按指令码中规定的寻址方式给出。此时,寻址所得到的不是操作数,而是转移地址,如图3.10所示。例:JMP CXJMP WORDPTR BX,3. 段间直接寻址在
8、这种寻址方式中,指令码中将直接给出16位的段地址和16位的段内偏移地址。例:JMP FAR PTR ADD1在执行这条段间直接寻址指令时,指令操作码后的第二个字将赋予代码段寄存器CS,第一个字将赋予指令指针寄存器IP。最后CS内容和IP内容相加则得转移地址,如图3.11所示。,4. 段间间接寻址这种寻址方式和段内间接寻址相似。但是,由于确定转移地址需要32位信息,因此只适用于存贮器寻址方式。用这种寻址方式可计算出存放转移地址的存贮单元的首地址,与此相邻的4个单元中,前两个单元存放16位的段内偏移地址;而后两单元存放的是16位的段地址,如图3.12所示。例:JMP DWORD PTRBPDI,图
9、3.11 段间直接转移示意图,图3.12 段间间接转移示意图,3.2 8088指令系统,8088的指令系统大致可分为7种类型: 数据传送指令; 算术运算指令; 逻辑运算和位移指令; 串操作指令; 程序控制指令; 处理器控制指令; 输入/输出指令。,3.2.1 数据传送指令1. MOVOPRD1,OPRD2MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器。数据传送方向的示意图,如图3.13所示。,图3.13 数据传送方向示意图,各种
10、数据传送指令例举如下:(1)在CPU各内部寄存器之间传送数据(除代码段寄存器CS和指令指针IP以外)。MOV AL,BLMOV DL,CH MOV AX,DXMOV CX,BXMOV DX,BXMOV DX,ESMOV BX,DIMOV SI,BP,8位数据传送指令(1个字节),16位数据传送指令(1个字),(2)立即数传送至CPU的内部通用寄存器(即AX、BX、CX、DX、BP、SP、SI、DI),给这些寄存器赋值。MOV CL, 4;8位数据传送(1个字节)MOV AX,03FFH;16位数据传送MOV S1,057BH; 16位数据传送(1个字),(3)CPU内部寄存器(除了CS和IP以
11、外)与存贮器(所有寻址方式)之间的数据传送,与前述一样可以传送一个字节也可以传送一个字。在CPU的通用寄存器与存贮器之间传送数据:MOV AL, BUFFERMOV AX,SIMOV,DI CXMOV SI, BLOCKBP在CPU寄存器与存贮器之间传送数据:MOV DS,DATASI+BX MOV DESTBP+DI,ES,例如,为了将在同一个段内的偏移地址为AREA1的数据传送到偏移地址为AREA2单元中去,就需要执行以下两条传送指令:MOV AL,AREA1MOV AREA2,AL,如果要求将内存中一个数据块搬移到另一个内存数据区中时,例如要将以AREA1为首地址的100个字节数据搬移到
12、以AREA2为首地址的内存中去,可以用带有循环控制的数据传送程序来实现。为此采用间接寻址方法,用SI存放源数据地址,DI存放目的数据地址,用CX作为循环计数控制单元。其程序如下:MOV SI,OFFSETAREA1MOVDI,OFFSETAREA2MOVCX,100,AGAIN: MOV AL,SIMOV,DI ALINC SIINC DIDEC CXJNZ AGAIN,2. 交换指令XCHG OPRD1,OPRD2目的 源交换指令把一个字节或一个字的源操作数与目的操作数相交换。这种交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存贮器之间进行,但是段寄存器不能作为一个操作数,例如
13、:,XCHG AL,CL XCHG AX,DI XCHG BX,SI XCHG AX,BUFFER XCHG BX,DATASI,3. 地址传送指令8088有3条地址传送指令。(1)LEA指令例如:LEA OPRD1,OPRD2该指令把源操作数OPRD2的地址偏移量传送至目的操作 数OPRD1中。源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。这条指令通常用来建立串指令操作所需的寄存器指针。例如:LEA BX,BUFR是把变量BUFR的地址偏移量送到BX中。,(2) LDS指令该指令完成一个地址指针的传送。地址指针包括段地址和地址偏移量。指令执行时,将段地址送入DS,地址
14、偏移量送入一个16位的指针寄存器或变址寄存器。例如:LDS SI,BX是把BX所指的32位地址指针的段地址送入DS,偏移地址送入SI。,(3) LES指令这条指令除将地址指针的段地址送入ES外,其他操作与LDS的类似。例如:LES DI,BX+CONT是把BX+CONT所指的32位地址指针的段地址送入ES,偏移地址送入DI。,4.堆栈操作指令堆栈是内存中的一个特定区域,由SS的内容和SP的内容来决定。对堆栈的操作具有先入后出的特点。用于堆栈操作的指令主要是:PUSH OPRD(压入堆栈指令)POP OPRD(弹出堆栈指令)堆栈操作指令中的操作数可以是段寄存器(除CS)的内容、16位的通用寄存器
15、(标志寄存器有专门的出入栈指令)以及内存的16位字,例如,,MOV AX,8000HMOV SS,AXMOV SP,2000HMOV DX,3E4AHPUSH DXPUSH AX当执行完两条压入堆栈的指令时,堆栈中的内容如图3.14所示。,由图3.14可以解释压入堆栈的过程:SP-1SPDH(SP)SP-1SPDL(SP)这就是把DX压入堆栈的过程。AX的压栈过程是一样的。,出堆栈的过程与此刚好相反,例如POPAX: (SP)AL SP+1SP (SP)AH SP+1SP 可见,SP的内容总是指向堆栈的顶。,图3.14 堆栈操作示意图,5. 字节、字转换指令有一条指令能将AL的符号位(bit7
16、)扩展到整个AH中,它就是CBW,即将字节转换成一个字。例如,MOV AL,4FHCBW在执行完CBW之后,AX=004FH。另一条指令是将AX的符号位(bit15)扩展到整个DX,它就是CWD,即将字转换成双字。例如,MOV AX,834EHCWD执行完CWD之后,DX=FFFFH,DXAX=FFFF834EH,3.2.2 算术运算指令8088可提供加、减、乘、除4种基本算术运算的操作指令。这些指令可实现字节或字的运算,也可以用于符号数和无符号数的运算。8088还提供各种校正操作,故可以进行十进制的算术运算。进行加、减运算的源操作数和目的操作数的关系如图3.15所示。,1.加法指令(1)AD
17、DOPRD1,OPRD2这条指令完成两个操作数相加,结果送至目的操作数OPRD1,即OPRD1OPRD1+OPRD2目的操作数可以是累加器、任一通用寄存器或存贮器中的操作数。具体地说,该指令可以实现累加器与立即数、累加器与任一通用寄存器、累加器与存贮单元内容相加,其和放回累加器中,例如:ADD AL,30ADD AX,3000HADD AX,SIADD AL,DATA,图3.15 加、减运算操作数之间的关系,该指令也可以实现任一通用寄存器与立即数、累加器或别的寄存器、存贮单元的内容相加,其和放回寄存器中,例如:ADD BX,3FFHADD SI,AXADD DI,CXADD DX,DATABX
18、+SI,该指令还可以实现存贮器操作数与立即数、累加器或别的寄存器的内容相加,其和放回存贮单元中,例如ADD BETASI,100ADD BETASI,AXADD BETASI,DX这些指令执行时,对标志位CF、OF、PF、SF、ZF和AF都会产生影响。,(2) ADC指令这条指令与ADD指令基本相同,只是在对两个操作数进行相加运算时还应加上进位位的当前值,然后再将结果送至目的操作数。例如,两个四字节数已分别放在首地址为FIRST和SECOND的内存区中。每个数占4个存贮单元,存放时低字节在前,高字节在后。那么用如下ADD和ADC指令就可实现四字节数的相加,相加结果放入THIRD为首地址的单元中
19、。,MOV AX, FIRST ADD AX, SECOND MOV THIRD,AX MOV AX, FIRST+2 ADC AX,SECOND+2 MOV THIRD+2,AX 该指令对标志位的影响与ADD指令对标志位的影响相同。,(3) INCOPRD指令这条指令对指定的操作数进行加1操作,在循环程序中常用于修改地址指针和循环次数等。其操作数可以在通用寄存器中,也可以在内存单元中。该指令执行结果对标志位AF、OF、PF、SF和ZF有影响,而对CF位不产生影响, 例如:INC ALINCSI ;,2. 减法指令(1)SUBOPRD1,OPRD2该指令进行两个操作数的相减,即从OPRD1中减
20、去OPRD2,其结果放于OPRD1中。具体地说,可以从累加器中减去立即数;或从寄存器和内存操作数中减去立即数;或从寄存器操作数减去寄存器或内存操作数;或从寄存器或内存操作数减去寄存器操作数等,其类型完全与ADD指令的相同,例如:SUB CX,BXSUB BP+2,CL,(2) SBB指令该指令与SUB相类似,只不过在两个操作数相减时,还应减去借位标志CF的当前值。与ADC一样,这条指令主要用于多字节的减法运算,在前面的四字节加法运算的例子中,若用SUB代替ADD,用SBB代替ADC,那么就可以实现两个四字节的减法运算。该指令对标志位AF、CF、OF、PF、SF和ZF都将产生影响。,(3) DE
21、COPRD指令该指令实现对操作数的减1操作,所用的操作数可以是寄存器的,也可以是内存的。在相减时,把操作数看作为无符号的二进制数。该指令执行结果将影响标志位AF、OF、PF、SF和ZF,但对CF标志不产生影响,例如:DEC BXDEC DI,(4) NEG OPRD该指令用来对操作数进行求补操作,即用零减去操作数,然后再将结果送回,例如:NEG ALNEG MULRE该指令对字节操作时,对-128求补;对字操作时,对-32768求补,则操作数不变,但是此时溢出标志OF将置位。,(5) CMPOPRD1,OPRD2该指令为比较指令,完成OPRD1-OPRD2的操作,这一点与减法指令相同,而且相减
22、结果也同样反映在标志位上。但是与减法指令SUB的主要不同点是相减后不回送结果,即执行比较指令以后,两个操作数的内容是不变化的。,比较指令可以用于累加器与立即数,累加器与任一通用寄存器或任一内存操作数之间的比较。例如:CMP AL,100CMPAX,SICMPAX,DATABX该指令也可以用于任一寄存器与立即数或别的寄存器及任一内存操作数之间的比较,例如:CMP BX,04FEHCMP DX,DICMP CX,COUNTBP,该指令还可以用于内存操作数与立即数及任一寄存器中操作数之间的比较,例如:CMP DATA,100CMP COUNTSI,AXCMP POINTERDI,BX,综上所述,可以
23、归纳出如下结论:当没有溢出时(OF=0),若SF=0,则AXBX;若SF=1,则AXBX。当产生溢出时(OF=1),若SF=0,则AXBX;若SF=1,则AXBX。用逻辑表达式又可简化为:若OFSF=0,则AXBX; ;若OFSF=1,则AXBX。,例如,若自BLOCK开始的内存缓冲区中,有100个带符号的数,希望找到其中最大的一个值,并将它放到MAX单元中。编制该程序的思路是这样的:先把数据块中的第一个数取到AX中,然后从第二个存贮单元开始,依次与AX中的内容进行比较。若AX中的值大,则接着比较;若AX中的值小,则把内存单元中的内容送到AX中。这样经过99次比较,在AX中必然存放着数据块中最
24、大的一个数,然后利用传送指令将它放到MAX单元中去。这是一个循环程序。循环程序开始应置初值,包括循环次数为99次。在循环体中应包括比较指令和转移控制指令。,满足上述功能要求的程序是:MOV BX,OFFSET BLOCKMOV AX, INC BXINC BXMOV CX,99 AGAIN:CMP AX,BXJG NEXTMOV AX,BX,NEXT:INC BXINC BXDEC CXJNE AGAINMOV MAX,AXHLT8088除了上述的算术运算指令以外,还有几条功能很强的乘、除法指令和校正指令。,3. 乘法指令(1)无符号数乘法指令MUL该指令的一般格式为MUL OPRD ;OPR
25、D为源操作数例:字节乘以字节:MOVAL,LSRC -BYTE;被乘数送ALMULRSRC -BYTE;结果存于AX中字乘以字MOV AX,LSRC WORD ;一个字送AXMUL RSRC WORD ;结果的高字节在DX中;低字节在AX中,字节乘以字:MOVAL,MUL BYTE ;字节被乘数送ALCBW ;AL中字节转换成AX中的字MULRSRC -WORD ;(2) 带符号数乘法指令IMUL该指令的一般格式为IMULOPRD例:字节乘以字节:MOV AL,LSRC BYTE ;被乘数送ALIMUL RSRC -BYTE ;,4. 除法指令8088有两条除法指令:无符号除法指令和带符号除法
26、指令。(1)无符号数除法指令DIV执行该指令,如果结果大于寄存器可以保存的值时,则产生0型中断。例:字除以字节:MOV AX,NUMERATOR WORD ;被除数送AXDIV DIVISOR BYTE ;商在AL中,余数在AH中,字节除以字节:MOVAL,NUMERATOR BYTE ;被除数送ALCBW ;AL中的字节扩展成AX中的字DIV DIVISOR -BYTE 字除以字:MOV AX,NUMERATOR -WORDCWD ;把字转换成双字DX、AXDIVDIVISOR WORD ;商在AX中,余数在DX中,(2) 带符号除法指令IDIV该指令是带符号的除法指令。除后,余数符号与被除
27、数相同,其它同DIV指令。该指令一般格式为IDIVOPRD例:双倍字长除以字:MOVDX,NUM -HI WORD ;被除数高位字送DXMOVAX,NUM -LO WORD ;被除数低位字送AXIDIVDIVISOR -WORDSI,5.校正指令8088的调整指令主要用于十进制数的调整。AAA对AL中ASCII未压缩的十进制和进行调整;AAS对AL中ASCII未压缩的十进制差进行调整;AAD在除法指令前对AX中ASCII未压缩的十进制数进行调整;AAM对AX中两个ASCII未压缩十进制相乘结果进行调整;DAA对AL中的两个压缩十进制数相加之和进行调整,得到压缩十进制和;DAS对AL中的两个压缩
28、十进制数相减之差进行调整,得到压缩十进制差。,3.2.3 逻辑运算和移位指令1.逻辑运算指令(1)NOT OPRD该指令对操作数进行求反操作,然后将结果送回。操作数可以是寄存器或存贮器的内容。该指令对标志位不产生影响。例如:NOT AL(2)AND指令该指令对两个操作数进行按位相“与”的逻辑运算。即只有参加相与的两位全为“1”时,相“与”结果才为“1”;否则相“与”结果为“0”。相“与”结果送回。,AND指令可以进行字节操作,也可以进行字操作。AND指令的一般格式为AND OPRD1,OPRD2其中,目的操作数OPRD1可以是累加器,也可以是任一通用寄存器,也可以是内存操作数。源操作数OPRD
29、2可以是立即数、寄存器,也可以是内存操作数,例如:,AND AL,0FH ANDAX,BX ANDSI,BP ANDAX,DATA -WORD ANDDX,BUFFERSI+BX ANDDATA -WORD,00FFH ANDBLOCKBP+DI,DX,(3) TEST指令该指令的操作功能与AND指令相同,其结果将反映在标志位上,但结果不送回,即TEST指令将不改变操作数的值。这条指令通常是在不希望改变操作数的前提下,用来检测某一位或某几位的状态。TEST 指令的一般格式为TEST OPRD,im ;im是立即数立即数中哪一位为1,表示要对哪一位进行测试。,例如,若要检测AL中的最低位是否为1
30、,且为1则转移。在这种情况下可以用如下指令:TEST AL, 01HJNZ THERE THERE:MOV BL,05H,(4) OR指令 OR指令允许对字节或对字进行相“或”运算。OR指令使标志位CF=0,OF=0;相“或”操作的结果反映在标志位PF、SF和ZF上;对AF标志位未定义。OR指令的一般格式为OR OPRD1,OPRD2其中,目的操作数OPRD1可以是累加器,可以是任一通用寄存器,也可以是一个内存操作数。源操作数OPRD2可以是立即数,也可以是寄存器,也可以是内存操作数,例如:,OR AL,30HOR AX,00FFHOR BX,SIOR BX,DATA -WORDOR BUFF
31、ER,SIOR BUFFERBX+SI,8000H操作数自身相“或”将不改变操作数的值,但可使进位标志位CF清0。,(5) XOR指令该指令对两个操作数进行按位“异或”操作,即进行“异或”操作的两位值不同时,其结果为“1”;否则就为0,操作结果送回。XOR 指令的一般形式为XOR OPRD 1 ,OPRD2其中,目的操作数OPRD1可以是累加器、任一个通用寄存器,也可以是一个内存操作数。源操作数可以是立即数、寄存器,也可以是内存操作数,例如:,XOR AL,0FHXOR AX,BXXOR DX,SIXOR CX,CONNT -WORDXOR BUFFER,DIXOR BUFFERBX+SI,A
32、X当操作数自身进行“异或”时,由于每一位都相同,因此“异或”结果一定为0,且使进位标志位也为0。这是对操作数清0的常用方法。例如:XOR AX ,AXXOR SI,SI,2.移位指令8088有3条移位指令。算术左移和逻辑左移指令:SAL/SHL OPRD,m ;m是移位次数,可以是1或寄存器CL中的内容算术右移指令:SAR OPRD, m 逻辑右移指令:SHR OPRD, m,(1) SAL/SHL指令这两条指令的操作结果是完全一样的。每移位一次在右面最低位补一个0,而左面的最高位则移入标志位CF,如图3.16所示。,图3.16 左移指令示意图,(2) SAR指令该指令每执行一次移位操作,就使
33、操作数右移一位,但符号位保持不变,而最低位移至标志位CF,如图3.17所示。SAR可移位由m所指定的次数,结果影响标志位CF、OF、PF、SF和ZF。,图3.17 算术右移示意图,(3) SHR指令该指令每执行一次移位操作,就使操作数右移一位,最低位移至标志位CF中。与SAR不同的是,左面的最高位将补0,如图3.18所示。该指令可以执行由m所指定的移位次数。,图3.18 逻辑右移示意图,3. 循环移位指令 8088有4条循环移位指令: 左循环移位指令 ROLOPRD,m 右循环移位指令 ROROPRD,m 带进位左循环移位指令 RCLOPRD,m 带进位右循环移位指令 RCROPRD,m,(1
34、) ROL指令该指令每做一次移位,总是将最高位移入进位位CF中,并且还将最高位移入操作数的最低位,从而构成一个环,如图3.19(a)所示。(2) ROR指令该指令每做一次移位,总是将最低位移入进位标志位CF中,另外,还将最低位移入操作数的最高位,从而构成一个环,如图3.19(b)所示。,图3.19 循环移位指令示意图,(3) RCL指令该指令是把标志位CF包含在内的循环左移指令。每移位一次,操作数的最高位移入进位标志位CF中,而原来CF的内容则移入操作数的最低位,从而构成一个大环,如图3.19(c)所示。(4)RCR指令该指令是把进位标志位CF包含在内的右循环指令。每移位一次,标志位CF中的原
35、内容就移入操作数的最高位,而操作数的最低位则移入标志位CF中,如图3.19(c)所示。,左移一位,只要左移以后的数未超出一个字节或一个字所能表达的范围,则相当于原来的数乘以2;而右移一位相当于除以2,例如: MOV AL,08HSALAL,1 ;左移一位,相当于乘以2;该指令执行后,AL中的内容为16MOVAL,16SARAL,1 ;右移一位,相当于除以2;该指令执行后,AL中的内容为8,3.2.4 串操作指令在存贮器中存放的一串字或字节,可以是二进制数,也可以是BCD码或ASCII码。它们存放在某一个连续的内存区中,若对它们的每个字或字节均作同样的操作,就称为串操作。我们把能完成这样功能的指
36、令称为字符串操作指令或简称为串操作指令。,1. MOVS/MOVSB/MOVSW该类指令是串传送指令,用于内存区之间字节串或字串的传送。该类指令一般格式为:MOVS OPDR1,OPDR2 ;OPDR2是源串,OPDR1是目的串MOVSB;字节传送MOVSW;字传送,2.CMPS/CMPSB/CMPSW该类指令是串比较指令,常用于内存区之间的数据、字符等的比较。 该指令执行后,也将使SI、DI加减1和2,具体由DF的值决定。该类指令的一般格式为CMPS OPRD1,OPRD2;OPRD1是源串,OPRD2是目的串CMPSB ;字节比较CMPSW ;字比较,3. SCAS/SCASB/SCASW
37、该类指令是串扫描指令,用于寻找内存区中指定的数据和字符。该类指令的一般格式为SCAS OPRDSCASB ;字节操作SCASW ;字操作,4. LODS/LODSB/LODSW该类指令是字串装入指令。它将由SI所指定的源串字节或字装入到累加器AL或AX中去,并根据DF的值修改指针SI,以指向下一个要装入的字节或字。该类指令的一般格式为LODS OPRD ;OPRD为源串LODSBLODSW,5. STOS/STOSB/STOSW该类指令是字串存贮指令。它将AL或AX中的字节或字存贮到由DI所指定的附加段中去,且根据DF的值来修改DI的值。该类指令一般格式为STOS OPRD ;OPRD为目的串
38、STOSB ;字节串STOSW ;字串,6.REP它是串指令的前缀。当某一条串指令需要多次重复时,就可以加上该前缀。重复次数应放在寄存器CX中。这样每重复执行一次,CX内容减1,直到CX=0,才停止重复。7. REPE/REPNE它们是条件重复前缀。当条件满足时,才重复执行后面的串指令,一旦条件不满足,重复就停止。,例:将1000个字符的字符串从内存的BUFFER1搬移到内存的BUFFER2中去。 MOV SI,OFFSETBUFFER1 ;BUFFER1偏移地址送SI MOVDI,OFFSETBUFFER2 ;BUFFER2偏移地址送DI MOVCX,1000 ;传送次数送CX REPEMO
39、VSBUFFER2,BUFFER1;重复搬移,例:将数据段中100个字的数据块BLOCK1搬移到同一个数据段的BLOCK2中去。PUSH DSPOP ES ;使DS=ESLEA SI,BLOCK1 ;源串地址送SILEADI,BLOCK2 ;目的串地址送DIMOV CX,0064H ;重复次数送CXCLD ;使DF=0,SI、DI做加2操作REPE MOVSW ;重复执行,直到CX=0为止,例:比较DEST和SOURCE中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。CLDLEADI,ES:DESTLEASI,SOURCEMOVCX,500REPECMP
40、BJCXZMEXTMATCH:DEC SIMOV AL,BYTEPTRSINEXT: ,3.2.5 程序控制指令1. 无条件转移、调用和返回指令(1)无条件转移指令JMP该指令分直接转移和间接转移两种。直接转移又可分短程(SHORT)、近程(NEAR)和远程(FAR)3种形式。当程序执行到JMP指令时,就无条件地转移到所指示的目的地址。,该指令的一般格式为JMP OPRD ;OPRD是转移的目的地址直接转移的3种形式为短程转移JM PSHORTNEXT在短程转移中目的地址与JMP指令所处地址的距离应在-128127范围之内。近程转移JMP NEARPTRLOOP1或JMP LOOP1 ;NEA
41、R可省略近程转移的目的地址与JMP指令应处于同一地址段范围之内。近程转移的NEAR往往予以省略。,远程转移JMP FAR PTR LOOP2远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。 间接转移指令的目的地址可以由存贮器或寄存器给出。段内间接转移JMP CXJMP WORDPTR段间间接转移JMPDWORDPTR该指令指定的双字指针的第一个字单元内容送入IP,第二个字单元内容送入CS,所定义的单元必定是双字单元。,(2)调用和返回指令CALL指令用来调用一个过程或子程序。当调用的过程或子程序结束后,可使用返回指令RET,使程序从调用的过程
42、或子程序返回。由于过程或子程序有段间(即远程FAR)和段内调用(即近程NEAR)之分。所以CALL也有FAR和NEAR之分。这由被调用过程的定义所决定。因此RET也分段间和段内返回两种。调用指令一般格式为CALL NEARPTROPRD;段内调用CALL FARPTROPRD;段间调用,下面我们举两个使用近程调用指令和远程调用指令的实例。;主程序(近程调用)CALL NEAR PTR PROAD ;过程PROAD定义PROAD PROC NEARPUSH AXPUSH CXPUSH SILEA SI,ARY,MOV CX,COUNTXOR AX,AXNEXT:ADD AX,SIADD SI,2
43、LOOP NEXTMOV SUM,AXPOP SIPOP CXPOP AXRET PROAD ENDP,;主程序(远程调用) CALL FARPTR PROADD ;过程PROADD定义(远程调用过程)PROADD PROC FARPUSH AXPUSH CXPUSH SIPUSH DIMOV SI,BX,MOV DI,BX+2MOV CX,MOV DI,BX+4XOR AX,AX NEXT1:ADD AX,SIADD SI,2LOOP NEXT1MOV DI,AXPOP DIPOP SIPOP CXPOP AXRET PROADD ENDP,2. 条件转移指令8088有18条不同的条件转移指
44、令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段(CS)内,并且以当前指针寄存器IP内容为基准,其位移必须在+127-128的范围之内。因此条件转移指令的范围是有限的,不像JMP指令那样可以转移到内存的任何一个位置上。转移指令格式比较简单,如表3.1所示。,表3.1 转 移指令,3. 循环控制指令这类指令用于控制程序的循环,其控制转向的目的地址是在以当前IP内容为中心的-128+127的范围内。这类指令用CX作计数器,每执行一次指令,CX内容减1,直到减为0,循环才结束。该类指令的一般格式为,LOOP OPRD ;CX0循环LOOPNE O
45、PRD ;CX0且ZF=0循环LOOPE OPRD ;CX0且ZF=1循环在LOOPE和LOOPNE两条指令中,只要两个条件中任一个不满足,循环就结束。例:SUB DI,BXINC DIMOV CX,DIDEC BX NEXT:INCBXCMP BYTEPTR,0LOOPE NEXT ,4. 软中断指令及中断返回指令在8088的微机系统中,当程序执行到中断指令INT时,便中断当前程序的执行,转向由256个中断向量所提供的中断入口地址之一去执行。软中断指令的一般格式为INT OPRD ;OPRD可以取00HFFH中的值,3.2.6 处理器控制指令该类指令用来控制处理器与协处理器之间的交互作用,修
46、改标志寄存器,以及使处理器与外部设备同步等。该类指令如表3.2所示。,表3.2 处理器控制指令,2. 外部同步指令 (1) 暂停指令HLT (2) 空操作指令NOP (3) 等待指令WAIT (4) 封锁总线指令LOCK (5) 处理器交权指令ESC,3.2.7 输入输出指令一般输入输出指令归属于传送指令。这里我们为了强调它的重要性,将它另立一类专门予以详细地介绍。这类指令是专门用于对接口进行输入输出操作的,其一般格式为IN ACC,PORTOUT PORT,ACC,1.直接寻址在这种方式之下,输入输出指令中直接给出接口地址,且接口地址由一个字节表示,例如:IN AL,35HOUT 44H,A
47、X由于指令中只能用一个字节表示接口地址,故此种寻址方式下,可寻址的接口地址空间只有256个,即由00H到FFH。,2. 寄存器间接寻址在这种情况下,接口地址由16位寄存器DX的内容来决定,例如:MOV DX,03F8HIN AL,DX表示由接口地址03F8H(DX的内容作为接口地址)读一个字节到AL。由于DX是一个16位的寄存器,其内容可以从0000H到FFFFH,故其接口的地址范围为64K。,3.3 基本程序设计方法,3.3.1 程序设计步骤在这里,我们不去涉及软件工程的具体问题,只简单介绍程序设计的入门知识。一般可以按下面的步骤进行: (1) 仔细了解问题的要求。 (2) 制定方案。 (3) 编写程序。,(4) 查错。 (5) 测试。 (6) 形成文件。3.3.2 程序设计的基本方法1.顺序程序也有人称之为简单程序,它确实是程序中最简单的形式。这种程序CPU执行时,是以指令的排列顺序逐条执行的。,若m,n,w分别为三个8位无符号数,现欲求Q=mn-w。若m,n,w存放在当前DS所决定数据段、偏移地址为DATA的顺序单元中,而且Q可放在AX中,则程序为LEA SI,DATAMOV ALSIMOV BL,SI+1MUL BLMOV BX,0MOV BL,SI+2SUB AX,BXHLT,