目前80386系列的處理器提供幾組處理字節(jié)、字和雙字數(shù)值的指令,盡管這些指令成為基本字符串指令,但他們的用法并不局限于字符數(shù)組。
指令:
MOVSB, MOVSW, MOVSD
描述:
移動字符串數(shù)據(jù),復制由ESI寄存器尋址的內(nèi)存地址處的數(shù)據(jù)至EDI尋址的內(nèi)存地址處。
在保護模式程序中,也就是我們80386默認的啟動模式,ESI自動作為由DS尋址的段內(nèi)偏移,EDI自動作為由ES尋址的段內(nèi)偏移,ES和DS總是具有同樣的值且無法改變它們。(在實地址模式(8086)模式下ES和DS是我們程序員操縱的)。
我們來看這三個指令:MOVSB, MOVSW, MOVSD ,我們可以發(fā)現(xiàn)它們就最后一個字母不同,其實最后一個字母也就表示的是我們每次移動的數(shù)據(jù)字節(jié)大小。第一個MOVSB是每次一個字節(jié),其次是一個字、接著一個雙字。 我們從它的'B','W','D'就可以看出來。 B代表Byte,W代表WORD, D代表DWORD。
上面這3個字符串操作指令本身每次只能處理一個或一對值,但如果增加一個重復前綴,指令就會使用ecx寄存器作為計數(shù)器進行重復。重復前綴可以僅用一條指令處理整個數(shù)組。
重復前綴REP : 當ECX>0時重復 (和我們的loop循環(huán)相似)。
看了上面的理論,我們來個演示吧。
cld ;方向標志
mov esi, 內(nèi)存地址1 ;(也就是存放字符串的內(nèi)存地址)
mov edi, 內(nèi)存地址2 ;(要移動到目的處的地址)
mov ecx, 要移動的數(shù)量 ;
rep movsb
cld是來控制重復移動時候的esi 和edi的遞增方式。 cld是將方向標志位DF設置為0,每次rep循環(huán)的時候,esi和edi自動+1。 std是將方向標志位DF設置為1,每次rep循環(huán)的時候,esi和edi自動-1。
rep循環(huán)前綴在執(zhí)行循環(huán)的時候,ecx寄存器是每次減1的。和我們的loop循環(huán)一樣。
我們在進行字符串操作時,千萬要記住要首先設置方向標志,否則會發(fā)生不可預料的結(jié)果。
|