使用x86 Assembler访问2D数组

时间:2013-02-05 10:44:29

标签: c++ assembly x86

我目前正在测试使用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'

我已查看过英特尔手册,但似乎没有达到目标。我错过了一些基本的东西吗?

1 个答案:

答案 0 :(得分:1)

您需要学习内存操作数的寻址。

在32位模式下,您通常只能使用以下某项作为单条指令中内存操作数的地址:

  • 注册
  • 位移(常数)
  • 注册+置换
  • register1 + register2 * scale + displacement(scale是常数:1,2,4或8)

您的ebx + (ecx * sizeX) + edx不属于上述情况。

如果sizeX既不是1,2,4和8,则必须使用ecxmul或其他等效操作(由imul乘以ebx几条说明)并将产品添加到edxmov al,byte ptr [ebx + edx],之后您可以movsx al, ...

顺便说一下,mov毫无意义可能无效。一个简单的{{1}}即可。