64位Windows下如何将汇编文件寄存器值存入C++变量?
64位环境下汇编与C++变量关联问题解决
问题说明
原本在32位环境中可以通过内联汇编将寄存器值存入C全局变量,但64位程序无法使用内联汇编,尝试用独立汇编文件实现时,因汇编代码未识别C中的myVal变量导致编译报错。
错误原因
汇编文件中未声明myVal为外部符号,汇编器无法找到该变量的定义;同时未明确变量类型,导致地址解析失败。
修正方案
1. 修改汇编文件(MASM语法,适配MSVC 64位编译)
在汇编开头添加外部变量声明,明确myVal的类型,示例代码如下:
; 声明myVal是外部模块中定义的DWORD类型变量 EXTERN myVal:DWORD .code myAsm proc mov eax, 0x1234 ; 可自定义eax的测试值,用于验证 mov myVal, eax ; 将eax的值写入C++全局变量myVal ret myAsm endp end
2. C++代码保持不变
#include <iostream> extern "C" int myAsm(); int myVal = 0; int main() { myAsm(); std::cout << "MyVal is: " << myVal << std::endl; getchar(); return 0; }
3. 编译链接步骤(MSVC环境)
- 用
ml64 /c your_asm_file.asm命令将汇编文件编译为64位目标文件(.obj) - 将C++代码编译为目标文件后,与汇编生成的.obj文件一起链接,生成可执行程序
关键说明
EXTERN关键字用于告诉汇编器:myVal变量在其他模块(C++编译后的目标文件)中定义,需要在链接阶段解析地址- 64位MSVC环境下,全局变量的访问可直接使用变量名,无需额外的内存寻址前缀
extern "C"用于避免C++的名字修饰,确保汇编中的myAsm函数能被正确调用
内容的提问来源于stack exchange,提问作者EncoderX
相关产品推荐
相关产品推荐

