(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]”增加地址而不是它的值