汇编语言--微机CPU的指令系统(五)(字符串操作指令)
(11)字符串操作指令
字符串操作指令的實質是對一片連續存儲單元進行處理,這片存儲單元是由隱含指針DS:SI或ES:DI來指定的。字符串操作指令可對內存單元按字節、字或雙字進行處理,并能根據操作對象的字節數使變址寄存器SI(和DI)增減1、2或4。具體規定如下:
(1)、當DF=0時,變址寄存器SI(和DI)增加1、2或4;
(2)、當DF=1時,變址寄存器SI(和DI)減少1、2或4。
在后面各指令中,有關變址寄存器都按上述規定進行增減,不再一一說明。
1、取字符串數據指令(Load String Instruction)
從由指針DS:SI所指向的內存單元開始,取一個字節、字或雙字進入AL、AX或EAX中,并根據標志位DF對寄存器SI作相應增減。該指令的執行不影響任何標志位。
指令的格式:LODS 地址表達式
LODSB/LODSW
LODSD ;80386+
在指令LODS中,它會根據其地址表達式的屬性來決定讀取一個字節、字或雙字。即:當該地址表達式的屬性為字節、字或雙字時,將從指針DS:SI處讀一個字節到AL中,或讀一個字到AX,或讀一個雙字到EAX中,與此同時,SI還將分別增減1,2或4。
其它字符串指令中的“地址表達式”作用與此類似,將不再說明。
2、置字符串數據指令(Store String Instruction)
該指令是把寄存器AL、AX或EAX中的值存于以指針ES:DI所指向內存單元為起始的一片存儲單元里,并根據標志位DF對寄存器DI作相應增減。該指令不影響任何標志位。
指令的格式:STOS 地址表達式
STOSB/STOSW
STOSD ;80386+
3、字符串傳送指令(Move String Instruction)
該指令是把指針DS:SI所指向的字節、字或雙字傳送給指針ES:DI所指向內存單元,并根據標志位DF對寄存器DI和SI作相應增減。該指令的執行不影響任何標志位。
指令的格式:MOVS 地址表達式1, 地址表達式2
MOVSB/MOVSW
MOVSD ;80386+
4、輸入字符串指令(Input String Instruction)
該指令是從某一指定的端口接受一個字符串,并存入一片存儲單元之中。輸入端口由DX指定,存儲單元的首地址和讀入數據的個數分別由ES:DI和CX來確定。在指令的執行過程中,還根據標志位DF對寄存器DI作相應增減。該指令不影響任何標志位。
與指令有關的操作數ES、DI、DX和CX等都是隱含操作數。
指令的格式:INS 地址表達式
INSB/INSW
INSD ;80286+
5、輸出字符串指令(Output String Instruction)
該指令是把一個字符串輸入到指定的輸出端口中。輸出端口由DX指定,其輸出數據的首地址和個數分別由DS:SI和CX來確定。在指令的執行過程中,還根據標志位DF對寄存器SI作相應增減。該指令的執行不影響任何標志位。
與指令有關的操作數DS、SI、DX和CX等都是隱含操作數。
指令的格式:OUTS 地址表達式
OUTSB/OUTSW
OUTSD ;80286+
6、字符串比較指令(Compare String Instruction)
該指令是把指針DS:SI和ES:DI所指向字節、字或雙字的值相減,并用所得到的差來設置有關的標志位。與此同時,變址寄存器SI和DI也將根據標志位DF的值作相應增減。
指令的格式:CMPS 地址表達式1, 地址表達式2
CMPSB/CMPSW
CMPSD ;80386+
受影響的標志位:AF、CF、OF、PF、SF和ZF
7、字符串掃描指令(Scan String Instruction)
該指令是用指針ES:DI所指向字節、字或雙字的值與相應的AL、AX或EAX的值相減,用所得到的差來設置有關標志位。與此同時,變址寄存器DI還將根據標志位DF的值進行增減。
指令的格式:SCAS 地址表達式1
SCASB/SCASW
SCASD ;80386+
受影響的標志位:AF、CF、OF、PF、SF和ZF
8、重復字符串操作指令(Repeat String Instruction)
前面介紹了七種不同的字符串操作指令:取字符串數據、置字符串數據、字符串傳送、輸入字符串、輸出字符串、字符串比較和字符串掃描等指令,所敘述是這些指令執行一次所具有的功能。但我們知道:每個字符串通常會有多個字符的,所以,就需要重復執行這些字符串操作指令。為了滿足這種需求,指令系統提供了一組重復前綴指令。
雖然在這些字符串指令的前面都可以添加一個重復前綴指令,但由于指令執行結果的差異,對某個具體的字符串指令又不用重復前綴指令而改用其它循環來實現重復的需要。
重復字符串操作指令對標志位的影響是由被重復的字符串操作指令來決定。
(a) 重復前綴指令REP(Repeat String Instruction)
重復前綴指令是重復其后的字符串操作指令,重復的次數由CX來決定。其一般格式為:
REP LODS/LODSB/LODSW/LODSD
REP STOS/STOSB/STOSW/STOSD
REP MOVS/MOVSB/MOVSW/MOVSD
REP INS/ INSB/INSW/INSD
REP OUTS/OUTSB/OUTSW/OUTSD
重復前綴指令的執行步驟如下:
(1)、判斷:CX=0;
(2)、如果CX=0,則結束重復操作,執行程序中的下一條指令;
(3)、否則,CX=CX-1(不影響有關標志位),并執行其后的字符串操作指令,在該指令執行完后,再轉到步驟(1)。
從上面的重復前綴指令格式來看,雖然我們可以使用重復取字符串數據指令(第一組指令),但可能會因為指令的執行結果而在程序中幾乎不被使用。
例5.20 編寫一段程序,計算字符串“12345abcdefgh”中字符的ASCII之和。
解:
…
MESS DB '12345abcdefgh' ;在數據段中進行變量說明
…
MOV AX, SEG MESS
MOV DS, AX
LEA SI, MESS ;用DS:SI來指向字符串的首地址
MOV CX, 13D ;重復次數
XOR BX, BX ;置求和的初值為0
REP LODSB
…
雖然指令“REP LODSB”能從字符串中取出每個字符,但它是在一條指令中完成的,程序的其它指令根本無法處理每次取出的數據,指令的執行結果是:AL只保存最后一次所取出的字符'h'的ASCII碼。
所以,為了實現本例的要求,不能使用重復前綴指令,而要把指令“REP LODSB”改寫成如下四條指令:
XOR AH, AH ;為后面的累加作準備
again: LODSB
ADD BX, AX ;AL是被取出的字符,AH已被清0
LOOP again
(b) 條件重復前綴指令REPE(Repeat String Conditionally)
條件重復前綴指令與前面的重復前綴指令功能相類似,所不同的是:其重復次數不僅由CX來決定,而且還會由標志位ZF來決定。根據ZF所起的作用又分為二種:相等重復前綴指令REPE/REPZ和不等重復前綴指令REPNE/REPNZ。
A、相等重復前綴指令的一般格式為:
REPE/REPZ SCAS/SCASB/SCASW/SCASD
REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD
該重復前綴指令的執行步驟如下:
(1)、判斷條件:CX≠0 且 ZF=1;
(2)、如果條件不成立,則結束重復操作,執行程序中的下一條指令;
(3)、否則,CX=CX-1(不影響有關標志位),并執行其后的字符串操作指令,在該指令執行完后,再轉到步驟(1)。
B、不等重復前綴指令的一般格式為:
REPNE/REPNZ SCAS/SCASB/SCASW/SCASD
REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD
該重復前綴指令的執行步驟如下:
(1)、判斷條件:CX≠0 且 ZF=0;
(2)、如果條件不成立,則結束重復操作,執行程序中的下一條指令;
(3)、否則,CX=CX-1(不影響有關標志位),并執行其后的字符串操作指令,在該指令執行完后,再轉到步驟(1)。
轉載于:https://www.cnblogs.com/CIreland/p/9987005.html
總結
以上是生活随笔為你收集整理的汇编语言--微机CPU的指令系统(五)(字符串操作指令)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开机自动启动bios怎么设置时间 如何设
- 下一篇: QQ音乐vkey获取,更新播放url