zoukankan      html  css  js  c++  java
  • 汇编学习笔记37

    第六单

    二、串指令的重复前缀

    由于串操作指令每次只能对字符串中的一个字符进行操作,进行操作时总是要使用一个循环。8086,8088提供了重复操作前缀,用于重复串操作。

    1. REP

    重复后面的操作。每次执行重复指令前,判断CX,如果CX=0,结束指令,否则,执行前缀后的串操作。

    REP前缀主要用于MOVS和STOS前,一般不在LODS前使用任何重复前缀。

    例:

    ; 子程序名: FILLB

    ; 功能: 填充缓冲区

    FILLB PROC

    PUSH AX

    PUSH DI

    JCXZ FILLB_1

    CLD

    SHR CX, 1

    MOV AH, AL

    REP STOSW

    JNC FILLB_1

    STOSB

    FILLB_1: POP DI

    POP AX

    RET

    FILLB ENDP

    2.REPZ  REPE

    CX=0或ZF=0时,停止操作

    主要用于CMPS 和SCAS前。由于MOVS和STOS不影响标志位,在这些串操作前使用REPZ和REP效果是一样的,但是通常在MOVS和STOS前使用REP

    例:

    ; 子程序名: STRCMP

    ; 功能: 比较字符串是否相同

    ; 入口参数: 两个字符串分别存放在段值:偏移地址为 DS: SI 和ES: DI中

    ; 出口参数: 如果AX=0,则两字符串相同,否则,不同

    ; 说明: 字符串以0结束

    STRCMP PROC

    CLD

    PUSH DI

    XOR AL, AL

    MOV CX, 0FFFFH

    NEXT: SCASB

    JNZ NEXT

    NOT CX

    POP DI

    REPZ CMPSB

    MOV AL, [SI-1]

    MOV BL, ES: [DI-1]

    XOR AH, AH

    MOV BH, AH

    SUB AX, BX

    RET

    STRCMP ENDP

    3. REPNZ REPNE

    CX=0或ZF=1时,停止重复

    主要用于串扫描指令

    例:

    假设数据段

    CONAME DB 'SPACE EX……' ;20Byte

    PLINE DB 20DUP(' ')

    用串指令完成

    1)从左至右把CONAME内容传入PLINE

    2)从右至左把CONAME内容传入PLINE

    3)把CONAME第3个和第4个字节内容传入AX

    4)把AX存入PLINE+5开始的单元中

    PUSH DS

    PUSH ES

    PUSH SI

    PUSH DI

    PUSH AX

    MOV AX, SEG CONAME

    MOV DS, AX

    MOV AX, SEG PLINE

    MOV ES, AX

    1. LEA SI, CONAME

    LEA DI, PLINE

    CLD

    MOV CX, 20

    REP MOVSB

    2. LEA SI, CONAME+19

    LEA DI, PLINE+19

    STD

    MOV CX, 20

    REP MOVSB

    3. MOV SI, CONAME+2

    LODSW

    4. MOV DI, PLINE+5

    MOV CX, 2

    CLD

    REP STOSB

  • 相关阅读:
    试算平衡
    对账服务
    会计科目与账户
    支付系统难点全面梳理剖析:核算对账核心
    支付系统设计——你不可不知的会计核心(转发整理)
    支付系统设计之查漏补缺的一环:差错账处理
    支付清算业务总结
    财务对账系统v1.0立项到结项的整体回顾
    DNS视图及压力测试(四)
    一个快速检测系统CPU负载的小程序
  • 原文地址:https://www.cnblogs.com/hailong/p/1929126.html
Copyright © 2011-2022 走看看