(3)串搜索指令SCAS 華中科技大? LEA DX,ASS MOV AH,10 INT 21H LEA DI,ASS+2 ;输入串首址→DI MOV CL,ASS+1 ;输入串长度→CX MOVZX CX,CL MOV AL,′A' MOV BX,0 ;计数器清零 P: REPNE SCASB ;查找字符”A” JE A ;查到字符”A”转A处执行 JMP OUT1 ;全部查完转结束 A: CMP CX,0 ;所有判断完否 JE OUT1 ;全部查完转结束 CMP BYTE PTR [DI],M?;判断”A”后的字特为”M否 JNE B ;不是转B处执行 INC I BX ;是”AM”计数器加1 B: JMP P ;未完转P继续判断 0UT1: MOV AH, 4CH ;返回操作系统 INT 21H CODE ENDS END START
(3)串搜索指令 SCAS LEA DX,ASS MOV AH,10 INT 21H LEA DI,ASS+2 MOV CL,ASS+1 MOVZX CX,CL MOV AL,′A′ MOV BX,0 P: REPNE SCASB JE A JMP OUT1 A: CMP CX,0 JE OUT1 CMP BYTE PTR [DI], ‘M’ JNE B INC BX B: JMP P OUT1:MOV AH,4CH INT 21H CODE ENDS END START ;输入串首址→DI ;输入串长度→CX ;计数器清零 ;查找字符 ” A ” ;查到字符 ” A ”转A处执行 ;全部查完转结束 ;所有判断完否 ;全部查完转结束 ;判断 ” A ”后的字符为 ” M ” 否 ;不是转B处执行 ;是 ”AM ”计数器加1 ;未完转P继续判断 ;返回操作系统
(4)取字节/字/双字串指令LODS 華中科技大? LODSB从字节串中取数 ●格式:L0DS OPS 或 LODSW从字串中取数 LODSD从双字串中取数 ●功能:(1)字节操作: (DS:[SI]/[ESI])→AL 字操作: (DS: [SI]/[ESI]) →AX 双字操作: DS:[SI]/[ESI]) →EAX 将SI/BSI所指的源串中的一个字节(或字、双字)存储单元中的数 据取出送入AL(或AX、EAX)中。 (2)修改SI/SI,使之指向下一元素: i.当DF=0时,(SI)/(SI)增量1(字节操作)或2(字操作)或 4(双字操作) 。 ii.当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作)或 4(双字操作) (3)修改循环变量(CX)/(ECX)-1→CX)/ECX
(4)取字节/字/双字串指令 LODS ●格式: LODS OPS 或 ●功能: ⑴ 字节操作:(DS:[SI]/[ESI])→AL 字操作: (DS:[SI]/[ESI]) →AX 双字操作: DS:[SI]/[ESI]) →EAX 将SI/ESI所指的源串中的一个字节(或字、双字)存储单元中的数 据取出送入AL(或AX、EAX)中。 ⑵ 修改SI/ESI,使之指向下一元素: i.当DF=0时,(SI)/(ESI)增量1(字节操作)或2(字操作) 或 4(双字操作)。 ii.当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作) 或 4(双字操作)。 ⑶ 修改循环变量(CX)/(ECX) -1→ CX)/ECX LODSB 从字节串中取数 LODSW 从字串中取数 LODSD 从双字串中取数
(4)取字节/字/双字串指令LODS 華中科技大? 说明: 由于该指令的目的地址为一固定的寄存器,如果带上 重复前缀,源串的内容将连续地送入AL(或AX、EAX)中,操 作结束后,AL(或AX、EAX)中只保存了串中最后一个元素的 值,这是没有多大意义的,因此,该指令一般不带重复前 缀。 例4
(4)取字节/字/双字串指令 LODS 说明: 由于该指令的目的地址为一固定的寄存器,如果带上 重复前缀,源串的内容将连续地送入AL(或AX、EAX)中,操 作结束后,AL(或AX、EAX)中只保存了串中最后一个元素的 值,这是没有多大意义的,因此,该指令一般不带重复前 缀 。 例 4
(4)取字节/字/双字串指令LODS 華中科技大? 例4: 下面阅读一个使用了L0DSD的程序段: .386 DATA SEGMENT USE16 BUF DB ‘ABCDEFGHIJKL, COUNT EQU $-COUNT START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BUF MOV CX,COUNT/4 LODSD ;该语句执行后,(EAX)=44434241H
(4)取字节/字/双字串指令 LODS 例4: 下面阅读一个使用了LODSD的程序段: .386 DATA SEGMENT USE16 BUF DB ‘ABCDEFGHIJKL’ COUNT EQU $-COUNT ┇ START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BUF MOV CX,COUNT/4 LODSD ;该语句执行后,(EAX)=44434241H ┇
(5)存储字节/字/双字指令STOS 華中科技大浮 ●格式:ST0S OPD 或 STOSB往字节串中存数 STOSW 往字串中存数 ·功能: STOSD 往双字串中存数 (1)字节操作: (AL)→ ES:[DI]/[EDI] 字操作: (AX)→ ES: [DI]/[EDI] 双字操作:(EAX)→ES :[DI]/[EDI] 即将AL(或AX、EAX)中的数据送入DI/EDI所指的目的串中的字节(或 字、双字)存储单元中。修改指针DI/EDI,使之指向串中的下一个元素。 (2)修改串指针,使之指向下一元素,修改方式为: i.当DF=0时,(SI)/(ESI)增量1(字节操作)或2(字操作)或 4(双字操作)。 ii.当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作)或 4(双字操作)。 说明:该指令执行后,并不影响标志位,因而它一般只带REP重复前缀, 用来将一片连续的存储字节(或字)单元置相同的值
(5)存储字节/字/双字指令 STOS ●格式: STOS OPD 或 ●功能: ⑴ 字节操作:(AL)→ ES:[DI]/[EDI] 字操作: (AX)→ ES:[DI]/[EDI] 双字操作:(EAX)→ES:[DI]/[EDI] 即将AL(或AX、EAX)中的数据送入DI/EDI所指的目的串中的字节(或 字、双字)存储单元中。修改指针DI/EDI,使之指向串中的下一个元素。 ⑵ 修改串指针,使之指向下一元素,修改方式为: i.当DF=0时,(SI)/(ESI)增量1(字节操作)或2(字操作) 或 4(双字操作)。 ii.当DF=1时,(SI)/(ESI)减量1(字节操作)或2(字操作) 或 4(双字操作)。 说明:该指令执行后,并不影响标志位,因而它一般只带REP重复前缀, 用来将一片连续的存储字节(或字)单元置相同的值。 STOSB 往字节串中存数 STOSW 往字串中存数 STOSD 往双字串中存数