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

发布于 2024-12-29 09:03:20 字数 458 浏览 2 评论 0原文

我有以下内容

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] 值

I have the following

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
    }
}

You can tell that both MOV's generate the error C2415: improper operand type.

As you can see what I want to do is store [ESI+0x77C]'s value into myJohn.oldA

Then I want to replace the same [ESI+0x77C]'s value with myJohn.A

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜巴黎 2025-01-05 09:03:21

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
    }
}

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

There is no memory/memory operand for MOV instruction. You should use a register for such usages. This is something like that:

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
    }
}

BTW, I really suspect that you really have to deal with segment registers under modern OSes (due to virtual memory, i.e. you can use direct addresses). You should check your code after above changes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文