汇编串扫描指令传送串匹配串

Posted Afololer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编串扫描指令传送串匹配串相关的知识,希望对你有一定的参考价值。

初始化

源串地址位于DS:SI,目的串地址位于ES:DI

CLD则DF为0,正向扫描,STD则DF为1,反向扫描

CX,扫描的个数

常用指令

REP+MOVSB(字节传送)/MOVSW(字传送)

例子:把ds中的s1传送到es的s2

DATAS SEGMENT
    ;此处输入数据段代码  
    s1 DB "happy"
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    s2 db 5 dup(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,ES:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
      MOV AX,STACKS
    MOV ES,AX
    mov cx,5
    lea si,s1
    lea di,s2
    cld
    rep movsb
    mov cx,5
    mov si,0
L1:
    mov dl,s2[si]
    inc si
    mov ah,2
    int 21H
    
    LOOP L1
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

REPE 当相等时继续操作

CMPSB 当两个字符不相等时停止扫描,并且DI、SI加1

例题 找出两个串第几个字母开始不相同

DATAS SEGMENT
    ;此处输入数据段代码  
    S1 db 'happy'
DATAS ENDS

STACKS SEGMENT
    s2 db 'hapqy'
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,eS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,stackS
    MOV ES,AX
    lea si,S1
    lea di,s2
    mov cx,5
    repe cmpsb
    lea bx,s1
    SUB si,bx
    MOV DX,si
    add dx,30H ;因为是个位数,直接加
    mov ah,2
    int 21H
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H

CODES ENDS
    END START

SCAS AL中指定匹配字符,在ES段扫描,找到匹配字符后DI+1

DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    s2 db 'hapqy'
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,eS:STACKS
START:
    MOV AX,stackS
    MOV ES,AX
    mov al,'q'
    lea di,s2
    mov cx,50
    cld
    repne scasb
    lea bx,s2
    SUB di,bx
    MOV DX,di
    add dx,30H ;因为是个位数,直接加
    mov ah,2
    int 21H
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H

CODES ENDS
    END START

以上是关于汇编串扫描指令传送串匹配串的主要内容,如果未能解决你的问题,请参考以下文章

串操作汇编笔记

汇编_标志寄存器flag_串数据的传送

8086汇编 rep 指令

8086汇编 rep 指令

DF标志和串传送指令

x86汇编指令详解