(C/C++) 内联汇编“add dword ptr [address]”增加地址而不是它的值

Posted

技术标签:

【中文标题】(C/C++) 内联汇编“add dword ptr [address]”增加地址而不是它的值【英文标题】:(C/C++) Inline Assembly "add dword ptr [address]" increments the address instead of it's value 【发布时间】:2021-08-23 02:18:43 【问题描述】:

我正在尝试使用内联汇编增加 DWORD iNumAddr 存储的地址的值,我注意到它增加了地址而不是它包含的值。例如。

->iNumAddr = 57D03390

->addstuff() 运行..

->iNumAddr = 57D033C2

地址是正确的,我已经测试过了。

void addstuff()

    _asm 
        add dword ptr [iNumAddr], 50
    

【问题讨论】:

您告诉我们 iNumAddr 是如何变化的,但这段代码正在调整 iLiczbaAddr。可以展示一下周围的代码吗? 在执行过程中任何东西都不可能改变符号的地址。例如在 C++ int32_t iLiczbaAddr 中,它的地址 &iLiczbaAddr 在整个进程的生命周期中是不变的。您肯定会更改全局变量iLiczbaAddr 的值。 (如果该值是一个指针,并且您想访问 指向的内存,那么您当然需要先将它加载到寄存器中并取消引用该指针。) 这正是dword ptr [variable] 所做的。它寻址variable 本身,而不是存储在variable 中的值所指向的内存位置。如果您想要后者,则需要将variable 加载到某个寄存器并使用dword ptr [<register>] @DavidWohlferd 抱歉,iLiczbaAddr 本来就是 ​​iNumAddr,只是因为我为了简单起见更改了变量名,所以在这篇文章中出现了错误。 @PeterCordes 问题是,这个 DWORD 是一个指针,我正在递增它存储的地址,而不是它自己的物理地址。 【参考方案1】:

如果在 C++ 等高级语言中声明变量DWORD iNumAddr,则汇编语言代码中的符号iNumAddr 采用高级语言的地址 的值语言变量iNumAddr。 (此地址通常由链接器分配。)

所以指令add dword ptr [iNumAddr], 50 将增加变量iNumAddr,而不是iNumAddr 指向的值。

需要两条指令来做你想做的事。例如:

mov ebx,[iNumAddr]
add dword ptr [ebx],50

【讨论】:

通常你会想选择一个像 EAX 这样被调用破坏的寄存器,所以 MSVC 可能不必保存/恢复它。但是,如果您完全使用 MSVC 内联汇编来完成这样的事情,那么效率显然不是您的首要目标。

以上是关于(C/C++) 内联汇编“add dword ptr [address]”增加地址而不是它的值的主要内容,如果未能解决你的问题,请参考以下文章

(C/C++) 内联汇编“add dword ptr [address]”增加地址而不是它的值

C/C++ 中的简单“Hello World”内联汇编语言程序

高级CGNU C/C++ 内联汇编——实例参考

高级CGNU C/C++ 内联汇编——实例参考

高级CGNU C/C++ 内联汇编——入门级

高级CGNU C/C++ 内联汇编——补充介绍