assembly 我正在尝试找出Visual Studio编译器生成的一些汇编语言代码

oxalkeyp  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(128)

我正在尝试找出我接手的一个旧C++项目的调试版本生成的一些汇编代码。Windows-10 Visual Studio 2019。
我有一个方法调用,看起来像这样:

P2PRespMsg::P2PRespMsg(int port, const char * address, L3Obj* rcv_pro, 
                       fn_process fnprocess)
                      : NEDSMsg(port, address, rcv_pro, fnprocess)

这是生成的汇编代码

00007FF68DE89ACB  lea         rax,[rsp+30h]  
00007FF68DE89AD0  mov         rdi,rax  
00007FF68DE89AD3  mov         rsi,qword ptr [&fnprocess]            <=== move the fnprocess pointer into register rsi
00007FF68DE89ADB  mov         ecx,18h  
00007FF68DE89AE0  rep movs    byte ptr [rdi],byte ptr [rsi]             <=== what is this moving. This is the line that overwrites memory
00007FF68DE89AE2  mov         dword ptr [rsp+28h],0  
00007FF68DE89AEA  lea         rax,[rsp+30h]                     
00007FF68DE89AEF  mov         qword ptr [rsp+20h],rax               <=== fnprocess
00007FF68DE89AF4  mov         r9,qword ptr [rcv_pro]                <=== move rcv_pro pointer to register r9
00007FF68DE89AFC  mov         r8,qword ptr [address]                <=== move [address] pointer to register r9 
00007FF68DE89B04  mov         edx,dword ptr [port]                  <=== move port to register edx
00007FF68DE89B08  mov         rcx,qword ptr [this]
00007FF68DE89B0D  call        NEDSMsg::NEDSMsg (07FF68CD53F60h)

注解是我的。问题是"movs rep"行正在覆盖内存--来自不同类的本地数据成员。我可以看出它正在将18hex(24十进制)字节从一个位置移动到另一个位置,但它到底在移动什么?我假设它正在移动与函数指针fnprocess相关的东西,但移动什么?移动到哪里?
任何帮助都将不胜感激。谢谢。
更新:NEDSMsg定义为
NEDSMsg类:公共消息,虚拟公共NEDSMsgGroup
NEDSMsg的构造函数被声明为NEDSMsg(int端口,常量字符 * 地址= 0,L3Obj * rcv_pro = 0,fn_process fnprocess = 0);

fbcarpbf

fbcarpbf1#

玛格丽特·布鲁姆的回答确实帮了大忙,但我不知道如何将其视为答案。
原来这是一个转移注意力的方法,我的覆盖发生在其他地方,我以为它在这段代码中,因为这段代码重用了被覆盖变量的另一个示例所使用的内存。

相关问题