汇编(十四)——串操作类指令练习

来源:互联网 发布:鲜芋仙什么最好吃知乎 编辑:程序博客网 时间:2024/05/16 00:42
个串操作类指令的例子

 

例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

 
原创粉丝点击