串与表的处理程序设计 1 串操作指令 “串”是指存储器中的一段连续的字或字节单元这些 单元中存放的内容可以是字符或数据 “串操作”就是对这些单元进行某种相同的操作比如将 一段数据从一个存储区传送到另一个存储区 1 (3)当标志位DF=0时,SI和DI的修改为递增,即加2( 字操作)或加1(字节操作)当DF=1时,SI和DI的修 改为递减,即减2或减1 (2)串操作指令每次只对串中的一个字或一个字节单元 进行操作,并自动修改SI和(或)DI,使其指向下一个字或 字节单元 (1)串操作指令使用专用的寻址方式:源操作数地址由 DS:[SI]提供,目的操作数由ES:[DI]提供 串操作指令具有以下共有特点: 2 1. 取串指令 由于源串是由SI指定,如果程序中在执行该指令时已经明 确是字或字节,则可以用无操作数指令LODSB(字节操作 )或LODSW(字操作)替代 该指令执行后对标志无影响 指令格式:LODS 源串 将源串中的一个字或字节内容送入AX或AL中 ,并根据DF修改SI 功能: 3 2. 存串指令 同样,指令可以用无操作数指令STOSB或STOSW替代。
该指令对标志无影响 STOS 目的串指令格式: 功能: 将AX或AL中的内容送入目的串中的一个字单 元或字节单元,并根据DF修改DI 4 3. 串传送指令 MOVS 目的串,源串 同样,指令可以用无操作数指令MOVSB或MOVSW替代 指令对标志无影响 指令格式: 功能: 将由SI指向的源串的一个字或字节传送到DI所指 向的目的串中并根据DF修改SI和DI 5 4. 串比较指令 CMPS 源串,目的串 将源串中的一个字节或字减去目的串中的一个字 或字节,结果不回送但将影响标志寄存器同 时,将根据DF修改SI和DI 指令格式: 同样,指令可以用无操作数指令CMPSB或CMPSW替代 功能: 6 5、串搜索指令 SCAS 目的串 查找的方法:用AX或AL的内容减去目的串中的一个字或字 节,相减的结果反映在标志寄存器中每查找一次,将按照 DF修改DI 指令格式: 功能: 在目的串中查找AX或AL指定的内容 同样,指令可以用无操作数指令SCASB或SCASW替代 7 6、重复前缀指令 REP 重复操作的次数由CX控制,每执行一次串操作指令, CX内容减1,直到CX内容为0。
指令格式: 为了方便对若干个字或字节进行多次同样的操作,可在 上述各种指令的前面加上REP指令 8 例如:REP MOVSB 设在执行该指令前,DF=0,(SI)=0020H,(DI)=100H,(CX)=0030H LOP:MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI LOOP LOP 执行该指令将使数据段中从0020H开始的30H个字节传送到附加 段从0100H开始的存储区 如果改用不使用串操作指令,则它相当于下面的程序段: 9 REPE/REPZ 重复执行串操作指令的条件是:(CX)≠0和ZF=1 由于这两条指令的执行要由标志位ZF来控制结束,而 LODS、STOS和MOVS三条指令不影响标志,因此不适合 与这些指令配合使用 另外还有两条重复前缀指令: REPNE/REPNZ 重复执行串操作指令的条件是: (CX)≠0和ZF=0 10 2 串操作指令应用举例 例1:试编制一程序,在TXTBUF字符串中查找STRING 变量指定的字符若查到,则把该字符所在位置(1~n)送 入INDEX单元中。
若未查到,则把0FFH送INDEX单元中 DATA SEGMENT TXTBUF DB ABCDEFGHIJKLMNOP CUNT EQU $-TXTBUF STRING DB G INDEX DB ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS 11 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV DI,OFFSET TXTBUF;取目的串首址 MOV CX,CUNT MOV AL,STRING ;初始化DI,CX,AL CLD ;DF=0,递增方式 REPNE SCASB ;查找字符 MOV BL,0FFH JNE END0 ;条件判断:未查到,ZF=0转移 SUB DI,OFFSET TXTBUF MOV BX,DI END0:MOV INDEX,BL MOV AH,4CH INT 21H CODE ENDS END START 12 例2 试编写一程序,确定某子字符串是否在另一字符串中存 在。
若在,则记录其所在起始位置若不在则设置标志0FFH 该例是例1的更一般情况 A B C D E F G H I J K L M N O P E F 第1次比较: A B C D E F G H I J K L M N O P E F 第2次比较: E F A B C D E F G H I J K L M N O P 第3次比较: 13 DATA SEGMENT TXTBUF DB ABCDEFGHIJKLMNOP CUNT1 EQU $-TXTBUF STRING DB EF CUNT2 EQU $-STRING ;子串长度 INDEX DB 0FFH DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS 14 开始 BX<=比较次数 SI,AX<=源串首址 CX<=子串长度 DI<=子串首址 DF<=0 源串与子串比较 相同? AX<=子串位置 INDEX<=(AL)+1 AX<=(AX)+1 SI<=源串新起点 BX<=(BX)-1 (BX)=0? INDEX<=0FFH 结束 Y Y N N 比较次数=源串长度-子 串长度+1 15 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV BX,CUNT1-CUNT2+1;比较次数 MOV SI,OFFSET TXTBUF;取源串首址 MOV AX,SI LOP: LEA DI,STRING;取子串首址 MOV CX,CUNT2 CLD REPZ CMPSB; 比较 JZ MATCH ;(CX)=0且ZF=1,相同,转 INC AX ; 未匹配,比较位置往后移一位 MOV SI,AX DEC BX ;比较次数计数 JNZ LOP 16 MOV INDEL,0FFH JMP EXIT MATCH:SUB AX, OFFSET TXTBUF;位置为0~n INC AL ;位置为1~n MOV INDEX,AL EXIT: MOV AH,4CH INT 21H CODE ENDS END START 17 3 排序与查找 为了节省数据查找的时间,一般应先将无序表排列成有 序表。
排序与查找是程序设计中经常遇到的问题如统计学生 的考试成绩,了解部门工作人员的工作业绩,总结实验 结果等等 排序是指将一组没有规律的无序数据,排列成有序数据 查找是从一组数据中搜索指定的数据 排序和查找一般都是在表中进行的所谓数据表,是指 一组连续存放在存储器中的数据数据表分为有序表和 无序表 有序表——各数据项在存储器中按顺序(递增或递减) 排列否则称为无序表 18 一、气泡排序算法 1、将表中第一个数b1与第二数b2 比较,若b1
20 例如有10个数,经过5次循环比较后,第6次循环比较时已没 有数据交换,为此,设置一个标识,以确定依次循环比较中是 否有数据交换 21 DATA SEGMENT DA DB 80,3,-20,116,9,120,-6,62,-32,42 COUNT EUQ $-DA DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS 源程序的数据段和堆栈安排如下: 22 开始 置交换标志初值:BL<=0 置比较次数计数:CX<=(DX) SI ((SI)+1)? 交换数据:((SI))((SI)+1) 置交换标志:BL<=0FFH 修改指针:SI<=(SI) +1 CX<=(CX)-1 (CX) = 0? DX<=(DX)-1 有交换? DX<=比较次数(数据项数-1) 结 束 Y N Y N N Y SORT1 SORT2 NOXCHG MOV DX,COUNT-1 MOV BL,0 MOV CX,DX MOV SI,0 MOV AL,DA[SI] CMP AL,DA[SI+1] JGE NOXCHG XCHG AL,DA[SI+1] MOV DA[SI],AL MOV BL,0FFH INC SI LOOP SORT2 DEC DX CMP BL,0 JNE SORT1 23 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 SORT: MOV AX,DATA MOV DS,AX MOV DX,COUNT-1 ;置比较次数初值 SORT1: MOV BL,0 ;置交换标志初值 MOV CX,DX ;置内循环比较次数 MOV SI,0 ;置数据指针初值 SORT2: MOV AL,DA[SI] CMP AL,DA[SI+1] ;比较 JGE NOXCHG ;大于等于则转不交换 XCHG AL,DA[SI+1] ;交换 MOV DA[SI],AL MOV BL,0FFH ;置已交换标志 NOXCHG:INC SI ;修改地址 LOOP SORT2 DEC DX ;修改比较次数 CMP BL,0 ;检查交换标志 JNE SORT1 ;有交换,继续 MOV AH,4CH INT 21H COSEG 。