`
zzc1684
  • 浏览: 1224562 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS

 
阅读更多

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


; Test12_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
    val db 11h, 22h, 33h, 44h, 55h, 66h, 77h, 88h

.code
main 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
    ret
main endp
end main


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


; Test12_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
    v1 db 'abcdefg', 0
    v2 dd 11223344h

.code
main proc
    PrintHex offset v1    ;00403000
    PrintHex offset v2    ;00403008
    PrintHex 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

.data
    v1 dd 00434241h ;ABC
    v2 dd 00636261h ;abc

.code
main proc
    invoke 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 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, 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, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    TextAddr equ this byte   ;伪指令 this 可让当前变量和下一个变量同址 
    szText db 'Asm', 0
.code
main proc
    PrintHex offset szText   ;00403000
    PrintHex offset TextAddr ;00403000
    
    PrintString szText       ;Asm
    mov [TextAddr], 'a'      ;给 TextAddr 赋值
    PrintString szText       ;asm
    ret
main endp
end main
分享到:
评论

相关推荐

    masm32位汇编及指令集

    在汇编语言中,有一些关键字用于明确数据类型和内存地址,例如ptr用于指定数据类型,offset用于获取变量地址,而local和proc分别用于定义局部变量和子程序。 最后,Win32汇编指令是针对32位Windows API进行编程的...

    C++智能指针-unique-ptr智能指针详解.pdf

    《C++智能指针——unique_ptr智能指针详解》 智能指针是C++中用于自动管理动态分配内存的一种工具,它可以确保在适当的时候自动释放内存,从而避免内存泄漏的问题。其中,`unique_ptr`是一种特殊的智能指针,它拥有...

    C++11 std::shared_ptr总结与使用示例代码详解

    C++11 std::shared_ptr总结与使用示例代码详解 std::shared_ptr是C++11中引入的一种智能指针,主要用于自动管理资源的生命周期。下面是std::shared_ptr的总结和使用示例代码详解: 一、智能指针的用途 std::...

    自己实现的auto_ptr

    标题中的“自己实现的auto_ptr”指的是用户自行编写的一个智能指针类,模仿了C++标准库中的`std::auto_ptr`。`std::auto_ptr`是C++标准库中的一个智能指针,用于管理动态分配的对象,它会在适当的时候自动删除所指向...

    test_share_ptr

    在本项目"test_share_ptr"中,我们可以推断其主要关注的是C++中的智能指针`std::shared_ptr`。`std::shared_ptr`是C++标准库中的一个智能指针类型,属于弱所有者(weak ownership)的智能指针,用于管理动态分配的...

    WIN32程序的C++编程

    《深入浅出:Win32程序的C++编程》 在计算机编程领域,C++语言以其强大的性能和灵活性,成为了开发系统级应用的首选。尤其是当你深入到Win32 API编程时,C++的特性更是得以充分发挥。Win32 API是微软提供的用于...

    c++及win32学习课件

    Win32 API(应用程序接口)则是微软Windows操作系统提供的一套编程接口,允许开发者直接控制操作系统底层功能,实现高效、低级别的编程。 对于初学者,理解C++的基础至关重要,包括基本语法、数据类型、控制结构...

    win32应用程序中建立对话框

    在Win32应用程序开发中,建立对话框是创建用户交互界面的一个重要环节。对话框通常用于收集用户输入、显示信息或者执行特定操作。本篇将深入探讨如何在Win32环境中利用MFC(Microsoft Foundation Classes)类库创建...

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    在C++11及更高版本中,智能指针(如`std::unique_ptr`,`std::shared_ptr`和`std::scoped_ptr`)被引入来更好地管理动态内存,因此理解如何在这些指针上实现序列化至关重要。 首先,让我们关注`std::unique_ptr`。`...

    AT&T汇编语言与GCC内嵌汇编简介.pdf

    ### AT&T汇编语言与GCC内嵌汇编简介 #### AT&T与INTEL汇编语言语法的区别 AT&T汇编语言与INTEL汇编语言在语法上有显著的不同,这些差异对于初学者来说可能会造成一定的混淆。理解这两种语法之间的区别非常重要,...

    win32下动态创建菜单栏

    本篇文章将详细解析如何在Win32环境下实现动态创建菜单栏。 首先,我们需要理解Windows API中的菜单概念。在Win32 API中,菜单主要分为两种类型:系统菜单(通常包含窗口控制选项,如最小化、最大化和关闭)和应用...

    浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    【Boost智能指针详解:scoped_ptr、shared_ptr与weak_ptr】 智能指针是C++中用来自动管理动态分配内存的对象,它可以确保在适当的时间释放内存,以防止内存泄漏。Boost库提供了一组智能指针类型,包括scoped_ptr、...

    PTR6000.rar_PTR6000_PTR6000-receive_ptr60

    《PTR6000无线模块详解及应用指南》 PTR6000是一款高性能的无线通信模块,广泛应用于各种远程数据传输和物联网解决方案中。本文将深入探讨PTR6000的技术特性、工作原理以及如何进行有效配置和编程,帮助读者全面...

    基于win32的C++线程池实现

    总结来说,基于Win32的C++线程池实现涉及到Win32 API的使用、线程管理、同步机制、错误处理以及优化策略等多个方面。理解并掌握这些知识点,对于编写高效、可靠的多线程程序至关重要。通过不断实践和优化,可以创建...

    OpenCV实现项目代码

    它cv::Ptr是轻微封装的std::shared_ptr。 在Linux / BSD上,cv::parallel_for_现在使用std::threads而不是pthreads。 ## DNN改进 添加了基本的FP16支持(添加了新的CV_16F类型)。 添加了对Mask-RCNN模型的支持...

    COM写的一个弹出错误对话框的程序,用于自己的程序中错误信息的管理

    ptr->AddErrorMsg((_bstr_t)"出错类名",(_bstr_t)"出错函数名",(_bstr_t)"出错语句",(_bstr_t)"备注或描述"); 2. 弹出错误对话框: ptr->ShowErrorMsg(); 3. 清空错误信息列表: ptr->Empty(); 压缩包里有个"配置....

    利用Opencv3.2中的DPM模块,实现DPM算法对行人的检测,一个完整的实现,含有注释和完整的工程文件,环境为win7+vs2013

    在Win7环境下,使用Visual Studio 2013编译并运行这个项目,开发者可以直观地看到DPM如何在图像上检测行人,理解算法的运作原理。源代码中的注释有助于理解每一步的具体功能,对于学习和进一步改进DPM算法非常有帮助...

    ptairData:PTR-TOF-MS数据

    该软件包包含两个通过质子传递React飞行时间质谱仪(PTR-TOF-MS; Ionicon Analytik GmbH,奥地利因斯布鲁克,奥地利)采集的原始火山岩数据集: 从两个健康个体呼出的空气,每个个体在不同的日子采集三次(即三个...

    c++11 封装 win32 界面库

    Win32 SDK(Software Development Kit)是Microsoft提供的一个开发工具集,用于创建Windows平台上的原生应用程序,其中包含了丰富的API函数,可以用来构建图形用户界面(GUI)。本项目将C++11的新特性与Win32 SDK相...

Global site tag (gtag.js) - Google Analytics