彙編之串處理

串處理

1. 串的概念

  • 串:n個存儲單元稱爲串。根據存儲單元的內容,有不同的叫法,如字符串數組等。
  • 串處理:對串的操作稱爲串處理。

2. 串處理指令

  • 定義:串操作指令是80868086指令系統中比較獨特的一類指令,採用比較特殊的數據串尋址方式,是可以直接實現存儲區之間操作的指令。
  • 操作對象:內存中連續存放的數據串,即在連續的內存區域中以字爲單位的字串,或是以字節爲單位的字節串。

2.1 串傳送MOVSMOVS

  • 格式:
   MOVS  DST,SRC
   MOVSB  (字節)
   MOVSW   (字)
  • 功能:將以SISI爲指針的源串中的一個字節(或字)存儲單元中的數據傳送至以DIDI爲指針的目的地址中去,並自動修改指針,使之指向下一個字節(或字)存儲單元。
  • 執行操作:
    1. DS[SI]ES[DI]DS:[SI]→ES:[DI]
    2. DF=0DF=0時,SISIDIDI自動增量;當DF=1DF=1時,SISIDIDI自動減量。
  • 舉例:傳送100100個字節操作數的例子。
    傳送一個字節
	mov si,offset source
	mov di,offset destination
	mov cx,100	;cx←傳送次數
	cld	;置DF=0,地址增加
again:	movsb	;傳送一個字節
	dec cx	;傳送次數減1
	jnz again
	;判斷傳送次數cx是否爲0
	;不爲0,則到again位置執行指令
	;否則,結束

傳送一個字

	mov si,offset source
	mov di,offset destination
	mov cx,50	;cx←傳送次數
	cld	;置DF=0,地址增加
again:	movsw	;傳送一個字
	dec cx	;傳送次數減1
	jnz again
	;判斷傳送次數cx是否爲0
	;不爲0,則到again位置執行指令
	;否則,結束

2.2 串比較CMPSCMPS

  • 格式:
   CMPS  SRC,DST
   CMPSB  (字節)
   CMPSW   (字)
  • 功能:將SISI所指的源串中的一個字節(或字)存儲單元中的數據與DIDI所指的目的串中的一個字節(或字)存儲單元中的數據相減,並根據相減的結果設置標誌,但結果並不保存。
  • 執行操作:
    1. [SI][DI]([SI])-([DI])
    2. 修改串指針,使之指向串中的下一個元素。
      DF=0DF=0時,(SISI)和(DIDI)增量。
      DF=1DF=1時,(SISI)和(DIDI)減量。
  • 舉例:對string1string1string2string2兩個字符串進行比較,若串相同,在resultresult單元中置00,否則置1-1
	mov si,offset string1
	mov di,offset string2
	mov cx,count
	cld
again:	cmpsb	;比較兩個字符
	jnz unmat	;有不同字符,轉移
	dec cx
	jnz again	;進行下一個字符比較
	mov al,0	;字符串相等,設置00h
	jmp output	;轉向output
unmat:	mov al,0ffh	;設置ffh
output:	mov result,al	;輸出結果標記

2.3 串掃描SCASSCAS

  • 格式:
   SCAS     DST
   SCASB  (字節)
   SCASW   (字)
  • 功能:ALAL(字節)或AXAX(字)中的內容與DIDI所指的目的串中的一個字節(或字)存儲單元中的數據相減,根據相減結果設置標誌位,結果不保存。
  • 執行操作:
    1. 字節操作:AL[DI]AL-[DI],字操作:AX[DI]AX-[DI]
    2. 修改指針使之指向串中的下一個元素。
       當DF=0DF=0時,(DIDI)增量。
       當DF=1DF=1時,(DIDI)減量。
  • 舉例:查找字符串
	mov di,offset string
	mov al,20h ;空格的ASCII碼值
	mov cx,count
	cld
again:	scasb	;搜索
	jz found	;爲0(ZF=1),發現空格
	dec cx	;不是空格
	jnz again	;搜索下一個字符
	...	;不含空格,則繼續執行
found:	...

2.4 串獲取LODSLODS

格式:

   LODS     SRC
   LODSB  (字節)
   LODSW   (字)
  • 功能:將SISI所指的源串中的一個字節(或字)存儲單元中的數據取出來送入ALAL(或AXAX)中。
  • 執行操作:
    1. 字節操作:[SI]AL[SI]→AL,字操作:[SI]AX[SI]→AX
    2. 修改指針SISI,使它指向串中的下一個元素。
      DF=0DF=0時,SISI增量。
      DF=1DF=1時,SISI減量。

2.5 串存入STOSSTOS

  • 格式:
   STOS     DST
   STOSB  (字節)
   STOSW   (字)
  • 功能:將ALALAXAX中的數據送入DIDI所指的目的串中的字節(或字)存儲單元中。
  • 操作執行:
    1. 字節操作:AL[DI]AL→[DI],字操作:AX[DI]AX→[DI]
    2. 修改指針DIDI,使之指向串中的下一個元素。
      DF=0DF=0時,DIDI增量;
      DF=1DF=1時,DIDI減量。
  • 舉例:數據區初始化
	mov ax,0
	mov di,0
	mov cx,1000h
	cld	;DF=0,地址增加
again:	stosw	;傳送一個字
	loop again	;傳送次數cx是否爲0

3. 串與循環

  • 串操作指令執行一次,僅對數據串中的一個字節或字進行操作。但是在串操作指令前,都可以加一個重複前綴,實現串操作的重複執行。

3.1 REPREP重複前綴指令

  • 格式:
 REP 串指令
  • 功能:當CX0CX≠0時,重複執行後面的串指令。可以理解爲每執行一次後面的串指令,CXCX11,並回送CXCX,直到CX0CX=0,重複執行結束。
  • 說明: REPREP指令一般用在MOVSMOVSSTOSSTOS指令前。
  • 舉例:重複串傳送
	mov si,offset source
	mov di,offset destination
	mov cx,100	;cx←傳送次數
	cld
	rep movsb

rep movsb 等於一下程序。

again:	movsb	;傳送一個字節
	dec cx	;傳送次數減1
	jnz again	;判斷傳送次數cx是否爲0
	;不爲0(ZF=0),則轉移again位置執行
	;否則,結束

3.2 REPZREPZ重複前綴指令

  • 格式:
 REPZ 串指令
  • 功能:重複執行串指令的條件是: CX0CX≠0,且字符相等ZF1ZF=1。可以理解爲:每執行一次串指令,CXCX11回送CXCX,並判斷ZFZF是否爲00,只要CX0CX=0ZF0ZF=0,重複執行結束。
  • 說明: REPZREPZ後面常跟CMPSCMPS串指令,用於字符串的比較。
  • 舉例:比較字符串
	mov si,offset string1
	mov di,offset string2
	mov cx,count
	cld
	repz cmpsb	;重複比較兩個字符
	jnz unmat	;字符串不等,轉移
	mov al,0	;字符串相等,設置00h
	jmp output	;轉向output
unmat:	mov al,0ffh	;設置ffh
output:	mov result,al	;輸出結果標記

3.3 REPNZREPNZ重複前綴指令

  • 格式:
REPNZ 串指令
  • 功能:重複執行後面串指令的條件是:CX0CX≠0並且串不相等 ZF0ZF=0。可以理解爲:每執行一次後面的串指令,CXCX11,並判斷ZFZF是否爲11,只要CX0CX=0ZF1ZF=1,重複執行結束。
  • 說明: REPNZREPNZ後面常跟SCASSCAS串指令,用於搜索一個字符。
  • 舉例:查找字符串
	mov di,offset string
	mov al,20h
	mov cx,count
	cld
	repnz scasb	;搜索
	jz found	;(ZF=1),發現空格
	...	;不含空格,則繼續執行
found:	...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章