彙編中的串操做指令(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

      還有一些串操做指令,之後有時間也會作些例子拿出來分享的,但願對想我也同樣的初學者會有所幫助。
相關文章
相關標籤/搜索