我正在学习基本的内联汇编,并尝试定义一些加载内存的指令。在弄清楚如何使用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;
}
如果有什么我错过了这里,任何帮助将是非常感谢。
1条答案
按热度按时间j0pj023g1#
正如评论所说,我试图在32位环境中访问
rax
。哎呀!