汇编中的串操作指令(MOVS,CMPS,SCAS,LODS,STOS)


       学汇编的都知道,汇编中很多问题都是对字符串进行的操作,但是我们操作时总是重复相同的操作,用多个指针进行记录,不断判断只针对位置,这样确实很麻烦,于是汇编提供了一种对字符串进行操作的指令,只要我们把相关参数设置,调用这些指令,就可以对相关字符串操作,不需要时刻看相关指针是如何移动了(当然调用时是知道指针的移动方式的,只是在代码中体现不出来),这样一来大大缩短了代码,加快了运行速度。
下面是我在学习汇编时候做的一些小实验,以便对相关指令理解更加深刻


1.传传送指令MOVS

;功能:将字符串STR1中的字符串用MOVS指令转移给STR2
;时间:2012.11.18
.386
DATA  SEGMENT USE16
STR1  DB    'I LOVE YOU !'
N=$-STR1
STR2  DB    N DUP(0)
      DB    '$'
DATA  ENDS
STACK SEGMENT USE16
      DB 200 DUP(0)
STACK ENDS

CODE SEGMENT USE16
      ASSUME DS:DATA,ES:DATA,CS:CODE,SS:STACK
BEGIN:
      MOV AX,DATA
      MOV DS,AX     ; 当前数据段
      MOV ES,AX     ;  附加数据段
      LEA SI,STR1
      LEA DI,STR2
      MOV CX,N
      CLD           ; 使DF=0 ,DI,SI自增   STD时自减
      REP MOVSB
      LEA DX,STR2
      MOV AH,9
      INT 21H
      MOV AH,4CH
      INT 21H
CODE  ENDS
      END BEGIN
2.串比较指令CMPS

;功能:CMPS指令的操作,比较输入字符串与指定字符串是否相等
;时间;2012.11.18
DATA  SEGMENT USE16
STR1  DB 80
      DB  ?
      DB 80 DUP(0)
STR2  DB 'HELLO!'
COUNT=$-STR2
RES  DB  0AH,0DH,'输入的字符串与我们设定的相同',0AH,0DH,'$'
RES1  DB  0AH,0DH,'对不起您输入的不是我们设定的',0AH,0DH,'$'
MES   DB  '请输入一串字符(空格退出):',0AH,0DH,'$'
DATA  ENDS
STACK SEGMENT USE16
      DB 200 DUP(0)
STACK ENDS
CODE SEGMENT USE16
      ASSUME DS:DATA,ES:DATA,CS:CODE,SS:STACK
BEGIN:
      MOV AX,DATA
      MOV DS,AX
      MOV ES,AX
      ; 想str1中输入字符串
LOP:  ;输出提示信息
      LEA DX,MES
      MOV AH,9
      INT 21H
      ;像缓冲区输入字符串
      LEA DX,STR1
      MOV AH,10
      INT 21H
      ;与空格比较
      CMP STR1+2,20H
      JE  EXIT     ;若是空格则退出程序
      MOV AL,STR1+1
      CMP AL,COUNT
      JNE NEQU      ;判断输入的字符串与所设定的字符串长度是否相同,不同直接输出不同信息
      LEA SI,STR2
      LEA DI,STR1+2
      MOV CX,COUNT
      REPZ CMPSB     ;这是CMPS的相关参数设定
      JNE NEQU
      LEA DX,RES
      JMP OUT
NEQU:
      LEA DX,RES1
OUT:
      MOV AH,9
      INT 21H
      JMP BEGIN
EXIT: MOV AH,4CH
      INT 21H
CODE  ENDS
      END BEGIN

      还有一些串操作指令,以后有时间也会做些例子拿出来分享的,希望对想我也一样的初学者会有所帮助。


你可能感兴趣的:(汇编中的串操作指令(MOVS,CMPS,SCAS,LODS,STOS))