汇编指令prefix rep:
生活随笔
收集整理的這篇文章主要介紹了
汇编指令prefix rep:
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?F3:???????????? prefix rep:
?
?C3????????????? retn ?
?
{
char?*p?=?d;
while?(count--)
*d++?=?*s++;
return?p;
} 這是典型的、經典的字符串復制c代碼,對應以下類似的匯編代碼:
引用: move_char:
????????push?ebp
????????mov?ebp,?esp
????????sub?esp,?0xc
????????mov?eax,?[ebp+8]
????????mov?edi,?eax
????????mov?esi,?[ebp+0xc]
????????mov?ecx,?dword?ptr?[ebp+0x10]
move_loop:
????????mov?al,?byte?ptr?[esi]
????????mov?byte?ptr?[edi],?al
????????inc?esi
????????inc?edi
????????dec?ecx
????????test?ecx,ecx
????????jnz?move_loop
????????mov?esp,?ebp
????????pop?ebp
????????ret 上面的代碼性能低下,是很死板的實現,優化的空間巨大。
x86為串提供了相應的串操作指令(ins,outs,lods,stos,scas,cmps),對這些串指令提供prefix來增強和優化這些指令:
●?F3:?rep?prefix?或?repe?prefix
●?F2:?repne?prefix
1、rep?prefix
重復進行串操作,僅應用于ins,outs,movs,lods,stos?這些不改變標志位的串指令,結束條件是ECX為0。
使用串操作及rep?prefix上面的匯編代碼可簡單如下:
move_char:
…?…
mov?eax,?[ebp+8]
mov?edi,?eax
mov?esi,?[ebp+0xc]
mov?ecx,?[ebp+0x10]
rep?movsb…?…
rep?movsb的操作原理和上面的C代碼一致,下面是偽碼:
引用: while?(ecx?!=?0)?{
????c?=?ds:[esi];
????es:[edi]?=?c;
????esi?=?esi?+?1
????edi?=?edi?+?1
????ecx?=?ecx??1;
} 2、repe?prefix
F3的另個prefix意思是?repe/repz,用于改變標志位的串操作:scas,cmps 意思是當相等并且循環次數(ecx)不為0時進行重復操作。
結束條件是ecx為0或者ZF標志位為0,或者說是循環條件是(ecx不為0,并且ZF標志位為1)
常見運用一些跳過字符的邏輯上,如下面C代碼,用于截除串前面空格
引用: char?*trim(char?*s)
{
while?(*s?&&?*s?==?‘?‘)?s++;
return?s;
} 而用偽碼表示為:
引用: While?(ecx?!=?0?and?ZF?=?1)?{
Ecx?=?ecx??1;
cmps
} rep?與?repe/repz?是相同的prefix,作用不用體現在對串指操作上:
movsb?的opcode是A4,scasb?的opcode?是AE,對于下面的encode:
F3?A4:這時?F3?prefix是REP
F3?AE:這時?F3?prefix是REPZ
3、??repne/repnz prefix
F2:這個prefix是repne/repnz,意思是循環次數(ecx)不為0并且ZF=0時重復操作。結束條件是:ecx=0或者ZF=1,同樣也是用于改變標志位的串操作scas和cmps
常見一些查找字符的邏輯上,如下面C代碼:
引用: char?*get_c(char?*s,?char?c)
{
while?(*s?&&?*s?!=?c)?s++;
return?s;
} 而用偽碼表示為:
引用: While?(ecx?!=0?and?ZF?!=?1)?{
Ecx?=?ecx??1;
cmps
}
三、??附加功能(LOCK)
對于寫內存的一些指令增加了鎖地址總線的功能,這些寫內存的指令如常見的mov,add等指令,通過Lock?prefix來實現這功能,使用Lock?prefix將會使processor產生LOCK# 信號鎖地址總線
F0:LOCK?prefix僅作用于寫內存操作的指令上,也就是說:目標操作數為內存的指令。
到此?x86?prefix 講解完畢
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
?C3????????????? retn ?
?
OD中看到這,弄不明白第一句是什么意思了,有人能告訴一下吧,謝謝了,我在線等高人幫忙?
答案:
rep 是前綴指令,本身沒有含義,是不確定的,用來修飾后面的指令用的?
在這個C3前面的REP是沒有意義
=======================================================================
- 深入淺出指令編碼之二:指令格式(3)
- 標 題:深入淺出指令編碼之二:指令格式(3)
- 作 者:mik
- 時 間:2008-11-30 00:49?
- 鏈 接:http://bbs.pediy.com/showthread.php?t=77757
二、??增強指令功能
一些Prefix對Opcode?進行補充,增強指令的功能,優化指令執行,看下面這段c代碼:
{
char?*p?=?d;
while?(count--)
*d++?=?*s++;
return?p;
} 這是典型的、經典的字符串復制c代碼,對應以下類似的匯編代碼:
引用: move_char:
????????push?ebp
????????mov?ebp,?esp
????????sub?esp,?0xc
????????mov?eax,?[ebp+8]
????????mov?edi,?eax
????????mov?esi,?[ebp+0xc]
????????mov?ecx,?dword?ptr?[ebp+0x10]
move_loop:
????????mov?al,?byte?ptr?[esi]
????????mov?byte?ptr?[edi],?al
????????inc?esi
????????inc?edi
????????dec?ecx
????????test?ecx,ecx
????????jnz?move_loop
????????mov?esp,?ebp
????????pop?ebp
????????ret 上面的代碼性能低下,是很死板的實現,優化的空間巨大。
x86為串提供了相應的串操作指令(ins,outs,lods,stos,scas,cmps),對這些串指令提供prefix來增強和優化這些指令:
●?F3:?rep?prefix?或?repe?prefix
●?F2:?repne?prefix
1、rep?prefix
重復進行串操作,僅應用于ins,outs,movs,lods,stos?這些不改變標志位的串指令,結束條件是ECX為0。
使用串操作及rep?prefix上面的匯編代碼可簡單如下:
move_char:
…?…
mov?eax,?[ebp+8]
mov?edi,?eax
mov?esi,?[ebp+0xc]
mov?ecx,?[ebp+0x10]
rep?movsb…?…
rep?movsb的操作原理和上面的C代碼一致,下面是偽碼:
引用: while?(ecx?!=?0)?{
????c?=?ds:[esi];
????es:[edi]?=?c;
????esi?=?esi?+?1
????edi?=?edi?+?1
????ecx?=?ecx??1;
} 2、repe?prefix
F3的另個prefix意思是?repe/repz,用于改變標志位的串操作:scas,cmps 意思是當相等并且循環次數(ecx)不為0時進行重復操作。
結束條件是ecx為0或者ZF標志位為0,或者說是循環條件是(ecx不為0,并且ZF標志位為1)
常見運用一些跳過字符的邏輯上,如下面C代碼,用于截除串前面空格
引用: char?*trim(char?*s)
{
while?(*s?&&?*s?==?‘?‘)?s++;
return?s;
} 而用偽碼表示為:
引用: While?(ecx?!=?0?and?ZF?=?1)?{
Ecx?=?ecx??1;
cmps
} rep?與?repe/repz?是相同的prefix,作用不用體現在對串指操作上:
movsb?的opcode是A4,scasb?的opcode?是AE,對于下面的encode:
F3?A4:這時?F3?prefix是REP
F3?AE:這時?F3?prefix是REPZ
3、??repne/repnz prefix
F2:這個prefix是repne/repnz,意思是循環次數(ecx)不為0并且ZF=0時重復操作。結束條件是:ecx=0或者ZF=1,同樣也是用于改變標志位的串操作scas和cmps
常見一些查找字符的邏輯上,如下面C代碼:
引用: char?*get_c(char?*s,?char?c)
{
while?(*s?&&?*s?!=?c)?s++;
return?s;
} 而用偽碼表示為:
引用: While?(ecx?!=0?and?ZF?!=?1)?{
Ecx?=?ecx??1;
cmps
}
三、??附加功能(LOCK)
對于寫內存的一些指令增加了鎖地址總線的功能,這些寫內存的指令如常見的mov,add等指令,通過Lock?prefix來實現這功能,使用Lock?prefix將會使processor產生LOCK# 信號鎖地址總線
F0:LOCK?prefix僅作用于寫內存操作的指令上,也就是說:目標操作數為內存的指令。
到此?x86?prefix 講解完畢
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的汇编指令prefix rep:的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mov eax,dword ptr fs
- 下一篇: 汇编浮点指令fld、fstp