學 Win32 彙編 14 使用中括號

2021-09-05 23:20:24 字數 3791 閱讀 2674

[位址] 是取位址指向的內容:

; test14_1.asm

.386

.model flat, stdcall

include windows.inc

include kernel32.inc

include masm32.inc

include debug.inc

includelib kernel32.lib

includelib masm32.lib

includelib debug.lib

.data

dwval dd 123

.code

main proc

printdec offset dwval ;4206592 - 這是變數 dwval 的位址

printdec dwval ;123 - 這是變數值

lea ebx, dwval ;lea 是專門獲取位址的指令, 這同 mov ebx, offset dwval

printdec ebx ;4206592

mov eax, [ebx] ;現在 ebx 中放著 dwval 變數的位址, [ebx] 則表示位址指向的值

printdec eax ;123

retmain endp

end main

位址指向的是什麼資料?

; test14_2.asm

.386

.model flat, stdcall

include windows.inc

include kernel32.inc

include masm32.inc

include debug.inc

includelib kernel32.lib

includelib masm32.lib

includelib debug.lib

.data

wval dw 123

.code

main proc

lea ebx, wval ;把變數 wval 的位址放到 ebx

;但現在 wval 中放著的是 word 型別的資料, 而 [ebx] 預設是取 32 位的資料

;這可通過偽指令 ptr 指定資料大小

;同時需要把接收著換成 16 的(如 ax), 因為 mov 要求兩個運算元的大小須一致

xor eax, eax ;清空 eax

mov ax, word ptr [ebx]

printdec eax ;123

;也可以直接使用 movzx, 它可以從小到大(movzx r16/r32, r/8/r16/m8/m16)

movzx eax, word ptr [ebx]

printdec eax ;123

retmain endp

end main

一般用於陣列:

; test14_3.asm

.386

.model flat, stdcall

include windows.inc

include kernel32.inc

include masm32.inc

include debug.inc

includelib kernel32.lib

includelib masm32.lib

includelib debug.lib

.data

warr dw 11,22,33

.code

main proc

;把陣列 barr 的起始位址放到 ebx, 並獲取陣列元素:

lea ebx, warr

movzx eax, word ptr [ebx]

movzx ecx, word ptr [ebx+2]

movzx edx, word ptr [ebx+4]

printdec eax ;11

printdec ecx ;22

printdec edx ;33

;這樣做更好些:

lea ebx, warr

mov esi, type warr ;把元素大小放在 esi

movzx eax, word ptr [ebx]

movzx ecx, word ptr [ebx + esi * 1]

movzx edx, word ptr [ebx + esi * 2]

printdec eax ;11

printdec ecx ;22

printdec edx ;33

;這樣也行:

lea ebx, warr

mov esi, type warr ;把元素大小放在 esi

movzx eax, word ptr [ebx]

movzx ecx, word ptr [ebx][esi * 1]

movzx edx, word ptr [ebx][esi * 2]

printdec eax ;11

printdec ecx ;22

printdec edx ;33

;如果直接使用變數就更像高階語言裡的陣列了:

lea ebx, warr

mov esi, type warr ;把元素大小放在 esi

movzx eax, word ptr warr

movzx ecx, word ptr warr[esi * 1]

movzx edx, word ptr warr[esi * 2]

printdec eax ;11

printdec ecx ;22

printdec edx ;33

retmain endp

end main

當然也可以寫入陣列:

; test14_4.asm

.386

.model flat, stdcall

include windows.inc

include kernel32.inc

include masm32.inc

include debug.inc

includelib kernel32.lib

includelib masm32.lib

includelib debug.lib

.data

warr dw 11h ,22h, 33h

.code

main proc

dumpmem offset warr, sizeof warr ;11 00 22 00 33 00

lea ebx, warr

mov word ptr [ebx], 44h

mov word ptr [ebx+2], 55h

mov word ptr [ebx+4], 66h

dumpmem offset warr, sizeof warr ;44 00 55 00 66 00

;或者:

mov word ptr warr, 77h

mov word ptr warr[2], 88h

mov word ptr warr[4], 99h

dumpmem offset warr, sizeof warr ;77 00 88 00 99 00

retmain endp

end main

好像 不能直接是變數或常數(變數後面跟的 除外).

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彙編病毒要學什麼內容

自己備忘用的,或都是把所學過的和已知要學的列出來吧 8086的16位彙編指令 32位彙編指令 windows系統api函式 pe檔案格式 保護模式程式設計 程序隱藏 epo 入口點模糊 技術 api hook 反除錯加密 encrypt 固定的解密頭 加密的 多型 polymorphi 變化的解密頭...