博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS
阅读量:6840 次
发布时间:2019-06-26

本文共 2704 字,大约阅读时间需要 9 分钟。

  hot3.png

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

转载于:https://my.oschina.net/hermer/blog/320317

你可能感兴趣的文章
通过shell导出数据库查询结果到excel中,并通过邮件发送到邮箱
查看>>
8 个你可能不知道的 Docker 知识
查看>>
JavaSE学习笔记(六)——类的继承
查看>>
java代码编写出现的陷阱-2:阴沟里翻船
查看>>
CentOS Zabbix Server安装
查看>>
Redis sort命令详解
查看>>
Linux Top 命令详解
查看>>
Don't be too serious about knowing the world
查看>>
servlet,RMI,webservice之间的区别
查看>>
Java异常架构
查看>>
Git 分支合并冲突及合并分类
查看>>
解决UnicodeEncodeError: 'ascii' codec can't encode characters in position
查看>>
Android开机广播android.intent.action.BOOT_COMPLETED
查看>>
Linux服务器信息收集
查看>>
怎样在 CentOS 7.0 上安装和配置 VNC 服务器
查看>>
学习 SQL 语句 - Select(2): 指定表中的字段
查看>>
iptraf
查看>>
Tomcat JDBC pool源码部析
查看>>
a 伪类在IE6下优先级大于class
查看>>
iOS 导出 ipa 包时 四个选项的意义
查看>>