为什么80%的码农都做不了架构师?>>>   

PTR: 指定要操作的数据尺寸


; Test12_1.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval db 11h, 22h, 33h, 44h, 55h, 66h, 77h, 88h.code
main procxor eax, eax             ;清空 EAX, 同 mov eax, 0mov eax, dword ptr val   ;PrintHex eax             ;44332211xor eax, eax             ;mov eax, dword ptr val+1 ;PrintHex eax             ;55443322xor eax, eax             ;mov ax, word ptr val     ;PrintHex eax             ;00002211xor eax, eax             ;mov al, byte ptr val     ;PrintHex eax             ;00000011ret
main endp
end main

OFFSET: 获取全局变量或标号的偏移地址


; Test12_2.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.datav1 db 'abcdefg', 0v2 dd 11223344h.code
main procPrintHex offset v1    ;00403000PrintHex offset v2    ;00403008PrintHex offset main  ;00401000 - 这里的 main 是个标号ret
;本例中的 offset 不能用 addr 代替
main endp
end main

ADDR: 类似 offset 也是获取变量的地址...


; Test12_3.asm
.386
.model flat, stdcall;include    windows.inc
include    kernel32.inc
includelib kernel32.lib
include    user32.inc
includelib user32.lib.datav1 dd 00434241h ;ABCv2 dd 00636261h ;abc.code
main procinvoke MessageBox, 0, offset v1, offset v2, 0 ;现在 v1、v2 是全局变量invoke MessageBox, 0,   addr v2,   addr v1, 0 ;使用 offset 和 addr 均可invoke ExitProcess, 0
main endp
end main

获取局部变量的地址只能使用 ADDR:


; Test12_4.asm
.386
.model flat, stdcall;include    windows.inc
include    kernel32.inc
includelib kernel32.lib
include    user32.inc
includelib user32.lib.code
main procLOCAL v1,v2mov v1, 00434241hmov v2, 00636261h;invoke MessageBox, 0, offset v1, offset v2, 0  ;offset 不能获取局部变量的地址invoke MessageBox, 0,   addr v2,   addr v1, 0invoke ExitProcess, 0
main endp
end 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.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataTextAddr equ this byte   ;伪指令 this 可让当前变量和下一个变量同址 szText db 'Asm', 0
.code
main procPrintHex offset szText   ;00403000PrintHex offset TextAddr ;00403000PrintString szText       ;Asmmov [TextAddr], 'a'      ;给 TextAddr 赋值PrintString szText       ;asmret
main endp
end main

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

学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS相关推荐

  1. 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一

    记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述 PContext = ^TContext; _CONTEXT = recordContextFlags: DWORD;Dr0: D ...

  2. 学 Win32 汇编[6]: 伪指令 DUP 与数组

    为什么80%的码农都做不了架构师?>>>    声明数组实例: ; Test6_1.asm .386 .model flat, stdcallinclude windows.inc ...

  3. 学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV

    MUL: 无符号乘 ;影响 OF.CF 标志位 ;指令格式: ;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX ;如果参数是 r16/m16, 将把 AX ...

  4. 学 Win32 汇编[24] - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD

    SHL.SHR.SAL.SAR: 移位指令 ;SHL(Shift Left): 逻辑左移 ;SHR(Shift Right): 逻辑右移 ;SAL(Shift Arithmetic Left): 算术 ...

  5. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等...

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  6. 学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

    为什么80%的码农都做不了架构师?>>>    ;INC(Increment): 加一 ;DEC(Decrement): 减一 ;NEG(Negate): 求补(求反) ;ADD(A ...

  7. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  8. Win32汇编环境配置

    放假了,发现自己知识面窄,趁有时间就打算折腾下Win32汇编.其实在学校也上过汇编课,是基于dos的.那时老师不务正业,老跟我们讲政治经济文化,唯独不怎么讲课;再加上自己的问题,导致了dos汇编学得好 ...

  9. win32 汇编基础概念整理

    一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...

最新文章

  1. Elasticsearch内存分配设置详解
  2. 深入理解计算机系统答案2.11,深入理解计算机系统 第十一章
  3. Maven初探-如何快速入手一个项目
  4. 在dw怎么关联css文件,重新设置Adobe Dreamweaver的文件关联解决办法
  5. Gartner:新安全环境对虚拟化和云计算提出更高要求
  6. 淘宝架构师为你揭秘2017双十一分布式缓存服务Tair
  7. 调用postman拿CSRF token的隐藏Cookie处理
  8. 关于java中BufferedReader的read()及readLine()方法的使用心得
  9. OpenGL: 渲染管线理论
  10. C++算法学习(力扣:134. 加油站)
  11. ubuntu 安装cuda 成功
  12. Padavan启用ipv6并允许公网访问内网
  13. 《禅者的初心》读书笔记(3)
  14. 【python】opencv调用海康威视摄像头
  15. 动态添加 data 属性的时候 发现某一个值无法取到
  16. 程序员情人节生日表白源码合集总有一款能够打动她(附带烟花特效,520爱心)
  17. pipe 半双工_linux进程间通信之管道(无名管道pipe)实现全双工双向通信
  18. 传统安防监控直播的四分屏的前端展示代码
  19. Python爬虫,爬取2020年软科中国大学排名并进行数据清洗与可视化输出
  20. oracle ora00957,常见oracle错误代码ORA-xxxxx及其解决方法(持续更行中)

热门文章

  1. SQL查询一个表中另外一个表不存在的数据
  2. 《JAVA练习题目10》请对图书馆系统中的CatalogItem类、Book类和Recording类进行改造,实现其code属性的自动编码。
  3. mysql 添加int列_在MySQL中现有的int列的值中添加字符?
  4. 分计算iv值_机器学习-变量筛选之IV值和WOE
  5. aryson ms sql_数据治理:SQL数据清洗十八般武艺
  6. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)
  7. 新手学电脑入门教程_炒股技巧大全丨炒股新手怎样才能长期稳定盈利
  8. thinkpad x230评测_全新改变超长续航 ThinkPad X230评测
  9. 大数据druid查询不支持分页_Druid实时大数据分析查询(六)
  10. C/C++中的复数介绍