C++ ASM Inline如何在ASM中使用struct成员?

标签 c++ data-structures assembly inline-assembly

我有以下内容

struct john {
    int oldA;
    int A;
} myJohn;
DWORD gotoAddressBack = 0x00401000;

void __declspec( naked ) test(void) {
    __asm {
        MOV myJohn.oldA, DWORD PTR DS:[ESI+0x77C]
        MOV DWORD PTR DS:[ESI+0x77C], myJohn.A
        JMP gotoAddressBack
    }
}

您可以看出这两个 MOV 都生成了错误 C2415:不正确的操作数类型。

如您所见,我想做的是将 [ESI+0x77C] 的值存储到 myJohn.oldA 中

然后我想用 myJohn.A 替换相同的 [ESI+0x77C] 的值

最佳答案

MOV 指令没有内存/内存操作数。您应该为此类用法使用寄存器。这是这样的:

void __declspec( naked ) test(void) {
    __asm {
        MOV EAX, DWORD PTR [ESI+0x77C]
        MOV myJohn.oldA, EAX

        MOV EAX, myJohn.A
        MOV DWORD PTR [ESI+0x77C], EAX

        JMP gotoAddressBack
    }
}

顺便说一句,我真的怀疑你真的必须在现代操作系统下处理段寄存器(由于虚拟内存,即你可以使用直接地址)。您应该在进行上述更改后检查您的代码。

关于C++ ASM Inline如何在ASM中使用struct成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9001177/

相关文章:

c++ - 模板类在非参数化构造函数上抛出错误

c++ - 如何编写具有超过 2 层继承的奇怪重复模板?

python - 使用 numpy cumsum 计算求和面积表的 3D 变体

c - 堆栈、数据和指令段在哪里实现?

assembly - 无法理解 Kip Irvine 的汇编语言书中的存储分配

C++ 预处理器 : avoid code repetition of member variable list

c++ - 模板实例化期间第二遍名称查找的静态命名空间与匿名命名空间的差异

c++ - 我应该使用什么样的数据结构来实现 UPGMA?

python - 堆和负数的奇怪行为

assembly - 切换到保护模式并进行远跳转后出错