串处理指令—串传送指令举例 例: 在数据段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