简单应用程序的设计字符串处理

字符串是字符的一个序列,对字符串的操作包括复制检索,插入删除和替换等,为了便于对字符串进行有效的处理,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

原文地址:https://www.cnblogs.com/fengdashen/p/3721459.html