彙編語言:MOVSB,MOVSW,MOVSD

目前80386系列的處理器提供幾組處理字節、字和雙字數值的指令,儘管這些指令成爲基本字符串指令,但他們的用法並不侷限於字符數組。 

     指令:                                          
     MOVSB, MOVSW, MOVSD
                        
     描述:
     移動字符串數據,複製由ESI寄存器尋址的內存地址處的數據至EDI尋址的內存地址處。


     在保護模式程序中,也就是我們80386默認的啓動模式,ESI自動作爲由DS尋址的段內偏移,EDI自動作爲由ES尋址的段內偏移,ES和DS總是具有同樣的值且無法改變它們。(在實地址模式(8086)模式下ES和DS是我們程序員操縱的)。

    
     我們來看這三個指令:MOVSB, MOVSW, MOVSD   ,我們可以發現它們就最後一個字母不同,其實最後一個字母也就表示的是我們每次移動的數據字節大小。第一個MOVSB是每次一個字節,其次是一個字、接着一個雙字。 我們從它的'B','W','D'就可以看出來。 B代表Byte,W代表WORD, D代表DWORD。

     上面這3個字符串操作指令本身每次只能處理一個或一對值,但如果增加一個重複前綴,指令就會使用ecx寄存器作爲計數器進行重複。重複前綴可以僅用一條指令處理整個數組。

     重複前綴REP : 當ECX>0時重複 (和我們的loop循環相似)。
    
    
     看了上面的理論,我們來個演示吧。

     cld   ;方向標誌
     mov   esi, 內存地址1     ;(也就是存放字符串的內存地址)
     mov   edi, 內存地址2     ;(要移動到目的處的地址)
     mov   ecx, 要移動的數量 ;
     rep   movsb 


    cld是來控制重複移動時候的esi 和edi的遞增方式。 cld是將方向標誌位DF設置爲0,每次rep循環的時候,esi和edi自動+1。   std是將方向標誌位DF設置爲1,每次rep循環的時候,esi和edi自動-1。
   rep循環前綴在執行循環的時候,ecx寄存器是每次減1的。和我們的loop循環一樣。

   我們在進行字符串操作時,千萬要記住要首先設置方向標誌,否則會發生不可預料的結果。

 

參考文獻

http://hi.baidu.com/txuqbajotfnstvr/item/f80e6c079059a1e9f55ba65d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章