字符串处理是指对一系列的字母或数字的代码进行相同功能的处理 计算机中字符代码一般都采用 ASCII 码, 每个字符的代码占一个字节, 一组字符串存放在一个连续的存储区中
存放在连续的存储区中的这组字符串, 可看为一个数据块 为了提高对字符串 ( 或数据块 ) 的处理效率,8086/8088 指令系统中专门提供了一组对字符串处理的指令, 这些指令包括 :
字符串传送指令 (MOVS) 字符串比较指令 (CMPS) 字符串扫描指令 (SCAS) 字符串装入指令 (LODS) 字符串存储指令 (STOS)
字符串处理指令即可以按字节操作, 也可以按字操作, 且 DST 和 SRC 的寻址方式均为隐含寻址 这类指令要遵循的共同约定如下 :
1 若源串在存储器, 则存储器地址由 DS:SI 确定 ; 若源串在寄存器, 则 : 字节操作时, 在 AL 中字操作时, 在 AX 中
2 若目的串在存储器, 则存储器地址必须由 ES:DI 确定 ; 若目的串在寄存器, 则 : 字节操作时, 在 AL 中字操作时, 在 AX 中
3 字符串操作指令 CPU 执行后, (SI) 或 (DI) 会自动地修改, 其 修改方向受 DF 控制
当 DF= 0 时, 会自动地增 1 或 2 1 时, 会自动地减 1 或 2 增 / 减 1/2, 受操作类型控制, 字节操作时, 增 / 减 1 字操作时, 增 / 减 2
4 字符串处理指令的重复次数 ( 重复执行的次数 ) CX
字符串处理指令的助记符及其主 要完成功能如下表所示
助记符格式 MOVS DST, SRC MOVSB MOVSW 主要功能 (ES:DI ) (DS:SI) 字操作时 : (SI) (SI)±2 (DI) (DI)±2 字节操作时 :(SI) (SI)±1 (DI) (DI)±1 字节传送字传送
助记符格式 CMPS DST, SRC CMPSB CMPSW SCAS DST SCAB SCAW 主要功能 (DS:SI) - (ES:DI) 建立标志字操作时 :(SI) (SI)±2 (DI) (DI)±2 字节操作时 :(SI) (SI)±1 (DI) (DI)±1 字节比较字比较字扫描时 : (AX) - (ES:DI) 建立标志 (DI) (DI)±2 字节扫描时 : (AL) - (ES:DI) 建立标志 (DI) (DI±1)
助记符格式 LODS SRC LODSB LODSW STOS DST STOSB STOSW 主要功能 字操作时 :(AX) (DS:SI) (SI) (SI)±2 字节操作时 :(AL) (DS:SI) (SI) (SI)±1 字操作时 :(ES:DI) AX (DI) (DI)±2 字节操作时 :(ES:DI) (AL) (DI) (DI)±1
Χ 重复前缀 字符串操作指令除了完成传送 比 较 扫描 装入和存储等功能外, 还实现地址指针的自动修正, 这对程序实现循环提供了方便 但对每条指令来说,
它只执行一次, 当加上重复前缀以后, 后面的字符串操作指令就可以重复地执行, 直到某个条件满足为止 重复前缀有三种形式, 它们的助记符格式及功能说明见下表所示
助记符格式 REP MINST MOVSB MOVSW MINST STOSB STOSW LODSB LODSW 主要功能 当 (CX) 0 时, 重复执行 MINST,(CX)-1 (CX);
助记符格式 主要功能 REPE/REPZ CINST CMPSB CINST CMPSW 当 (CX) 0 时, 且 ZF=1 时, 重复执行 CINST, (CX)-1 (CX);
助记符格式 主要功能 REPNE/REPNZ CINST SCASB CINST SCASW 当 (CX) 0 时, 且 ZF=0 时, 重复执行 CINST, (CX)-1 (CX).
Χ 字符串处理指令应用举例 例 1.(P153 例 4.3.20(REP MOVSB 指令应用 )) 编写一子程序, 要求实现将一个数据 块从存储器的一个区域传送到另一个区域
分析题目, 提出编程思想 题目要求实现数据块传送 ( 搬家 ), 但并没有说明源数据块和目的数据块在存储器的地址 根据实际情况, 源数据块和目的数据块在存储器的地址有以下两种情况 :
1 源数据块和目的数据块的存储区域不重叠 2 源数据块和目的数据块的存储区域有部分重叠 其具体情况如下图所示
DS:SI ES:DI 源数据块 目的数据块 源数据块和目的数据块不发生重叠的情况
DS:SI 错 ES:DI DS:SI 对 ES:DI 源数据块 目的数据块 有部分重叠的情况 ( 一 ) 这时, 要让 SI DI 指向源和目的数据块的末址, 按地址递减方向搬
ES:DI DS:SI 目的数据块 源数据块 有部分重叠的情况 ( 二 ) 这时, 要让 SI DI 指向源和目的数据块的首址, 按地址递增方向搬
总之, 当 (SI) 低于 (DI) 时, 要让 SI DI 指向源和目的数据块的末址, 按地址递减方向搬 当 (SI) 高于 (DI) 时, 要让 SI DI 指向源和目的数据块的首址, 按地址递增方向搬
; 子程序说明文件 ; 子程序名 :SMOVE ; 子程序功能 : 数据搬家 ; 入口参数 : SADR 双字类型单元中存放的是源区的首地址, DADR 双字类型单元中存放的是目的数据区的首地址 SLENG 字类型单元中存放的是数据块中包含的字节数
; 出口参数 : 无 ; 用到的寄存器 :DS ES SI DI CX
子程序设计 CODES SEGMENT ASSUME CS:CODES SMOVE PROC FAR LDS SI, SADR ; 源区首地址 DS:SI LES DI, DADR ; 目标区首地址 ES:DI MOV CX, SLENG ; 长度 CX CLD CMP SI, DI ; (SI)>(DI)?
子程序设计 JA MOVE ; 高于, 则转到 MOVE STD ADD SI, CX DEC SI MOVE: MOVSB 或者 :MOVE: LOOP MOVE REP MOVSB RET RET SMOVE ENDP CODES ENDS
子程序设计 上面程序中, 若 DF=0,( 即按地址增大的方向传送 ), 我们有 : MOVE: REP MOVSB 等效于 MOVE: MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI LOOP MOVE
子程序设计 上面程序中, 若 DF=1,( 即按地址减小的方向传送 ), 我们有 : MOVE: REP MOVSB 等效于 MOVE: MOV AL,[SI] MOV ES:[DI],AL DEC SI DEC DI LOOP MOVE
例 2. 字符串比较指令 CMPS 的应用 比较 STR1 和 STR2 两串是否相等 若相等, 则在屏幕上显示 ˊSAMEˊ, 若不相等, 则在屏幕上显示 ˊNOSAMEˊ
分析题目 STR1 STR2 ˊ1ˊ ˊ2ˊ ˊ3ˊ ˊ4ˊ ˊ1ˊ ˊ2ˊ ˊ5ˊ ˊ4ˊ 源串 目的串 比较两串是否相等, 指的是两串中对应单元的值均相等, 则两串相等 ; 否则, 两串不相等
程序设计 DATA SEGMENT STR1 DB ˊ1234ˊ STR2 DB ˊ1254ˊ STRING1 DB ˊSAMEˊ,0DH,0AH,ˊ$ˊ STRING2 DB ˊNOSAMEˊ,0DH,0AH, ˊ$ˊ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA
程序设计 START: MOV AX, DATA MOV DS, AX MOV ES,AX LEA SI, STR1 LEA DI, STR2 MOV CX, 4 CLD REPE CMPSB
程序设计 JNE NSAME LEA DX,STRING1 MOV AH,09H INT 21H JMP EXIT NSAME: MOV AH,09H MOV DX, OFFSET STRING2 INT 21H
程序设计 EXIT: MOV AH, 4CH INT 21H CODE ENDS END START
程序设计 上面程序中, 我们对 REPE CMPSB 指令用一般数据处理指令实现, 可以有 : 等效于 REPE CMPSB JNE NSAME NEXT:MOV AL,[SI] CMP AL, ES:[DI] JNE NSAME INC SI INC DI LOOP NEXT
例 3. 字符串扫描指令的应用 若要在某个字符串 STRING 中查 找字符 A, 若查找不到转向 NOTFOUND, 那么, 我们可以有下面的程序段 :
例 3. 字符串扫描指令的应用 MOV AX,SEG STRING MOV ES,AX MOV DI,OFFSET STRING MOV CX,LENG1 MOV AL, A CLD REPNE SCASB
例 3. 字符串扫描指令的应用 NOTFOUND: JNE NOTFOUND
例 4. 字符串存储指令 (STOS) 的应用 若要对某数据缓冲区清零, 我 们可以有下面程序段 :
例 4. 字符串存储指令 (STOS) 的应用 MOV AX,SEG BUFDAT MOV ES,AX MOV DI,OFFSET BUFDAT MOV CX,LENGTH BUFDAT MOV AL,00 CLD REP STOSB
例 4. 字符串存储指令 (STOS) 的应用 指令 REP STOSB 将重复地将 AL 的内容送到 DI 所指单元, 并修正 DI 和 CX 的内容, 直到 (CX)=0 为止, 从而完成以 CX 内容为长度的 BUFDAT 为首地址的缓冲区全部清了零
Χ 字符串处理指令应用注意点小结 字符串处理指令即可以按字节操作, 也可以按字操作, 且 DST 和 SRC 的寻址方式均为隐含寻址 这类指令要遵循的共同约定如下 :
1 若源串在存储器, 则存储器地址由 DS:SI 确定 ; 若源串在寄存器, 则 : 字节操作时, 在 AL 中字操作时, 在 AX 中
2 若目的串在存储器, 则存储器地址必须由 ES:DI 确定 ; 若目的串在寄存器, 则 : 字节操作时, 在 AL 中字操作时, 在 AX 中
3 字符串操作指令 CPU 执行后, (SI) 或 (DI) 会自动地修改, 其 修改方向受 DF 控制
当 DF= 0 时, 会自动地增 1 或 2 1 时, 会自动地减 1 或 2 增 / 减 1/2, 受操作类型控制, 字节操作时, 增 / 减 1 字操作时, 增 / 减 2
4 字符串处理指令的重复次数 ( 重复执行的次数 ) CX
作业 : P190 34.