为什么在 MSVC 中使用 QWORD 会出现“无效操作数类型”错误?

问题描述 投票:0回答:1

我正在学习基本的内联汇编以实现自我利益,并且正在尝试定义一些加载到内存中的指令。在弄清楚如何使用

mov [size] ptr [Memory]
行将字节(定义为 char)数组传输到不同大小的变量后,我做了一些测试运行。
byte ptr
word ptr
dword ptr
效果很好。然而,加载 qword 或
QWORD ptr
的汇编代码总是给我一个错误,提示
"invalid operand type"
。这是为什么?

这是我的宏定义:

//x86, MSVC, Visual Studio.
typedef signed char byte;
#pragma region Instructions
// ldb - load byte
#define ldb(reg, mem) __asm { \
    __asm mov al, byte ptr mem \
    __asm mov reg, al \
}
// ldw - load word
#define ldw(reg, mem) __asm { \
    __asm mov ax, WORD PTR mem \
    __asm mov reg, ax \
}
// ldq - load double
#define ldq(reg, mem) __asm { \
    __asm mov eax, DWORD PTR mem \
    __asm mov reg, eax \
}
// ldo - load quad
#define ldo(reg, mem) __asm { \
    __asm mov rax, QWORD PTR mem \
    __asm mov reg, rax \
}
#pragma endregion

这是我的测试代码:

int main() {
    byte test_memory[1000] = { 0 }; // don't worry about other 999 indexes.
    test_memory[0] = 0x12;;

    byte reg = 0;
    // load byte
    ldb(reg, test_memory[0]);
    printf("ldb: %x\n", reg); // prints 0x12
    // load word
    word reg2 = 0;
    ldw(reg2, test_memory[0]);
    printf("ldw: %x\n", reg); // prints 0x12
    // load double
    dword reg3 = 0;
    ldq(reg3, test_memory[0]); // prints 0x12
    printf("ldq: %x\n", reg);
    // load quad
    qword reg4 = 0;
    ldo(reg4, test_memory[0]); // error!!!
    printf("ldo: %x\n", reg);
    return 0;
}

如果我在这里缺少什么,任何帮助将不胜感激。

c visual-c++ masm inline-assembly
1个回答
0
投票

正如评论所说,我试图在 32 位环境中访问

rax
。哎呀!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.