几个串操作类指令的例子

几个串操作类指令的例子

例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

例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

例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

例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

例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
START: 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 START

相关文档
最新文档