MOV DI,OFFSET ASCBUF ;设置目的地址指针
AGAIN:MOV AL,[SI]
MOV BL,AL
AND AL,0FH ;取低位BCD码 OR INC
AL,30H ;转换成ASCII码 DI ;修改指针
MOV [DI],AL ;存入 MOV AL,BL PUSH CX MOV CL,4 SHR OR
AL,CL
AL,30H ;高位转换成ASCII码 CX
DI
SI ;修改指针
MOV [DI],AL ;存入 POP INC
INC
LOOP AGAIN ;重复工作
习题与思考:
1.写出实现下列计算的指令序列。(假定X、Y、Z、W、R都为字变量) (1)Z=(W*X)/(R+6) (2)Z=((W-X)/5*Y)*2
2.假定DX=1100100110111001B,CL=3,CF=1,试确定下列各条指令单独执行后DX的值。 (1)SHR DX,1 (2)SHL DL,1 (3)SAL DH,1 (4)SAR DX,CL (5)ROR DX,CL (6)ROL DL,CL (7)RCR DL,1 (8)RCL DX,CL 3.试分析下列程序完成什么功能? MOV CL,4 SHL DX,CL MOV BL,AH SHL BL,CL SHR BL,CL OR DL,BL 4.已知程序段如下:
26
MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX INT 20H 试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少?
第四讲:
3.4 指令系统-循环、子程序调用、中断、其他
回顾:8086/8088的内部结构和寄存器,8086/8088的工作过程
8086/8088的寻址方式及操作数地址的计算。
重点和纲要:要求学生了解串操作指令的功能。指令系统-循环、子程
序调用、中断、其他(掌握指令内涵,会用)
教学方法、实施步骤 回 顾 讲 授 提 问 小 结 时间分配 5”×2 35” ×2 3” ×2 2” ×2 教学手段 板书 计算机 投影仪 多媒体课件等 27
讨 论 5” ×2
讲授内容:
四、 串操作类指令 (选讲或简单介绍)
串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。
1.重复指令前缀
串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见表2-3所示。
表2-3重复前缀
汇编格式 REP REPE/ REPZ REPNE/ REPNZ 执行过程 影响指令 (1)若(CX)=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)MOVS,STOS,重复(1)-(3) (1)若(CX)=0或ZF=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3) (1)若(CX)=0或ZF=1,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3) CMPS,SCAS LODS CMPS,SCAS 2.串指令
串指令共有五种,具体见表2-4。 对串指令要注意以下几个问题:
(1) 各指令所使用的默认寄存器是:SI(源串地址),DI(目的地址),CX(字串长度),AL(存取或搜索的默认值)。 (2) 源串在数据段,目的串在附加段。
表2-4 串操作指令
功能 串传送 指令格式 MOVS DST,SRC MOVSB MOVSW 串比较 CMPS DST,SRC CMPSB CMPSW 执行操作 由操作数说明是字节或字操作;其余同MOVSB或MOVSW [(ES:DI)]←[(DS:SI)];SI=SI±1,DI=DI±1;REP控制重复前两步 [(ES:DI)]←[(DS:SI)];SI=SI±2,DI=DI±2;REP控制重复前两步 由操作数说明是字节或字操作;其余同CMPSB或CMPSW [(ES:DI)]-[(DS:SI)];SI=SI±1,DI=DI±1;重复前缀控制前两步 [(ES:DI)]-[(DS:SI)];SI=SI±2,DI=DI±2;重复前缀控制前两步 28
串搜索 SCAS DST SCASB SCASW 存串 STOS DST STOSB STOSW 取串 LODS SRC LODSB LODSW 由操作数说明是字节或字操作;其余同SCASB或SCASW AL-[(ES:DI)]];DI=DI±1;重复前缀控制前两步 AX-[(ES:DI)];DI=DI±2;重复前缀控制前两步 由操作数说明是字节或字操作;其余同STOSB或STOSW AL→[(ES:DI)]];DI=DI±1;重复前缀控制前两步 AX→[(ES:DI)];DI=DI±2;重复前缀控制前两步 由操作数说明是字节或字操作;其余同LODSB或LODSW [(DS:SI)]]→AL;SI=SI±1;重复前缀控制前两步 [(DS:SI)]→AX;SI=SI±2;重复前缀控制前两步 (3) 方向标志与地址指针的修改。DF=1,则修改地址指针时用减法;DF=0时,
则修改地址指针时用加法,
MOVS、STOS、LODS指令不影响标志位。 · MOVS指令的功能,
把数据段中由SI间接寻址的一个字节(或一个字)传送到附加段中由DI间接寻址的一个字节单元(或一个字单元)中去,然后,根据方向标志DF及所传送数据的类型(字节或字)对SI及DI进行修改,在指令重复前缀REP的控制下,可将数据段中的整串数据传送到附加段中去。
例2 在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中,其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;M ESS2为附加段中用以存放字符串区域的首地址。
实现上述功能的程序段如下:
LEA SI,MESS1 ;置源串偏移地址 LEA DI,MESS2 ;置目的串偏移地址 MOV CX,17 ;置串长度 CLD ;方向标志复位 REP MOVSB ;字符串传送 其中,最后一条指令也可写成
REP MOVS ES:BYTE PTR[DI],DS:[SI]
或 REP MOVS MESS2,MESS1
· CMPS指令的功能,
把数据段中由SI间接寻址的一个字节(或一个字)与附加段中由DI间接寻址的一个字节(或一个字)进行比较操作,使比较的结果影响标志位,然后根据方向标志DF及所进行比较的操作数类型(字节或字)对SI及DI进行修改,在指令重复
29
前缀REPE/REPZ或者REPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节(或字),或者第一个相等的字节(或字)。
例3 在数据段中有一字符串,其长度为17,存放在数据段中从符号地址MESS1开始的区域中;同样在附加段中有一长度相等的字符串,存放在附加段中从符号地址MESS2开始的区域中,现要求找出它们之间不相匹配的位置。 实现上述功能的程序段如下;
LEA SI,MESS1 ;装入源串偏移地址
LEA DI,MESS2 ;装入目的串偏移地址 MOV CX,17 ;装入字符串长度 CLD ;方向标志复位 REPE CMPSB
上述程序段执行之后,SI或DI的内容即为两字符串中第一个不匹配字符的下一个字符的位置。若两字符串中没有不匹配的字符.则当比较完毕后,CX=0,退出重复操作状态。 · SCAS指令的功能,
用由指令指定的关键字节或关键字(分别存放在AL及AX 寄存器中),与附加段中由DI间接寻址的字节串(或字串)中的一个字节(或字)进行比较操 作,使比较的结果影响标志位,然后根据方向标志DF及所进行操作的数据类型(字节或字) 对DI进行修改,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字)匹配的字节(或字),或者搜索第一个与关键字节(或字)不匹配的字节(或字)。
例4 在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H)。
实现上述功能的程序段如下:
LEA DI,MESS2 ;装入目的串偏移地址 MOV AL,20H ;装入关键字节 MOV CX,17 ;装入字符串长度 REPNE SCASB
上述程序段执行之后,DI的内容即为相匹配字符的下一个字符的地址,CX中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字),则当查完之后(CX)=0退出重复操作状态。 · STOS指令的功能,
30