[位址] 是取位址指向的內容:
; 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 變化的解密頭...