• 汇编学习笔记36


    本节开始学习第六单。

    第六单内容主要有两点:

    1.字符串的各种操作

    2.掌握BCD码的调整

    一、字符串操作指令

    8086,8088中共有5种基本串操作指令。在串操作指令中,由变址寄存器SI指令源操作数,由变址寄存器DI指向目的操作数。规定源操作数存放在当前数据段,目的操作数存放在当前附加段内。字符串操作方向由标志寄存器中的方向标志位来确定。

    当DF=0,按递增方向处理。

    当DF=1,按递减方向处理。

    五种串操作指令分别为: MOVS , CMPS, LODS, STOS, SCAS

    1. 字符串装入指令 (Load String) LODS

    LODSB     ; 装入字节

    LODSW     ; 装入字

    本指令的操作为:

    字节操作:  (AL) <—((SI)), (SI) <—(SI)+/-1

    字操作:    (AX) <—((SI)), (SI) <—(SI)+/-2

    相当于 MOV AL, [SI]

    INC SI 或 DEC SI

    字符串装入指令只是把字符串中的一个字符装入累加器中,该指令不影响标志位

    例:

    MESS DB 'HELLO','0'

    TAB DW 123, 342

    ……

    MOV SI, OFFSET MESS

    LODS   ;LODSB

    MOV SI, OFFSET TAB

    LODS   ;LODSW

    例2:

    ; 子程序名: STRLWR

    ; 功能:    把字符串中的大写字母转化为小写字母,字符串以0结尾

    ; 入口参数: DS: SI 字符串首地址的段值:偏移

    ; 出口参数: 无

    STRLWR PROC

    PUSH SI

    CLD

    JMP SHORT STRLWR2

    STRLWR1: SUB AL, ‘A’

    CMP AL, 'Z' – 'A'

    JA STRLWR2

    ADD AL, ‘a’

    MOV [SI+1], AL

    STRLWR2: LODSB

    AND AL, AL

    JNZ STRLWR1

    POP SI

    RET STRLWR ENDP

    2.字符串存储指令: (Save String) STOS

    STOSB    ; 存储字节

    STOSW    ; 存储字

    该指令仅是把累加器的值存到字符串,即替换字符串中的一个字符

    执行的操作:

    字节: ((DI)) <—(AL), (DI)<—(DI)+/-1

    字 :  ((DI)) <—(AX), (DI)<—(DI)+/-2

    等效于 MOV ES: [DI], AL

    INC DI 或 DEC DI

    本指令不影响标志位

    例3:

    如下程序片断把当前数据段中的偏移1000H开始的100字节的数据传送到从偏移2000H开始的单元中

    CLD

    PUSH DS

    POP ES

    MOV SI, 1000H

    MOV DI, 2000H

    MOV CX, 100D

    NEXT: LODSB

    STOSB

    LOOP NEXT

    3.字符串传送指令(Move String)MOVS

    MOVSB   ;字节传送

    MOVSW   ;字传送

    执行操作:

    字节传送: ((DI))<—((SI)),  (DI)<—(DI)+/-1, (SI)<—(SI)+/-1

    字传送:   ((DI))<—((SI)),  (DI)<—(DI)+/-2, (SI)<—(SI)+/-2

    字符串传送指令不影响标志位

    例4:

    CLD

    MOV CX, 100

    NEXT: MOVSB

    LOOPNEXT

    CLD

    MOV CX, 100

    NEXT: MOVSW

    LOOP NEXT

    例5:

    例3的题目使用传送指令

    CLD

    PUSH DS

    POP ES

    MOV SI, 1000H

    MOV DI, 2000H

    MOV CX, 100

    NEXT: MOVSB

    LOOP NEXT

    4. 字符串扫描指令(Scan String) SCAS

    SCASB    ; 字节扫描

    SCASW    ; 字扫描

    执行操作为:

    字节操作: (AL)-((DI), (DI)<—(DI)+/-1

    字操作:   (AL)-((DI)), (DI)<—(DI)+/-2

    相减的结果反映到标志位,指令不影响两个操作数

    AF, CF, OF, PF, SF, ZF

    下面例子判断AL中的字符是否为16进制数

    STRING DB '0123456789ABCDEFabcdef'

    STRINGL EQU $-STRING

    CLD

    MOV DX, SEG STRING

    MOV ES, DX

    MOV CX, STRINGL

    MOV DI, OFFSET STRING

    NEXT: SCASB

    LOOPNZ NEXT

    JNZ NOT_FOUND

    FOUND:……

    NOT_FOUND: ……

    5.字符串比较指令:(Compare String) CMPS

    CMPSB    ;字节比较指令

    CMPSW    ;字比较指令

    操作:

    字节操作: ((SI))-((DI)), (SI)<—(SI)+/-1, (DI)<—(DI)+/-1

    字操作  : ((SI))-((DI)), (SI)<—(SI)+/-2, (DI)<—(DI)+/-2

    结果反映在各标志位,指令不影响两个操作数。

  • 相关阅读:
    svn转git仓库
    linux中保存git用户名密码
    俄罗斯方块
    system.query_log常用SQL
    rpm数据库偶尔发生损坏,无法安装新rpm包
    show processlist有个连接线程一直kill不掉
    Linux系统重置root用户密码
    rpm命令
    博客园网盘分享资料
    ftp服务
  • 原文地址:https://www.cnblogs.com/hailong/p/1926745.html
Copyright © 2020-2023  润新知