0

我目前正在测试使用 x86 汇编器加速我的代码的各种方法。我过去能够访问一维数组,但二维数组似乎完全不同!

我正在使用我在汇编中创建的两个 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'

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

4

1 回答 1

1

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

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

  • 登记
  • 位移(常数)
  • 寄存器+位移
  • 寄存器 1 + 寄存器 2 * 比例 + 位移(比例是常数:1、2、4 或 8)

ebx + (ecx * sizeX) + edx的不是以上两种。

如果sizeX不是 1、2、4 和 8,则必须ecx使用mulorimul或其他等效操作(由多条指令组成)乘以它,然后将乘积添加到ebxoredx之后,您可以执行mov al,byte ptr [ebx + edx].

顺便说一句,movsx al, ...没有意义可能是无效的。一个简单的mov就可以了。

于 2013-02-05T11:10:50.620 回答