zoukankan      html  css  js  c++  java
  • 简单应用程序的设计字符串处理

    字符串是字符的一个序列,对字符串的操作包括复制检索,插入删除和替换等,为了便于对字符串进行有效的处理,8086和8088提供专门的用户处理字符串的指令,我们称之为字符串操作指令,简称串操作指令

    在字符串操作指令中,一般由变址寄存器SI指向源操作数(串),由变址寄存器DI指向目的操作数,规定源串存放在当前数据段中,目的串存放在当前附加段中,也就是说

    在涉及源操作数是,引用数据段寄存器DS,在涉及目的操作数时,引用附加段寄存器ES,换句话说,DS:SI指向源操作数,ES:DI指向目的操作数

    串操作指令执行时会自动调整作为指针使用的寄存器SI或者DI的值,比如串操作的单元是字节的时候,调整值为1,如果穿操作数的寄存器是DS的时候,则调整是2,此外,字符串操作的方向有寄存器DF控制,当方向寄存器DF = 0时,其递增方式调整SI或者DI,当方向寄存器DF = 1,按照递减的方式调整SI或者是DI

    【1】字符串装入指令:(LOAD String)

    字符串装入指令的格式如下:LODSB 装入字节

                   LODSW 装入字

    字符串装入指令只是把字符串中的一个字符转到累加器中,

    字符装入指令LODSB把寄存器SI所指向的一个字节数据转到累加器AL中,然后根据方向寄存器DF复位或者置位,使SI的值增加1或者减少1,

    他的指令类似于 MOV AL,[SI]

            INC SI或者DEC SI

    字符装入指令LODSW把寄存器SI所指向的一个字数据转入到累加器AX中,然后根据方向寄存器DF复位或置位或使得SI的值增加2或者减少2

    MOV AX,[SI]

    ADD SI,2或SUB SI ,2

    以后LODS 等价于LODSB和LODSW

    【2】字符串存储指令(STOre String)

    存储字节 STOSB

    存储字 STOSW

    字符串存储指令STOSB把累加器AL的内容送到寄存器DI所指向的存储单元中,然后根据方向标志寄存器判断方向

    它类似于     MOV ES:[DI],AL

            INC DI,或者是ADD DI

    同理,字符串存储指令STOSW把累加器AX的内容送到DI所指向的存储单元中然后根据方向标志寄存器判断方向

    它类似于:    MOV ES:[DI],AX

            ADD DI,2  或者SUB DI,2

    以后不加以区分,统一格式为STOS

    例如程序片段:把当前数据段中便宜为1000H开始的100个字节的数据传送到便宜为2000H开始的单元中

    CLD;清除方向标志(以便按照增值方式调整指针)
    PUSH DS;保存当前数据段
    PUSH ES;保存当前附加段
    MOV SI,1000H;设置源操作数
    MOV DI,2000H;设置目的操作数
    MOV CX,100;统计循环次数
    NEXT : LODSB;取出一个字节
           STOSB;存取一个字节
    LOOP NEXT;循环CX
    POP ES;
    POP DS;

    字符串传送指令

    MOVSB ;字节传送

    MOVSW 字传送

    直接传送指令MOVSB把寄存器SI所指向的一个字节的数据传送到由DI所指向的存储单元中,然后根据方向标志DF复位或者是置位,使得SI和DI分别增加1或者减少1

    字传送字节MOVSW吧寄存器SI所指向的一个字的数据传送到DI所指向的一个字的存储单元中,然后根据方向标志DF复位或者置位,使得SI和DI分别增加2或者减少2

    在汇编语言中MOVS OPRD1,OPRD2

    两个稍作书的类型应该一致,汇编程序根据操作数的类型决定是字节传送还是字传送

    上面程序片段完全可以用下列代替

    CLD
    PUSH DS
    PUSH ES
    MOV SI,1000H
    MOV DI,2000H MOV CX,
    100 NEXT:MOVSB LOOP NEXT

    现在循环体中只有哦一条传送指令,执行速度明显提高,在这个程序片段中,把100个字节的数据当作以字节为单元的字符串,所以利用了字节传送指令,如果把这100个字节的数据当作以字为单元的字符串,那么这个字符串也就只有50个单元了,于是循环次数还可以减少一半,执行速度还会提高

    【5】字符串扫描指令(SCAn String)

    字符串扫描指令的格式如下:SCANB;串字节扫描指令

                 SCANW;串字扫描指令

    串字节扫描指令SCANSB把累加器AL的内容与寄存器DI所指向的一个字节的内容相减进行比较,相减结果反映到有关标志寄存器(AF,CF,OF,PF,SF,ZF)

    但不影响两个操作数,然后根据方向寄存器DF复位或者置位使得DI的值增加1或者减少1,

    串字节扫描指令SCANSW把累加器AX的内容与由寄存器DI所指向的一个字节的内容相减 相减结果反映到有关标志寄存器(AF,CF,OF,PF,SF,ZF)

    但不影响两个操作数,然后根据方向寄存器DF复位或者置位使得DI的值增加2或者减少2,

    判断程序AL中的字节是否是十六进制

    ……………………
    STRING DB '0123154657896356FSDAG'
    STRINGL EQU $ -STRING
    ……………………
    CLD
    MOV DX,SEG STRING 
    MOV ES,DX
    MOV CX STRINGL
    NEXT: SCANB
    LOOPNZ NEXT
    JNZ NOT_FOUND
    
    FOUND:………………
    NOT_FOUND:……………………

    【6】字符串比较指令格式如下

    CMPSB 串字节比较指令

    CMPSW 串字比较指令

    串字节比较指令CMPS把寄存器SI所指向的一个直接数据与有寄存器DI所指向的一个数据采用相互减的方式比较,比较的结果反映到有关标志位中,但不影响两个操作数

    然后根据DF复位或者置位使SI和DI分别增加1或者减少1

    在汇编语言中的统一格式为CMPS OPRD1,OPRD2

  • 相关阅读:
    tensorboard的log查看方法
    liunx系统中安装lua以及torch
    maven安装问题解决
    使用git将代码上传到GitHub
    解决引入keras后出现的Using TensorFlow backend的错误
    ubuntu下 pycharm使用andcoda下的tensorflow
    HTTP概览
    c++容器
    C++注意
    Strint类成员
  • 原文地址:https://www.cnblogs.com/fengdashen/p/3721459.html
Copyright © 2011-2022 走看看