PTR: 指定要操作的資料尺寸
; Test12_1.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data val db 11h, 22h, 33h, 44h, 55h, 66h, 77h, 88h.codemain proc xor eax, eax ;清空 EAX, 同 mov eax, 0 mov eax, dword ptr val ; PrintHex eax ;44332211 xor eax, eax ; mov eax, dword ptr val+1 ; PrintHex eax ;55443322 xor eax, eax ; mov ax, word ptr val ; PrintHex eax ;00002211 xor eax, eax ; mov al, byte ptr val ; PrintHex eax ;00000011 retmain endpend main
OFFSET: 擷取全域變數或標號的位移地址
; Test12_2.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data v1 db 'abcdefg', 0 v2 dd 11223344h.codemain proc PrintHex offset v1 ;00403000 PrintHex offset v2 ;00403008 PrintHex offset main ;00401000 - 這裡的 main 是個標號 ret;本例中的 offset 不能用 addr 代替main endpend main
ADDR: 類似 offset 也是擷取變數的地址...
; Test12_3.asm.386.model flat, stdcall;include windows.incinclude kernel32.incincludelib kernel32.libinclude user32.incincludelib user32.lib.data v1 dd 00434241h ;ABC v2 dd 00636261h ;abc.codemain proc invoke MessageBox, 0, offset v1, offset v2, 0 ;現在 v1、v2 是全域變數 invoke MessageBox, 0, addr v2, addr v1, 0 ;使用 offset 和 addr 均可 invoke ExitProcess, 0main endpend main
擷取局部變數的地址只能使用 ADDR:
; Test12_4.asm.386.model flat, stdcall;include windows.incinclude kernel32.incincludelib kernel32.libinclude user32.incincludelib user32.lib.codemain proc LOCAL v1,v2 mov v1, 00434241h mov v2, 00636261h ;invoke MessageBox, 0, offset v1, offset v2, 0 ;offset 不能擷取局部變數的地址 invoke MessageBox, 0, addr v2, addr v1, 0 invoke ExitProcess, 0main endpend main
OFFSET 和 ADDR 的異同:
1、offset 不能擷取局部變數的地址;
2、addr 只能用於調用函數(invoke)時, 不能用於賦值操作;
3、addr 面對局部變數時會轉換為 lea 等指令, addr 面對全域變數時則直接調用 offset;
4、在 invoke 中應盡量使用 addr, 其他只用 offset.
THIS:
; Test12_5.asm.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data TextAddr equ this byte ;偽指令 this 可讓當前變數和下一個變數同址 szText db 'Asm', 0.codemain proc PrintHex offset szText ;00403000 PrintHex offset TextAddr ;00403000 PrintString szText ;Asm mov [TextAddr], 'a' ;給 TextAddr 賦值 PrintString szText ;asm retmain endpend main