几个串操作类指令的例子 例14-1:用REP MOVSB指令把字节串S1从一个数据段传送至辅助数据段的串S2中去。 NAME LI14-1.ASM DATA1 SEGMENT S1 DB 'ABCDEFGHIJKLMNOPQISTUVWXYZ' CPUNT EQU $-OFFSET S1 DATA1 ENDS DATA2 SEGMENT S2 DB 27 DUP (?) DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV SI,OFFSET S1 MOV DI,OFFSET S2 MOV CX,COUNT CLD REP MOVSB MOV BYTE PTR ES:[DI],'$' MOV DX,OFFSET S2 MOV AX,ES MOV DS,AX MOV AH,9H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 例14-2:利用REP MOVSW指令把字串A传送到同一数据段的串B中去。 NAME LI14-2.ASM DATA SEGMENT A DW 1,3,5,7,9,11,13,15,17,19 DW 21,23,25,27,29,31,33,35,37 DW 41,43,45,47,49 COUNT DW $-OFFSET A B DW 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,COUNT LEA SI,A LEA DI,B REP MOVSW MOV AH,4CH INT 21H CODE ENDS END START 例14-3:若在一片内存区域中有一数据块,起始地址为BLOCK。数据块中的数有正数有负数,要求把其中的正负数分开,分别放在同一段的两个缓冲区存放正数的缓冲区起始地址为PLUS_BUF,存放负数的缓冲区起始地址为MINUS_BUF。 可设置SI为源数据块指针,设DI和BX分别为放正负数的目的区指针,使用LODS指令把源数据取至AL,然后测试其符号位,若为正数,则用STOS指令送到正数的缓冲区,若为负数,交换DI和BX,然后用STOS指令送至负数的缓冲区。 NAME LI14-3.ASM DATA SEGMENT BLOCK DB 03H,46H,0F4H,0AFH,0AH,90H DB 87H,50H,99H,0FFH,40H,77H,88H,0B3H,9EH COUNT DW $-OFFSET BLOCK PLUS_BUF DB 20 DUP(?) MINUS_BUF DB 20 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS_BUF MOV BX,OFFSET MINUS_BUF MOV CX,COUNT CLD GOON: LODSB TEST AL,80H JNZ MINUS STOSB JMP AGAIN MINUS: XCHG BX,DI STOSB XCHG BX,DI AGAIN: LOOP GOON MOV AH,4CH INT 21H CODE ENDS END START
例14-4:利用REPE CMPS指令比较两个字符串是否相等。若相等,显示字符E,否则显示N。 NAME LI14-4.ASM DATA SEGMENT STRING1 DB 'THIS IS A STRING1' STRING2 DB 'THIS IS A STRING2' COUNT EQU $-OFFSET STRING2 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,STRING1 LEA DI,STRING2 MOV CX,COUNT CLD REPE CMPSB JNZ NO MOV DL,'E' MOV AH,02H INT 21H JMP PEND NO: MOV DL,'N' MOV AH,02H INT 21H PEND: MOV AH,4CH INT 21H CODE ENDS END START 例14-5:在一个字符串中搜索特定字符‘S’,如果找到,则显示出这个字符在串中的位置(距离串的起始地址的相对位移量字节数),否则显示字符N。 NAME LI14-5.ASM DATA SEGMENT STRING DB 'THIS IS A STRING' COUNT EQU $-STRING CHAR EQU 'S' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA GO: MOV AX,DATA MOV DS,AX MOV ES,AX MOV DI,OFFSET STRING MOV CX,COUNT CLD MOV AL,CHAR REPNE SCASB JZ FOUNT MOV DL,'N' MOV AH,02H JMP DISPLAY FOUND: DEC DI MOV DX,DI OR DL,30h DISPLAY: MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END GO
|