匯編語言---字符串操作指令


2010-07-20 20:41:32|  分類: ASM|字號 訂閱

 
 
字符串操作指令的實質是對一片連續的存儲單元進行處理,這片連續的存儲單元由隱含指針DS:SI或ES:DI來指定;字符串操作指令可對內存單元按照字節、字、雙字進行處理,並能根據操作對象的字節數使變址寄存器SI/DI增加或減少1、2、4字節;
規定如下:
A.當DF=0時,變址寄存器SI/DI增加1、2、4字節;即:變址寄存器SI/DI遞增的步長可以是1、2、4字節;
B.當DF=1時,變址寄存器SI/DI減少1、2、4字節;即:變址寄存器SI/DI遞減的步長可以是1、2、4字節;
一、取字符串數據指令(Load String Instruction)
從指針DI:SI所指定的內存單元開始,取一個字節/字/雙字,然后存入到AL/AX/EAX中,並根據標志位DF的值對寄存器SI做相應的增減;把存放字符串數據的連續存儲區當做是數據源,使用寄存器SI;
該指令的執行不會影響任何標志位;
指令格式: LODS         地址表達式
          LODSB/LODSW  地址表達式
          LODS         地址表達式 ;80386+
在指令LODS中,它會根據"地址表達式"的屬性來決定讀取一個字節、字或雙字;即:當該地址表達式的屬性為字節、字或雙字時,將從指針DI:SI處讀取一個字節到AL中,或讀取一個字到AX中,或讀取一個雙字到EAX中,與此同時,SI還將分別增減1、2、4字節;
取字符串數據指令的功能示意圖如下圖所示:
匯編語言---字符串操作指令 - 哥哥 - 哥哥
二、置字符串數據指令(Store String Instruction)
該指令把寄存器AL/AX/EAX中的值存入指針ES:DI所指向內存單元開始的一片存儲單元中,並根據標志位DF的值對寄存器DI做相應的增減;把存放字符串的連續存儲區當做是數據的目的地,使用寄存器DI;
該指令的執行並不會影響任何標志位;
指令格式: STOS        地址表達式
          STOSB/STOSW 地址表達式
          STOSD       地址表達式 ;80386+

置字符串數據指令的功能示意圖如下圖所示:
匯編語言---字符串操作指令 - 哥哥 - 哥哥
三、字符串傳送指令(Move String Instruction)
該指令把指針DS:SI所指向的字節、字或雙字傳送給指針ES:DI所指向的內存單元,並根據標志位DF的值對寄存器DI和SI分別作相應的增減;
該指令的執行並不會影響任何標志位;
指令格式: MOVS        地址表達式1,地址表達式2
          MOVSB/MOVSW 地址表達式1,地址表達式2
          MOVSD       地址表達式1,地址表達式2  ;80386+
字符串傳送指令的功能示意圖如下圖所示:
匯編語言---字符串操作指令 - 哥哥 - 哥哥
四、輸入字符串指令(Input String Instruction)
該指令是從某一指定端口接受一個字符串,並存入到一片連續的存儲單元中;輸入端口由寄存器DX指定,存儲單元的首地址由指針ES:DI來確定,讀入的數據個數由寄存器CX來確定;在指令的執行過程中,還要根據標志位DF的值來對寄存器DI做相應的增減;把存放字符串的連續存儲區當做是數據的目的地;
該指令不會影響任何標志位;
與指令有關的操作數ES、DI、DX和CX等都是隱含操作數;
指令格式: INS        地址表達式
          INSB/INSW  地址表達式
          INSD       地址表達式 ;80386+
五、字符串輸出指令(Output String Instruction)

該指令是把一個給定的字符串輸出到一個指定的端口中;輸出端口由通用寄存器DX指定,輸出數據的首地址由指針DS:SI確定,輸出數據的個數由計數寄存器CX來確定;在指令執行的過程中,還要根據方向標志DF的值來對變址寄存器SI做相應的增減;
該指令的執行並不會影響任何標志位;
與指令有關的操作數DS、SI、DX和CX等都是隱含操作數;
指令格式: OUTS        地址表達式
          OUTSB/OUTSW 地址表達式
          OUTSD       地址表達式 ;80386+
六、字符串比較指令(Compare String Instruction)

該指令是把指針DS:SI所指向的字節、字、雙字的值與指針ES:DI所指向的字節、字、雙字的值相減,並用所得到的差來設置相關標志位;與此同時,變址寄存器SI和DI也將根據方向標志位DF的值做相應的增減;
指令格式: CMPS        地址表達式1,地址表達式2
          CMPSB/CMPSW 地址表達式1,地址表達式2
          CMPSD       地址表達式1,地址表達式2 ;80386+
受影響的標志位: AF,CF,OF,PF,SF,ZF

字符串比較指令的功能示意圖如下圖所示:
匯編語言---字符串操作指令 - 哥哥 - 哥哥
七、字符串掃描指令(Scan String Instruction)
該指令是用指針ES:DI所指向字節/字/雙字的值與相應的AL/AX/EAX的值相減,並依據所得到的差值來設置相關標志位;與此同時,變址寄存器DI還將根據方向標志DF的值來做相應的增減;
指令格式: SCAS        地址表達式
          SCASB/SCASW 地址表達式
          SCASD       地址表達式 ;80386+
受影響的標志位: AF,CF,OF,PF,SF,ZF

字符串掃描指令的功能示意圖如下圖所示:
匯編語言---字符串操作指令 - 哥哥 - 哥哥
八、重復字符串操作指令(Repeat String Instruction)
前面的字符串操作指令:取字符串數據、置字符串數據、字符串傳送、輸入字符串、輸出字符串、字符串比較、字符串掃描,等指令,都是執行一次所具有的功能;但是,每個字符串通常都是由多個字符組成的,所以,需要重復執行這些字符串操作指令;為了滿足這種需要,指令系統提供了一組重復前綴指令;
雖然在這些字符串指令的前面都可以添加一個重復前綴指令,但是由於指令執行結果的差異,對某個具體的字符串指令又不用重復前綴指令而改用其它循環來實現重復的需要;
重復字符串操作指令對標志位的影響是由被重復的字符串操作指令來決定;
1.重復前綴指令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
重復前綴指令的執行步驟如下:

STEP1:判斷: CX=0
STEP2:如果CX=0,則結束重復操作,執行程序中的下一條指令;
STEP3:否則,CX=CX-1(不影響相關標志位),並執行重復前綴指令后面指定的字符串操作指令,在該指令執行完后,再轉到步驟STEP1;
從上面的重復前綴指令格式來看,雖然我們可以使用重復前綴指令來重復取字符串數據指令(第一組指令),但是可能會因為指令的執行結果而在程序中幾乎不會使用;
例如:編寫一段程序,計算字符串"12345abcdefg"中各個字符的ASCII之和;
解:
......
MESS DB '12345abcdefg'  ;在數據段進行變量說明
......
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
2.條件重復前綴指令(Repeat String Conditionally)
條件重復前綴指令與重復前綴指令的功能相似,所不同的是:條件重復前綴指令中的重復次數不僅由CX來決定,而且還會由標志位ZF的值來決定;根據ZF所起的作用又可分為兩種:相等重復前綴指令和不等重復前綴指令;
A.相等重復前綴指令:
指令格式:
REPE/REPZ SCAS/SCASB/SCASW/SCASD
REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD
該重復前綴指令的執行步驟如下:

STEP1:判斷條件: CX!=0 且 ZF=1
STEP2:如果條件不成立,則結束重復操作,執行程序中的下一條指令;
STEP3:否則,CX=CX-1(不影響任何標志位),並執行重復前綴指令后面指定的字符串操作指令,在該指令執行后,再轉到步驟STEP1;
B.不等重復前綴指令:
指令格式:
REPNE/REPNZ SCAS/SCASB/SCASW/SCASD
REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD
該重復前綴指令的執行步驟如下:

STEP1:判斷條件:CX!=0 且 ZF=0
STEP2:如果條件不成立,則結束重復操作,執行程序中的下一條指令;
STEP3:否則,CX=CX-1(不影響任何標志位),並執行重復前綴指令后面指定的字符串操作指令,在該指令執行完后,再轉到步驟STEP1;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM