(3)串传送指令
串处理指令—串传送指令举例
例: 在数据段datarea中有一个字符串,其长度为17,要求把它们转送到附加段extra中的一个缓冲区。
程序如下:
;先完成数据段和附加段定义,其中源串放在数据段,目的串放在附加段。
datarea segment ;定义数据段
mess1 db ‘personal computer $’
datarea ends
extra segment ;定义附加段
mess2 db 17 dup(?)
;在存储器中分配17个字节单元的空间
extra ends
code segment
assume cs:code, ds:datarea, es:extra
?
mov ax,datarea
mov ds,ax ;数据段地址送ds
mov ax,extra
mov es,ax ;附加段地址送es
?
lea si,mess1 ;mess1首地址送si
lea di,mess2 ;mess2首地址送di
mov cx,17 ;字符串大小
cld ;地址自动增量方式
rep movsb ;重复实现串复制
?
code ends
可以把数据段和附加段重叠使用。程序可改写为:
datarea segment
mess1 db ‘personal computer $’
mess2 db 17 dup(?)
datarea ends
code segment
assume cs:code, ds:datarea, es:datarea
mov ax,datarea
mov ds,ax ;数据段地址送ds
mov es,ax ;附加段地址送es
lea si,mess1 ;mess1首地址送si
lea di,mess2 ;mess2首地址送di
mov cx,17 ;字符串大小
cld ;地址自动增量方式
rep movsb ;重复实现串复制
code ends
【例】设DS=3000H,ES=4000H,源串首址=1500H,目的串首址=2000H,比较两个都具有100个字节的字符串,找出它们第一次不相匹配的位置,找到不相等处的偏移地址仍放在SI和DI中。
【说明】:
① 在REPE CMPSB指令前面的指令序列中,必须为它设置好6个条件;
② REPE CMPSB指令执行前、后两个字符串的存储情况,如教材图5-10所示,了解它对理解程序的执行情况是大有益处的。
主要程序段如下:
MOV AX,3000H
MOV DS,AX ;条件1
MOV AX,4000H
MOV ES,AX ;条件2
MOV SI,1500H ;条件3
MOV DI,2000H ;条件4
MOV CX,100 ;条件5
CLD ;条件6
REPE CMPSB
JZ DONE ;全匹配转DONE
DEC SI ;指向不匹配单元
DEC DI
【例】 在附加段内首地址为STRING的100个字符的字符串中,寻找第一个 “&”号,找到后将其地址仍保留在DI中(偏移地址),并在屏幕上显示字符 ‘Y’;若在字符串中找不到 “&”号,则在屏幕上显示字符‘N’,设ES=4000H,根据要求编写主要程序段如下:
MOV AX,4000H
MOV ES,AX ;条件1,ES赋值,
MOV AL,‘&’ ;条件2,关键字送入AL
MOV CX,100 ;条件3,字符长度
LEA DI,STRING ;条件4,取字符串首地址
CLD ;条件5,增址方向
REPNE SCASB ;不等扫描
JZ L1 ;找到‘&’号转L1
MOV DL,‘N’ ;字符串无‘&’号,准备在屏幕上显示N
JMP DISPY ;转显示功能调用
L1: DEC DI ;保存找到‘&’号的偏移地址
MOV DL,‘Y’ ;找到‘&’号要显示Y
DISPY: MOV AH,2
INT 21H