第五章 程序设计的其它方法与技术 一、本章的学习内容: 本章学习汇编语言的高级程序设计技术: (1)串操作指令的使用格式及功能; (2)宏指令的定义与调用方式; (3)模块程序设计方法及连接技术。 通过本章的学习,能提高编程的效率和质量, 简化程序设计的工作,这是汇编语言中最具特色 的部分
第五章 程序设计的其它方法与技术 一、本章的学习内容: 本章学习汇编语言的高级程序设计技术: (1)串操作指令的使用格式及功能; (2)宏指令的定义与调用方式; (3)模块程序设计方法及连接技术。 通过本章的学习,能提高编程的效率和质量, 简化程序设计的工作,这是汇编语言中最具特色 的部分
第五章 程序设计的其它方法与技术 二、本章的学习重点: (1)串操作指令MOVS、CMPS、SCAS的 使用格式及功能; (2)简单宏指令的定义与调用方式; (3)模块程序设计的方法
第五章 程序设计的其它方法与技术 二、本章的学习重点: (1)串操作指令MOVS、CMPS、SCAS的 使用格式及功能; (2)简单宏指令的定义与调用方式; (3)模块程序设计的方法
第五章 程序设计的其它方法与技术 三、本章学习的难点: (1)MOVS与MOV、CMPS与CMP功能上 的差别及串操作指令的正确使用方法; (2)宏指令的定义与调用方式 (3)模块之间的组合、定位及通信方式; (4)模块化程序设计技术
第五章 程序设计的其它方法与技术 三、本章学习的难点: (1)MOVS与MOV、CMPS与CMP功能上 的差别及串操作指令的正确使用方法; (2)宏指令的定义与调用方式; (3)模块之间的组合、定位及通信方式; (4)模块化程序设计技术
第五章 程序设计的其它方法与技术 5.1字符串操作指令 5.2宏功能程序设计
第五章 程序设计的其它方法与技术 5.1 字符串操作指令 5.2 宏功能程序设计
5.1字特串操作指令 華中科技大? (1)串传送指令 MOVS (2)串比较指令 CMPS (3)串搜索指令 SCAS (4)取字节/字/双字串指令LODS (5)存储字节/字/双字指令STOS (6)总结
5.1 字符串操作指令 (1) 串传送指令 MOVS (2)串比较指令 CMPS (3)串搜索指令 SCAS (4)取字节/字/双字串指令 LODS (5)存储字节/字/双字指令 STOS ( 6 ) 总结
(1)串传送指令MOVS 華中科技大学 MOVSW )字串传送 ●格式:MOVS OPD,OPS或 MOVSB 字节串传送 MOVSD 双字串传送 ●功能:(I)(DS:[SI]/[ESI])→ES:[DI]/[EDI] (2)修改串指针,使之指向下一元素。修改方式为: i.当DF=0时,(SI)/(ESI)增量1(字节操作)或2(字操作) 或4(双字操作) ⅱ.当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作) 或4(双字操作) 说明:(1) 该指令可带的重复前缀为:REP 即当(CX/ECX)≠0时连续传送,直至(CX/ECX)=0。 (2) 源串应在当前数据段,指针为SI/ESI;目的串应在 当前附加数据段指针为DI/BDI
(1) 串传送指令 MOVS ●格式:MOVS OPD,OPS 或 ●功能:(1) (DS:[SI]/[ESI]) → ES:[DI]/[EDI] (2) 修改串指针,使之指向下一元素。修改方式为: ⅰ.当DF=0时,(SI)/(ESI)增量1(字节操作)或2(字操作) 或4(双字操作) ⅱ.当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作) 或4(双字操作) 说明:(1) 该指令可带的重复前缀为:REP 即当(CX/ECX)≠0时连续传送,直至(CX/ECX)=0。 (2) 源串应在当前数据段,指针为SI/ESI;目的串应在 当前附加数据段指针为DI/EDI。 MOVSD 双字串传送 MOVSB 字节串传送 MOVSW 字串传送
(1)串传送指令MOVS 華中科技大? 例1:将以STR1为首址的字节存储区中存放的字符串传送到以 STR2为首址的字节存储区中。 .386 DATA SEGMENT USE16 STR1 DB ABCDEFGHIJKLM …’;输出缓冲区BUF1 COUNT EQU $-BUF1 ; BUF1中的字符个数 STR2 DB COUNT DUP (0) ;输入缓冲区BUF2 DATA ENDS STACK SEGMENT USE16 STACK DB 200 DUP (O) STACK ENDS CODE SEGMENT USE16 ASSSUME DS:DATA,ES:DATA.CS:CODE,SS:SATCK
(1) 串传送指令 MOVS 例1:将以STR1为首址的字节存储区中存放的字符串传送到以 STR2为首址的字节存储区中。 .386 DATA SEGMENT USE16 STR1 DB 'ABCDEFGHIJKLM ……' ;输出缓冲区BUF1 COUNT EQU $-BUF1 ;BUF1中的字符个数 STR2 DB COUNT DUP(O) ;输入缓冲区BUF2 DATA ENDS STACK SEGMENT USE16 STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT USE16 ASSSUME DS:DATA,ES:DATA,CS:CODE,SS:SATCK
(1)串传送指令MOVS 華中科技大浮 反向操作的源程序: START:MOV AX, DATA STD MOV DS, AX LEA SI,BUF1+COUNT-1 MOV ES, AX LEA DI,BUF2+COUNT-1 LEA SI, STR1 MOV CX,COUNT LEA DI, STR2 REP MOVSB MOV CX, COUNT "REP MOVE"语句代替了以下程序段 CLD P:MOV AL,[SI] MOV [DI],AL REP MOVSB DEC SI MOV AH, 4CH DEC DI INT 21H CX LOOP P CODE ENDS 16 由于DF=O为默认状态,故须使用STD END START 指令设置DF=1,才能反向操作
START:MOV AX,DATA MOV DS,AX ;当前数据段和当前附加数据段重合 MOV ES,AX LEA SI,STR1 ;源串首址送SI LEA DI, STR2 ;目的串首址送DI MOV CX,COUNT ;串长度送CX CLD ;将DF清0 REP MOVSB ;重复传送直至CX=0 MOV AH,4CH INT 21H CODE ENDS END START (1) 串传送指令 MOVS 16 CX 数据段 BUF1 BUF2 A B C D E F G H I J K L M A B C D E F G H I J K L M “ REP MOVSB”语句代替了以下程 序段: P: MOV AL, [SI] MOV [DI], AL INC SI INC DI LOOP P 由于每个汇编源程序的开始时, DF=0 为默认状态,一次不用专门使用CLD指 令。 反向操作的源程序: STD LEA SI,BUF1+COUNT-1 LEA DI,BUF2+COUNT-1 MOV CX,COUNT REP MOVSB "REP MOVE"语句代替了以下程序段 P: MOV AL, [SI] MOV [DI],AL DEC SI DEC DI LOOP P 由于DF=0为默认状态,故须使用STD 指令设置DF=1,才能反向操作
(2)串比较指令 ·CMPS 華中科技大浮 CMPSW 字串比较 格式:CMPS 0PD,OPS或 oCMPSB 字节串比较 CMPSD 双字串比较 ·功能: (1) (DS:[SI]/[ESI])一(ES:[DI]/[EDI]),即将SI/ESI所指的源串中的 一个字节(或字、双字)中的数与DI、DI所指的目的串中的一个字节 (或字、双字)中的据相减,并根据相减的结果设置标志位,结果并不 保存。 (2) 修改串指针,使之指向串中的下一个元素。修改方式为: i.当DF=0时,(SI)/(ESI)和(DI)/(EDI)增量1(字节操作)或2(字操 作)或4(双字操作)。 ii.当DF=1时,(SI)/(ESI)和(DI)/(EDI)减量1(字节操作)或2(字操 作)或4(双字操作)
(2)串比较指令 CMPS ●格式:CMPS OPD,OPS 或 ●功能: ⑴ (DS:[SI]/[ESI]) —(ES:[DI]/[EDI]),即将SI/ESI所指的源串中的 一个字节(或字、双字)中的数与DI、EDI所指的目的串中的一个字节 (或字、双字)中的据相减,并根据相减的结果设置标志位,结果并不 保存。 ⑵ 修改串指针,使之指向串中的下一个元素。修改方式为: i. 当DF=0时,(SI)/(ESI)和(DI)/(EDI)增量1(字节操作)或2(字操 作)或4(双字操作)。 ii. 当DF=1时,(SI)/(ESI)和(DI)/(EDI) 减量1(字节操作)或2(字操 作) 或4(双字操作)。 CMPSB 字节串比较 CMPSW 字串比较 CMPSD 双字串比较
(2)串比较指令 CMPS 華中科技大? 说明:(1)源串放在当前数据段中,指针为SI/E$I;目的串放在 当前附加数据段中,指针为DI/EDI; (2)该指令可带的重复前缀为: a.REPE/REPZ 当(CX/ECX)≠0时,如两串对应字符 相等继续比较,不相等跳出循环; b.REPNE/REPNZ当(CX/ECX)≠O时,如两串对应字符 相等继续比较,不相等跳出循环; 例2
(2)串比较指令 CMPS 说明: ⑴ 源串放在当前数据段中,指针为SI/ESI;目的串放在 当前附加数据段中,指针为DI/EDI; ⑵ 该指令可带的重复前缀为: a.REPE/REPZ 当(CX/ECX)≠0时,如两串对应字符 相等继续比较,不相等跳出循环; b.REPNE/REPNZ 当(CX/ECX)≠0时,如两串对应字符 相等继续比较,不相等跳出循环; 例 2