我目前正在测试使用 x86 汇编程序加速我的代码的各种方法。我过去能够访问一维数组,但二维数组似乎完全不同!
我正在使用我在汇编中创建的两个 for 循环,并将“x”移动到 ECX 寄存器,将“y”移动到 EDX 寄存器。
我还使用这个将数组的有效地址加载到 EBX 中:
lea ebx,dword ptr [slimeTrail]
现在我想做的是使用循环来隔离一个字符并将其移动到 AL 寄存器中,方法是:
movsx al,byte ptr [ebx + (ecx * sizeX) + edx]
其中 sizeX 是宽度。
但是,我得到的错误是
错误 C2404:“edx”:“第二个操作数”中的非法寄存器
和
错误 C2425:“*”:“第二个操作数”中的非常量表达式
我已经查看了 Intel 手册,但似乎没有找到答案。我错过了一些基本的东西吗?
最佳答案
你需要学习内存操作数的寻址。
在 32 位模式下,您通常只能使用以下之一作为单个指令中内存操作数的地址:
- 注册
- 位移(常数)
- 注册+位移
- register1 + register2 * scale + displacement(scale是一个常数:1, 2, 4 or 8)
您的 ebx + (ecx * sizeX) + edx
不是以上两者。
如果 sizeX
不是 1、2、4 和 8,您必须使用 mul
或 将
或其他一些等效操作(由几条指令组成)并将乘积添加到 ecx
乘以它imulebx
或 edx
之后,您可以执行 mov al,字节指针 [ebx + edx]
.
顺便说一句,movsx al, ...
没有意义可能是无效的。一个简单的 mov
就可以了。
关于c++ - 使用 x86 汇编程序访问二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705634/