串處理
1. 串的概念
- 串:n個存儲單元稱爲串。根據存儲單元的內容,有不同的叫法,如字符串數組等。
- 串處理:對串的操作稱爲串處理。
2. 串處理指令
- 定義:串操作指令是指令系統中比較獨特的一類指令,採用比較特殊的數據串尋址方式,是可以直接實現存儲區之間操作的指令。
- 操作對象:內存中連續存放的數據串,即在連續的內存區域中以字爲單位的字串,或是以字節爲單位的字節串。
2.1 串傳送
- 格式:
MOVS DST,SRC
MOVSB (字節)
MOVSW (字)
- 功能:將以爲指針的源串中的一個字節(或字)存儲單元中的數據傳送至以爲指針的目的地址中去,並自動修改指針,使之指向下一個字節(或字)存儲單元。
- 執行操作:
- 。
- 當時,和自動增量;當時,和自動減量。
- 舉例:傳送個字節操作數的例子。
傳送一個字節
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 串比較
- 格式:
CMPS SRC,DST
CMPSB (字節)
CMPSW (字)
- 功能:將所指的源串中的一個字節(或字)存儲單元中的數據與所指的目的串中的一個字節(或字)存儲單元中的數據相減,並根據相減的結果設置標誌,但結果並不保存。
- 執行操作:
- 。
- 修改串指針,使之指向串中的下一個元素。
當時,()和()增量。
當時,()和()減量。
- 舉例:對和兩個字符串進行比較,若串相同,在單元中置,否則置。
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 串掃描
- 格式:
SCAS DST
SCASB (字節)
SCASW (字)
- 功能:(字節)或(字)中的內容與所指的目的串中的一個字節(或字)存儲單元中的數據相減,根據相減結果設置標誌位,結果不保存。
- 執行操作:
- 字節操作:,字操作:。
- 修改指針使之指向串中的下一個元素。
當時,()增量。
當時,()減量。
- 舉例:查找字符串
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 串獲取
格式:
LODS SRC
LODSB (字節)
LODSW (字)
- 功能:將所指的源串中的一個字節(或字)存儲單元中的數據取出來送入(或)中。
- 執行操作:
- 字節操作:,字操作:。
- 修改指針,使它指向串中的下一個元素。
當時,增量。
當時,減量。
2.5 串存入
- 格式:
STOS DST
STOSB (字節)
STOSW (字)
- 功能:將或中的數據送入所指的目的串中的字節(或字)存儲單元中。
- 操作執行:
- 字節操作:,字操作:。
- 修改指針,使之指向串中的下一個元素。
當時,增量;
當時,減量。
- 舉例:數據區初始化
mov ax,0
mov di,0
mov cx,1000h
cld ;DF=0,地址增加
again: stosw ;傳送一個字
loop again ;傳送次數cx是否爲0
3. 串與循環
- 串操作指令執行一次,僅對數據串中的一個字節或字進行操作。但是在串操作指令前,都可以加一個重複前綴,實現串操作的重複執行。
3.1 重複前綴指令
- 格式:
REP 串指令
- 功能:當時,重複執行後面的串指令。可以理解爲每執行一次後面的串指令,減,並回送,直到,重複執行結束。
- 說明: 指令一般用在、指令前。
- 舉例:重複串傳送
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 重複前綴指令
- 格式:
REPZ 串指令
- 功能:重複執行串指令的條件是: ,且字符相等。可以理解爲:每執行一次串指令,減回送,並判斷是否爲,只要或,重複執行結束。
- 說明: 後面常跟串指令,用於字符串的比較。
- 舉例:比較字符串
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 重複前綴指令
- 格式:
REPNZ 串指令
- 功能:重複執行後面串指令的條件是:並且串不相等 。可以理解爲:每執行一次後面的串指令,減,並判斷是否爲,只要或,重複執行結束。
- 說明: 後面常跟串指令,用於搜索一個字符。
- 舉例:查找字符串
mov di,offset string
mov al,20h
mov cx,count
cld
repnz scasb ;搜索
jz found ;(ZF=1),發現空格
... ;不含空格,則繼續執行
found: ...