c++ - 使用 x86 汇编程序访问二维数组

标签 c++ assembly x86

我目前正在测试使用 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,您必须使用 mulecx 乘以它imul 或其他一些等效操作(由几条指令组成)并将乘积添加到 ebxedx 之后,您可以执行 mov al,字节指针 [ebx + edx].

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

关于c++ - 使用 x86 汇编程序访问二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705634/

相关文章:

表示单继承的 C++ 数据结构

c++ - MSVC下的奇优化问题

assembly - 为什么我的汇编程序无法运行?

c - 任务: Rewrite X86-assembler program in C

c - 用汇编语言解释这一行?

c++ - 在 C++ 中显示图像

c++ - Direct2D - 如何使用位图进行 Gamma 校正透明度 (alpha)

c++ qsort错误与指向函数的指针(比较)

c++ - 当 2 个线程共享同一个物理内核时,具有错误共享的 volatile 增量在发布时比在调试时运行得更慢

x86 - MSI-X 如何触发中断处理程序?是否需要轮询选择的内存地址?