學 Win32 彙編[12]: PTR、OFFSET、ADDR、THIS

來源:互聯網
上載者:User
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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.