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


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


1.传传送指令MOVShtml

;功能:将字符串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

      还有一些串操做指令,之后有时间也会作些例子拿出来分享的,但愿对想我也同样的初学者会有所帮助。
相关文章
相关标签/搜索