STOSB

STOSB

該指令為單字元輸出指令,調用該指令后,可以將累加器AL中的值傳遞到當前ES段的DI地址處,並且根據DF的值來影響DI的值,如果DF為0,則調用該指令后,DI自增1,如果DF為1,DI自減1.相當於:MOV ES:[DI],AL INC DI 或者 MOV ES:[DI],AL DEC DI

目錄

正文


雙字指令:STOSD
STOSD指令執行是不會跳轉的..優先執行完此條指令才會執行其他指令..
示例代碼(內聯彙編):
PALETTEENTRY palette[256] ;
PALETTEENTRY* PTC = palette;
_asm
{
PUSH ECX
PUSH EDI
PUSH EAX ;寄存器入棧 保存現場
CLD ;CLD使DF複位,即 DF=0 地址自增
MOV EAX,0
MOV ECX,256 ;循環數
MOV EDI,PTC
REP STOSD;連續在此處複製256次 0(EAX為0) 一次複製4個位元組
POP EAX
POP EDI
POP ECX
}
此段代碼把palette數組 256個項全部填為0
經驗之談 :
在特定 條件下 ... rep movsd/movsb rep stdsd/stdsb 拷貝速度等同於 SSE/MMX 中的 movq/movaps
一次性搬動整個cache行
*源地址和目的地址都按8對齊
*增量是向前的(清方向標誌)
*計數器(ECX)大於等於64
*EDI和ESI的差在數值上大於等於32
*源內存和目的內存必須是寫回或組合寫模式
在這些條件下,REP MOVSD產生的微碼大約是215+2*ECX條,REP STOSD產生的微碼大約是185+1。 5*ECX條,它們的速度大約是5位元組/時鐘。如果上面的條件不是都滿足的,速度將減為1/3。
在“快速模式”下(即上述條件全部滿足),byte版本和word版本的REP MOVS/STOS指令同樣受益,但效率不如dword版本。
REP STOSD的優化條件與REP MOVSD相同。