串操作指令 : 在 計(jì)算機(jī)中,大部分?jǐn)?shù)據(jù)存放在主存中, 8086cpu 提供了一組處理主存中連續(xù)存放的數(shù)據(jù)串的指令 —— 串操作指令。串操作指令中,源操作數(shù)用寄存器 si 尋址,默認(rèn)在數(shù)據(jù)段 ds 中,但允許段超越;目的操作數(shù)用寄存器 di 尋址,默認(rèn)在附加段 es 中,不允許段超越。每執(zhí)行一次串操作指令,作為源地址指針的 si 和作為目的地址指針的 di 將自動修改: +/-1 (對于字節(jié)串)或 +/-2 (對于字串)。地址指針時(shí)增加還是減少取決于方向標(biāo)志 df 。在系統(tǒng)初始化后或者執(zhí)行指令 cld 指令后, df=0, 此時(shí)地址指針增 1 或 2 ;在執(zhí)行指令 std 后, df=1 ,此時(shí)地址指針減 1 或 2 。
數(shù)據(jù)傳送類指令每次只能傳送一個(gè)數(shù)據(jù),若要傳送大批數(shù)據(jù)就需要重復(fù)編程,這樣就浪費(fèi)了大量的時(shí)間和空間。為此 8086 提供了一組處理主存中連續(xù)存放數(shù)據(jù)串的指令,這就是串操作指令。
movs 串傳送
cmps 串比較
scas 串掃描
lods 從串取
stos 存入串
ins 串輸入
outs 串輸出
與上述基本指令配使用的前綴有:
rep 重復(fù)
repe/repz 相等 / 為零則重復(fù)
repne/repnz 不相等 / 不為零則重復(fù)
1 .重復(fù)前綴指令 rep 、 repz 、 repnz
(1) rep :rep 前綴用在 movs 、 stos 、 lods 、 ins 和 outs 指令前。
格式: rep string primitive
其中 string primitive 可為 movs , lods 等指令。
功能:
(1) 如果 (cx)=0 ,則退出 rep ,否則往下執(zhí)行。
(2)(cx)=(cx) - 1
(3) 執(zhí)行其后的串指令
(4) 重復(fù) (1)-(3)
(2) repz/repe: 該指令一般用在 cmps 、 scas 指令前。
格式: repe( 或 repz) string primitive
其中 string primitive 可為 cmps 或 scas 指令。
功能:
(1) 如果 (cx)=0 或 zf=0 時(shí)退出,否則往下執(zhí)行。
(2)(cx)=(cx) - 1
(3) 執(zhí)行其后的串指令
(4) 重復(fù) (1)-(3)
與 rep 相比,除滿足 (cx)=0 的條件可結(jié)束操作外,還增加了 zf=0 的條件,也就是說,如果兩數(shù)相等就可繼續(xù)比較,如果遇到了兩數(shù)不相等可提前結(jié)束操作。
(3) repnz/repne : 該指令一般用在 cmps 、 scas 指令前。
格式: repe( 或 repz) string primitive
其中 string primitive 可為 cmps 或 scas 指令。
功能:
(1) 如果 (cx)=0 或 zf=1 時(shí)退出,否則往下執(zhí)行。
(2)(cx)=(cx) - 1
(3) 執(zhí)行其后的串指令
(4) 重復(fù) (1)-(3)
與 rep 相比,除滿足 (cx)=0 的條件可結(jié)束操作外,還增加了 zf=1 的條件,也就是說,如果兩數(shù)不相等就可繼續(xù)比較,如果遇到了兩數(shù)相等可提前結(jié)束操作。
2傳送指令 movs
語句格式:① movs dst , src
② movsb ——字節(jié)串傳送
③ movsw ——字串傳送
其中后兩種明確注明是傳送字節(jié)還是字 , 第一種格式則應(yīng)在操作數(shù)中表明是字節(jié)還是字的操作 . 例如 :
movs es:byte ptr[di],ds:[si]
功能:將以 si 為指針的源串中的一個(gè)字節(jié)(或字)存儲單元中的數(shù)據(jù)傳送至以 di 為指針的目的地址中去,并自動修改指針,使之指向下一個(gè)字節(jié)(或字)存儲單元。
即:①( ds : [si] )→ es : [di] 。
② 當(dāng) df=0 時(shí),( si )和( di )增量。
當(dāng) df=1 時(shí),( si )和( di )減量。
③當(dāng)操作為字節(jié)操作時(shí), (si) 、 (di) 增減量為 1 ,當(dāng)操作為字操作時(shí), (si) 、 (di) 增減量為 2 。
④當(dāng)該指令與前綴 rep 聯(lián)用時(shí),則可將數(shù)據(jù)段中的整串?dāng)?shù)據(jù)傳送到附加段中去,這里源串必須在數(shù)據(jù)段中,目的串必須在附加段中,但源串允許使用段跨越前綴來修改。在與 rep 聯(lián)用時(shí),還必須先把數(shù)據(jù)串的長度值送到計(jì)數(shù)寄存器中,以便控制指令結(jié)束。因此在執(zhí)行該指令前,必做如下準(zhǔn)備工作:
i. 把存放在數(shù)據(jù)段中的源串首地址 ( 如反向傳送則應(yīng)是末地址 ) 放入源變址寄存器中 ;
ii. 把將要存放數(shù)據(jù)串的附加段中的目的串首址 ( 反向傳送時(shí)為末地址 ) 放入目的變址寄存器 ;
ⅲ . 把數(shù)據(jù)串長度放入計(jì)數(shù)寄存器 ;
ⅳ . 建立方向標(biāo)志。
例:在數(shù)據(jù)段中有一個(gè)字符串,其長度為 17 ,要求把它們轉(zhuǎn)送到附加段中的一個(gè)緩沖區(qū)中。
data segment
mess1 db ‘personal computer$'
data ends
extra segment
mess2 db 17 dup(?)
extra ends
code segment
assume cs:code,ds:data,es:extra
…
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
…
lea si,mess1
lea di,mess2
mov cx,17
cld
rep movsb
…
code ends
3 .串比較指令 cmps
語句格式:① cmps src , dst ——需指定操作類型字
② cmpsb ——字節(jié)串比較
③ cmpsw ——字串比較
功能:將 si 所指的源串中的一個(gè)字節(jié)(或字)存儲單元中的數(shù)據(jù)與 di 所指的目的串中的一個(gè)字節(jié)(或字)存儲單元中的數(shù)據(jù)相減,并根據(jù)相減的結(jié)果設(shè)置標(biāo)志,但結(jié)果并不保存。
即:①( [si] )-( [di] )。
② 修改串指針,使之指向串中的下一個(gè)元素。當(dāng) df=0 時(shí),( si )和( di )增量。當(dāng) df=1 時(shí),( si )和( di )減量。
③當(dāng)操作為字節(jié)操作時(shí), (si) 、 (di) 增減量為 1 ,當(dāng)操作為字操作時(shí), (si) 、 (di) 增減量為 2 。
4 .串搜索指令 scas
語句格式:① scas dst
② scasb ——字節(jié)串搜索
③ scasw ——字串搜索
功能: al (字節(jié))或 ax (字)中的內(nèi)容與 di 所指的目的串中的一個(gè)字節(jié)(
字)存儲單元中的數(shù)據(jù)相減,根據(jù)相減結(jié)果設(shè)置標(biāo)志位,結(jié)果不保存,
即:① 字節(jié)操作:( al )-( [di] ),字操作:( ax )-( [di] )。
② 修改指針使之指向串中的下一個(gè)元素。當(dāng) df=0 時(shí),( di )增量。當(dāng) df=1 時(shí),( di )減量。
③當(dāng)操作為字節(jié)操作時(shí), (si) 、 (di) 增減量為 1 ,當(dāng)操作為字操作時(shí), (si) 、 (di) 增減量為 2 。
以上 3 , 4 兩條串處理指令和 repe 或 repne 相結(jié)合,可以用來比較兩個(gè)數(shù)據(jù)串,或從一個(gè)字符串中查找一個(gè)指定的字符。
當(dāng)要求從一個(gè)字符串中查找一個(gè)指定的字符,可用指令 repnz scasb 。
當(dāng)要求比較兩個(gè)字符串,找出它們不相區(qū)配的位置,則可以使用指令 repe cmpsb 。
5 .從源串中取數(shù)指令 lods
語句格式:① lods src
② lodsb ——從字節(jié)串中取數(shù)
③ lodsw ——從字串中取數(shù)
功能:將 si 所指的源串中的一個(gè)字節(jié)(或字)存儲單元中的數(shù)據(jù)取出來送入 al (或 ax )中。
即:
① 字節(jié)操作:( [si] )→ al ,字操作:( [si] )→ ax 。
② 修改指針 si ,使它指向串中的下一個(gè)元素。當(dāng) df=0 時(shí),( si )增量。當(dāng) df=1 時(shí),( si )減量。
③當(dāng)操作為字節(jié)操作時(shí), (si) 、 (di) 增減量為 1 ,當(dāng)操作為字操作時(shí), (si) 、 (di) 增減量為 2 。
6 .往目的串中存數(shù)指令 stos
語句格式:① stos dst
② stosb ——往字節(jié)串中存數(shù)
③ stosw ——往字串中存數(shù)
功能:將 al 或 ax 中的數(shù)據(jù)送入 di 所指的目的串中的字節(jié)(或字)存儲單元中。
即:
① 字節(jié)操作:( al )→ [di] ,字操作:( ax )→ [di] 。
② 修改指針 di ,使之指向串中的下一個(gè)元素。當(dāng) df=0 時(shí),( di )增量)。當(dāng) df=1 時(shí),( di )減量。
③當(dāng)操作為字節(jié)操作時(shí), (si) 、 (di) 增減量為 1 ,當(dāng)操作為字操作時(shí), (si) 、 (di) 增減量為 2 。
對串處理指令,需注意:
(1) 串處理指令在不同的段之間傳送或比較數(shù)據(jù),如果需要在同一段內(nèi)處理數(shù)據(jù),可以在 ds 和 es 中設(shè)置同樣的地址,或者在源操作數(shù)字段使用段跨越前綴來實(shí)現(xiàn)。例如:
movs [di] , es : [si]
(2) 當(dāng)使用重復(fù)前綴時(shí), (cx) 是每次減 1 的,因此對于字指令來說,預(yù)置時(shí)設(shè)置的值應(yīng)該是字的個(gè)數(shù)而不是字節(jié)數(shù)。