日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编指令prefix rep:

發布時間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编指令prefix rep: 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?F3:???????????? prefix rep: ?
?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?*move_char(char?*d,?char?*s,?unsigned?count)
{
    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:的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。