在計 算機中,大部分數據存放在主存 中,8086CPU提供了一組處理主存中連續存放的數據串的指令——串操作指令。串操作指令中,源操作數用寄存器SI尋址,默認在數據段DS中,但允許段 超越;目的操作數用寄存器DI尋址,默認在附加段ES中,不允許段超越。每執行一次串操作指令,作為源地址指針的SI和作為目的地址指針的DI將自動修 改:+/-1(對於字節串)或+/-2(對於字串)。地址指針時增加還是減少取決於方向標志DF。在系統初始化后或者執行指令CLD指令后,DF=0,此 時地址指針增1或2;在執行指令STD后,DF=1,此時地址指針減1或2。
1、串傳送指令MOVS
MOVSB ;字節串傳送:ES:[DI]←DS:[SI],SI←SI+/-1,DI←DI+/-1
MOVSW ;字串傳送:ES:[DI]←DS:[SI],SI←SI+/-2,DI←DI+/-2
MOVS 目的串名,源串名 ;這種格式需要使用前綴WORD PTR或BYTE PTR指明
例:將數據段SOURCE指示的100個字節數據傳送到附加段DESTINATION指示的主存區
MOV SI,OFFSET SOURCE
MOV DI,OFFSET DESTINATION
MOV CX,100
CLD
AGAIN: MOVSB
DEC CX
JNZ AGAIN
2、串存儲指令STOS
STOSB ;字節串存儲:ES:[DI]←AL,DI←DI+/-1
STOSW ;字串存儲:ES:[DI]←AX,DI←DI+/-2
船存儲指令將AL或AX寄存器的內容存入由DI指定的附加段主存單元中,並根據DF和傳送單位修改DI寄存器。STOS不影響標志。
3、串讀取指令LODS
LODSB ;字節串讀取:AL←DS:[SI],SI←SI+/-1
LODSW ;字串讀取:AX←DS:[SI],SI←SI+/=2
LODS指令和STOS指令功能互逆,它將SI寄存器指向的主存單元的內容送至AL或AX寄存器,並相應修改SI使其指向下一個元素。不影響標志。
4、串比較指令CMPS
CMPSB ;字節串比較:DS:[SI]-ES:[DI],SI←SI+/-1,DI←DI+/-1
CMPSW ;字串比較:DS:[SI]-ES:[DI],SI←SI+/-2,DI←DI+/-2
船比較指令的功能是比較源串與目的串是否相同,並根據其減法結果設置標志位;指令在每次比較后修改SI和DI寄存器的值,使之指向下一個元素。
5、串掃描指令SCAS
SCASB ;字節串掃描:AL-ES:[DI],DI←DI+/-1
SCASW ;字串掃描:AX-ES:[DI],DI←DI+/-2
串掃描指令SCAS將附加段中的字節或字內容與AL/AX寄存器內容進行比較,根據比較的結果設置標志,每次比較后修改DI寄存器的值,使之指向下一個元素。
6、重復前綴指令
任何一個串操作指令,都可以在前面加一個重復前綴,以實現串操作的重復執行,重復次數隱含在CX寄存器中
REP ;REP前綴用在MOVS、STOS、LODS指令前,每次執行一次指令,CX減1;直到CX=0,重復執行結束
REPZ ;也可以表把為REPE,用在CMPS、SCAS指令前,每執行一次串指令CX減1,並判斷ZF標志是否為0
;只要CX=0或ZF=0,則重復執行結束
REPNZ ;也可以表達為REPNE,用在CMPS、SCAS指令前,每執行一次串操作指令CX減1,並判斷ZF標志是否為1,只要CX=0或ZF=1,則重復執行結束。
●REP前綴可以理解為“當數據串沒有結束(CX≠0),則繼續傳送”
●REPZ/REPE前綴可以理解為“當數據串沒有結束(CX≠0),並且串相等(ZF=1)則繼續比較”
●REPNZ/REPNE前綴可以理解為“當數據串沒有結束(CX≠0),並且串不相等(ZF=0)則繼續比較”
重復操作是否完成的檢測是在執行串指令之前,所以,如果初始化CX為0,將不會重復操作。判斷標志ZF,則是在執行串指令之后。
在 執行一條重復的基本串操作期間,操作數指示寄存器(變址寄存器SI,DI)和操作計數器CX在每次重復后都要自動進行修改,而指令指示器(IP)將保持重 復前綴字節的偏移地址(假定重復前綴是緊放在字符串操作指令之前)。於是,當控制由中斷數據服務返回時,一個被中斷了的重復串操作能夠得到正確的恢復。除 了重復前綴以外,IBM-PC還提供了兩個前綴:一個是缺省段寄存器的取代前綴(加段寄存器前綴),另一個是封鎖總線前綴LOCK以禁止其他的總線訪問。 不要把這兩個前綴用在具有重復前綴的串操作指令前面。如果在基本串操作指令之前出現一個以上的前綴,那么中斷恢復時只能恢復一個字節(緊放在串操作指令之 前的一個)前綴,多於一個字節的前綴就丟掉了(一個前綴占一個字節)。所以在串操作指令前用了重復前綴后就不能用其他兩個前綴了。
另外,在字符串操作指令中不能使用帶有[BX]或[BP]的尋址方式。
2.CLD(匯編語言指令)
CLD與STD是用來操作方向標志位DF(Direction Flag)。CLD使DF復位,即DF=0,STD使DF置位,即DF=1.用於串操作指令中。
例如:
MOVS ( MOVe String) 串傳送指令
MOVSB //字節串傳送 DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1
MOVSW //字串傳送 DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2
執行操作:[DI] = [SI] ,將位於DS段的由SI所指出的存儲單元的字節或字傳送到位於ES段的由DI 所指出的存儲單元,再修改SI和DI, 從而指向下一個元素.
在執行該指令之前,必須預置SI和DI的初值,用STD或CLD設置DF值.
MOVS DST , SRC //同上,不常用,DST和SRC只是用來用類型檢查,並不允許使用其它尋址方式來確定操作數.
1.目的串必須在附加段中,即必須是ES:[DI]
2.源串允許使用段跨越前綴來修飾,但偏移地址必須是[SI].