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