【发布时间】: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 是一个指针,我正在递增它存储的地址,而不是它自己的物理地址。
标签: c++ visual-c++ inline-assembly