把指令中指定的一个字节或一个字(分别存放在AL及AX寄存器中),传送到附加段中由DI间接寻址的字节内存单元(或字内存单元)中去,然后,根据方向标志DF及所进行操作的数据类型(字节或字)对DI进行修改操作。在指令重复前缀的控制下,可连续将AL(AX)的内容存入到附加段中的一段内存区域中去,该指令不影标志位。
例5 要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作,可
用下列程序段实现:
LEA DI,MESS2 ;装入目的区域偏移地址 MOV AL,00H ;为清零操作准备 MOV CX,5 ;设置区域长度 REP STOSB
· LODS指令的功能, 从串中取指令实现从指定的字节串(或字串)中读出信息的
操作。
例6 比较DEST和SOURCE中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。
CLD
LEA DI,ES:DEST LEA SI,SOURCE MOV CX,500 REPE CMPSB JCXZ NEXT MATCH:DEC SI
MOV AL,BYTE PTR[SI] NEXT:
五、 程序控制指令
转移类指令可改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。 1.无条件转移、调用和返回指令
(1) 无条件转移指令JMP 分直接转移和间接转移两种。 一般格式: JMP OPRD ;OPRD是转移的目的地址 直接转移的3种形式为: · 短程转移 JMP SHORT OPRD ;IP=IP+8位位移量
31
目的地址与JMP指令所处地址的距离应在-128~127范围之内。 · 近程转移 JMP NEAR PTR OPRD ;IP=IP+16位位移量 或 JMP OPRD ;NEAR可省略
目的地址与JMP指令应处于同一地址段范围之内。
· 远程转移 JMP FAR PTR OPRD ;IP=OPRD的段内位移量,CS=OPRD所在段地址。
远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。
间接转移指令的目的地址可以由存储器或寄存器给出。
· 段内间接转移 JMP WORD PTR OPRD ;IP=[EA] (由OPRD的寻址方式确定)。
JMP WORD PTR[BX] IP=((DS)*16+(BX)) JMP WORD PTR BX IP=(BX)
· 段间间接转移 JMP DOWRD PTR OPRD;IP=[EA],CS=[EA+2]
该指令指定的双字节指针的第一个字单元内容送IP,第二个字单元内容送CS。
JMP DWORD PTR [BX+SI] (2) 调用和返回指令
CALL指令用来调用一个过程或子程序。由于过程或子程序有段间(即远程FAR)和段内调用(即近程NEAR)之分。所以CALL也有FAR和NEAR之分。。因此RET也分段间与段内返回两种。 调用指令一般格式为: 段内调用: CALL NEAR PTR OPRD ;,
操作:SP=SP-2,((SP)+1),(SP))=IP,IP=IP+16位位移量
CALL指令首先将当前IP内容压入堆栈。当执行RET指令而返回时,从堆栈中取出一个字放入IP中。
段间调用:CALL FAR PTR OPRD ;
操作:SP=SP-2,((SP)+1),(SP))=CS;SP=SP-2,((SP)+1),(SP))
=IP;IP=[EA];CS=[EA+2]
CALL指令先把CS压入堆栈,再把IP压入堆栈。当执行RET指令而返回时,
32
从堆栈中取出一个字放入IP中,然后从堆栈中再取出第二个字放入CS中,作为段间返回地址。
返回指令格式有:
RET ;SP=((SP+1),SP),SP=SP+2 RET n ;SP=((SP+1),SP),SP=SP+2 SP=SP+n
RET n指令要求n为偶数,当RET正常返回后,再做SP=SP+n操作。
2.条件转移指令
8088有18条不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段(CS)内,并且以当前指针寄存器IP内容为基准,其位移必须在十127~—128的范围之内。如表2-5所示。
表2-5 条件转移指令表
汇编格式 标志位转移指令 JZ/JE/JNZ/JNE OPRD JS/JNS OPRD JP/JPE/JNP/JPO OPRD JO/JNO OPRD JC/JNC OPRD 不带符号数比较转移指令 JA/JNBE OPRD JAE/JNA OPRD JB/JNAE OPRD JBE/JNA OPRD 带符号数比较转移指令 JG/JNLE OPRD JGE/JNL OPRD JL/JNGE OPRD JLE/JNG OPRD 测试转移指令 JCXZ OPRD 结果为零/结果不为零转移 结果为负数/结果为正数转移 结果奇偶校验为偶/结果奇偶校验为奇转移 结果溢出/结果不溢出转移 结果有进位(借位)/结果无进位(借位)转移 高于或不低于等于转移 高于等于或不低于转移 小于或不大于等于转移 小于等于或不大于转移 高于或不低于等于转移 高于等于或不低于转移 小于或不大于等于转移 小于等于或不大于转移 CX=0 时转移 操 作 从该表可以看到,条件转移指令是根据两个数的比较结果或某些标志位的状态来决定转移的。在条件转移指令中,有的根据对符号数进行比较和测试的结果实现转移。这些指令通常对溢出标志位OF和符号标志位SF进行测试。对无符号
33
数而言,这类指令通常测试标志位CF。对于带符号数分大于、等于、小于3种情况;对于无符号数分高于、等于、低于3种情况。在使用这些条件转移指令时,一定要注意被比较数的具体情况及比较后所能出现的预期结果。
3.循环控制指令
对于需要重复进行的操作,微机系统可用循环程序结构来进行,8086/8088系统为了简化程序设计,设置了一组循环指令,这组指令主要对CX或标志位ZF进行测试,确定是否循环,如表2-6所示。
表2-6 循环指令表
指令格式 LOOP OPRD LOOPNZ/LOOPNE OPRD LOOPZ/LOOPE OPRD 执行操作 CX=CX-1;若CX<>0,则循环 CX=CX-1,若CX<>0 且ZF=0,则循环 CX=CX-1,若CX<>0 且ZF=1,则循环 例7 有一首地址为ARRAY的M个字数组,试编写一段程序,求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL中,程序段如下:
MOV CX,M ;设计数器初值
MOV AX,0 ;累加器初值为0
MOV SI,AX ;地址指针初值为0
START:ADD AX,ARRAY[SI] ADD SI,2 ;修改指针值(字操作,因此加2) LOOP START ;重复 MOV TOTAL,AX ;存结果 例8 有一字符串,存放在ASCIISTR的内存区域中,字符串的长度为L。要求在字符串中查找空格(ASCII码为20H),找到则继续运行,否则转到NOTFOUND去执行。实现上述功能的程序段如下:
MOV CX,L ;设计数器初值
MOV SI,-1 ;设地址指针初值
MOV AL,20H ;空格的ASCII码送AL
NEXT: INC SI CMP AL,ASCIISTR[SI] ;比较是否空格? LOOPNZ NEXT JNZ NOTFOUND
…… ……
34
NOTFOUND:
…… ……
六、 标志处理和CPU控制类指令
标志处理指令用来控制标志,主要有CF、DF和IF三个。处理器控制指令用以控制处理器的工作状态,均不影响标志位,我们仅列出了一些常用指令,具体见表2-7所示。
表2-7 标志处理和CPU控制类指令
汇编语言格式 标志类指令 CLC STC CMC CLD STD CLI STI CPU控制类指令 HLT WAIT ESC LOCK NOP 执行操作 置进位标志,CF=1 清进位标志,CF=0 进位标志取反 清方向标志,DF=0 置方向标志,DF=1 关中断标志,IF=0,不允许中断 开中断标志,IF=1,允许中断 使处理器处于停止状态,不执行指令 使处理器处于等待状态,TEST线为低时,退出等待 使协处理器从系统指令流中取得指令 封锁总线指令,可放在任一条指令前作为前缀 空操作指令,常用于程序的延时和调试
习题与思考:
1.试分析下列程序段: ADD AX,BX JNC L2 SUB AX,BX JNC L3 JMP SHORTL5
如果AX、BX的内容给定如下: AX BX (1)14C6H 80DCH (2)B568H 54B7H
问该程序在上述情况下执行后,程序转向何处?
35
2.编写一段程序,比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串,则执行NEW_LESS,否则顺序执行。
36