x86汇编,将数据从数组移动到寄存器

时间:2017-05-04 05:22:08

标签: pointers assembly x86

我一遍又一遍地翻阅这本书,无法理解为什么这会给我“不正确的操作数类型”。它应该工作!

这是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位寄存器中?

1 个答案:

答案 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,提供了更精细地控制内联汇编和编译器生成代码之间交互的方法,这提供了极大的灵活性和功能,但是具有相当陡峭的学习曲线并且需要一切都很正确。