assembly 在Windows 64位中,如何将.asm文件中的寄存器值“放入”C++变量中?

agxfikkp  于 2022-11-30  发布在  Windows
关注(0)|答案(1)|浏览(122)

我的目标是把一个寄存器的值从asm代码/文件放到我的c++代码的变量中。我的问题是,我可以用32位的内联汇编很好地做到这一点,但是,如果我正确地理解了64位的程序没有办法使用内联asm文件,它甚至可能吗?我理解asm文件不知道MyVal是什么,但是我怎么把这两个“联系”起来呢?

This is my c++ file:
#include <iostream>
extern "C" int myAsm();
int myVal = 0;

int main()
{
    myAsm();
    std::cout << "MyVal is: " << myVal << std::endl;
    getchar();
    return 0;
}

This is my .asm file:

.code
myAsm proc
    mov myVal, eax
    ret
myAsm endp
end

EDIT:实施建议后的错误截图:

wn9m85ua

wn9m85ua1#

这是完整的解决方案,感谢评论的人。(我不能马上接受我自己的答案,因为2天的延迟。)如何在Visual Studio 2022社区中重新创建:

  • 新项目=〉C++控制台应用程序
  • 右键单击项目名称=〉构建依赖关系=〉构建定制=〉勾选名为:masm(.targets,.props)=〉单击确定。
  • 右键单击项目名称=〉添加=〉新项=〉C++文件=〉但将文件扩展名设置为.asm而不是.cpp
  • 将项目设置为Release和64位。
  • 如下所示设置文件
  • 按Ctrl + F5启动而不进行调试。(除了C++控制台应用程序项目的默认构建选项外,我没有更改任何其他构建选项)。

C++文件:

#include <iostream>
#include <Windows.h>

extern "C" int myAsm();
extern "C" long myVal = 0;

int main()
{
    myAsm();
    std::cout << "MyVal is: " << myVal << std::endl;
    getchar();
    return 0;
}

asm文件:

EXTERN myVal: dword

.code
myAsm proc
    mov eax, 1234
    mov myVal, eax
    ret
myAsm endp
end

结果:

相关问题