以字节、字和双字为单位的多个数据存放在连续的主存区域中就形成数据串,即数组
    58EB42E8392F7F214BC83B53啊76A2BEDA.jpg

    串传送指令
    1.串传送指令MOVS将数据段中的字节、字或双字数据传送至ES指向的段
    movsb ;字节串传送:ES:[EDI]=DS:[ESI];然后:ESI=ESI±1,EDI=EDI±1
    movsw ;字串传送:ES:[EDI]=DS:[ESI];然后:ESI=ESI±2,EDI=EDI±2
    movsd ;双字串传送:ES:[EDI]=DS:[ESI];然后:ESI=ESI±4,EDI=EDI±4
    2.串存储指令STOPS将AL、AX、EAX的内容存入ES指向段
    stopsb ;字节串传送:ES:[EDI]=AL;然后:EDI=EDI±1
    stopsw ;字串传送:ES:[EDI]=AX;然后:EDI=EDI±2
    stopsd ;双字串传送:ES:[EDI]=EAX;然后:EDI=EDI±4
    3.串读取指令LODS将数据段中的字节、字或双字数据读到AL、AX、EAX
    lodsb ;字节串读取:AL=DS:[ESI];然后:ESI=ESI±1
    lodsw ;字串读取:AX=DS:[ESI];然后:ESI=ESI±2
    lodsd ;双字串读取:EAX=DS:[ESI];然后:ESI=ESI±4
    4.重复前缀指令REP用在MOVS、STOPS、LODS指令前,利用计数器ECX保存数据串长度,可以理解为“若数据串没有结束(ECX≠0),则继续传送”

    字符串复制程序
    ;eg3.16.asm in windows Console
    include io32.inc
    .data
    srcmsg byte ‘In a major matter,no details are small.’,0
    destmsg byte (lengthof srcmsg) dup(0) ;定义destmsg 使之与 srcmsg 的长度相同
    .code
    start:
    mov esi,offset srcmsg ;esi=srcmsg第一个字符
    mov edi,offset destmsg ;edi=destmsg第一个字符
    mov ecx,lengthof srcmsg ;ecx=srcmsg长度(即要重复的次数)
    cld ;地址增量传送(设置DF=0 方向标志) byte时指针一次+1 word时指针一次+2 dword时指针一次+4(地址减量指令是std)
    rep movsb ;movs 串传送指令 movsb byte型 rep:重复前缀,使用ecx来设置重复次数
    mov eax,offset destmsg

    call dispmsg ;显示destmsg
    exit 0
    end start
    image.png

    串检测指令
    1.串比较指令CMPS用源操作数减去目的数据串,以比较两者之间的关系
    CMPSB:字节串比较 DS:[esi]-ES:[edi] 然后esi=esi±1,edi=edi±1
    CMPSW:字串比较
    CMPSD:双字串比较
    2.串扫描指令SCAS用AL、AX、EAX的内容减去目的数据串,比较两者间的关系
    SCASB:字节串扫描
    SCASW:字节串扫描
    SCASD:字节串扫描
    3.重复前缀指令REPE或REPZ 判断字符串是否相等
    4.重复前缀指令REPNE或REPNZ,判断字符串是否不相等

    等长字符串比较程序
    image.png