目前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