我目前正在测试使用x86汇编程序加速代码的各种方法。我以前能够访问1D阵列,但2D阵列似乎完全不同!
我正在使用两个for循环,我已经在汇编中创建并将'x'移入ECX寄存器并将'y'移入EDX寄存器。
我还使用以下方法将数组的有效地址加载到EBX中:
lea ebx,dword ptr [slimeTrail]
现在我要做的是使用循环隔离一个字符并使用以下命令将其移动到AL寄存器中:
movsx al,byte ptr [ebx + (ecx * sizeX) + edx]
其中sizeX是宽度。
然而,我得到的错误是
error C2404: 'edx' : illegal register in 'second operand'
和
error C2425: '*' : non-constant expression in 'second operand'
我已查看过英特尔手册,但似乎没有达到目标。我错过了一些基本的东西吗?
答案 0 :(得分:1)
您需要学习内存操作数的寻址。
在32位模式下,您通常只能使用以下某项作为单条指令中内存操作数的地址:
您的ebx + (ecx * sizeX) + edx
不属于上述情况。
如果sizeX
既不是1,2,4和8,则必须使用ecx
或mul
或其他等效操作(由imul
乘以ebx
几条说明)并将产品添加到edx
或mov al,byte ptr [ebx + edx]
,之后您可以movsx al, ...
。
顺便说一下,mov
毫无意义可能无效。一个简单的{{1}}即可。