我一遍又一遍地翻阅这本书,无法理解为什么这会给我“不正确的操作数类型”。它应该工作!
这是Visual Studio中的内联汇编。
function(unsigned int* a){
unsigned int num;
_asm {
mov eax, a //This stores address (start of the array) in eax
mov num, dword ptr [eax*4] //This is the line I am having issues with.
最后一行,我试图存储数组中的4字节值。但我得到错误C2415:操作数类型不正确
我做错了什么?如何将数组中的4字节值复制到32位寄存器中?
答案 0 :(得分:1)
在Visual C ++的内联汇编中,所有变量都作为内存操作数 1 进行访问;换句话说,无论你在哪里写num
,你都可以认为编译器会替换dword ptr[ebp - something]
。
现在,这意味着在上一个mov
中你有效地尝试执行内存mov
,这在x86上没有提供。改为使用临时寄存器:
mov eax, dword ptr [a] ; load value of 'a' (which is an address) in eax
mov eax, dword ptr [eax] ; dereference address, and load contents in eax
mov dword ptr [num], eax ; store value in 'num'
请注意,我删除了* 4,因为将指针乘以4并没有意义 - 也许您打算使用a
作为基数加上其他索引?
1 其他编译器,例如gcc,提供了更精细地控制内联汇编和编译器生成代码之间交互的方法,这提供了极大的灵活性和功能,但是具有相当陡峭的学习曲线并且需要一切都很正确。