Win32彙編 MOVS,STOS,REP 指令

2021-10-05 06:12:12 字數 1410 閱讀 4073

movs 指令用於將乙個記憶體運算元的值「複製」到另乙個記憶體運算元,使用 movs 前要把目標記憶體的位址移入 edi,源目標記憶體移入 esi。(記憶方法:d表示destination,目標;s表示source,源)

執行指令,注意 es:[edi] 和 ds:[esi] 的區別,兩個段不一樣。

movs dword ptr es:[edi],dword ptr ds:[esi]
結果如下,edi 指向的記憶體變成了2。

指令執行後,edi 和 esi 均+4,這個取決於方向標誌位,如果d標誌為0,則+4,如果d標誌為1,則-4。如果記憶體寬度限定為 word 或 byte,則相應地會±2或±1.

因為 edi 和 esi 會自動+4,利用這個特性,配合 rep 指令可以快速批量修改大量記憶體。

stos 指令將 al/ax/eax 的值儲存到 [edi] 指定的記憶體單元。

執行stos byte ptr es:[edi]將 0x0019ff6c 的低8位修改為78,同時 edi 會+1.

rep 指令可用於重複執行 movs 和 stos,重複次數由 ecx 指定。

舉例:將棧頂的10個dword 複製到 0x402000

mov ecx,0xa

mov edi,crackme.00402000

mov esi,esp

rep movs dword ptr es:[edi],dword ptr ds:[esi]

結果如下,可以看到 esi,edi 都增加了28h,也就是十進位制的40,記憶體也成功複製了。

rep 配合 stos 則可以快速初始化大量記憶體,比如,將 0x402000 開始的40個位元組初始化為ff

mov ecx,0a

mov edi,crackme.00402000

mov eax,-1

rep stos dword ptr es:[edi]

結果如下

Win32彙編基礎

常用指令 mov 目標運算元,源運算元 mov eax,0x0 進行資料傳遞 movzx mov zero x 以0填充高位,用法同上,push poppushad 所有暫存器壓棧 8個 popad 所有暫存器出棧 8個 lea 取位址指令,類似c語言中的 call 呼叫函式指令 add 加 sub...

Win32彙編 實數

386 選擇的處理器 model flat,stdcall option casemap none 指明識別符號大小寫敏感 include kernel32.inc 要引用的標頭檔案 includelib kernel32.lib 要引用的庫檔案 includelib msvcrt.lib 引用c庫...

開始學習win32彙編

前段時間對於csdn的部落格系統徹底失望,在我現在寫的東西都還不知道能不能正常發出去,鬱悶,加上過年有這麼久沒有來了。這段時間開始學習彙編,說到彙編,大學開過兩門相關課程,微機原理和微控制器都是學這方面的,不過那都是8086,51級別的彙編,感覺根本跟不上時代,那時候學的還不錯 現在想學習學習win...