x86 MASM - 传递和访问二维数组

Posted

技术标签:

【中文标题】x86 MASM - 传递和访问二维数组【英文标题】:x86 MASM - passing and accessing a 2D array 【发布时间】:2016-12-04 19:37:21 【问题描述】:

我目前正在为我的大学做组装项目。 目标是用 C/C++ 和 asm 编写完全相同的应用程序。 使用 C++ 的部分很简单。 当我想在 asm 中访问 2D 数组时,问题就开始了,而在这种情况下互联网非常稀缺。

在我的应用程序的主要部分中,我有:

extern "C" int _stdcall initializeLevMatrix(unsigned int** x, DWORD y, DWORD z);

还有我的 asm 函数:

initializeLevMatrix PROC levTab: PTR DWORD, len1: DWORD, len2: DWORD
  xor eax, eax
  mov DWORD PTR [levTab], eax ; I want to pass 0 to the first element
  mov ebx, eax
  mov ecx, len1
init1:
  cmp eax, ecx ; compare length of a row with a counter
  jge init2 ; jump if greater or the same
  inc eax ; increment counter
  mov ebx, eax ; index
  imul ebx, ecx ; multiply the index and the length of a row
  imul ebx, 4 ; multiply by the DWORD size
  mov DWORD PTR [levTab + ebx], eax ; move the value to a proper cell
  jmp init1
init2:
  ret
initializeLevMatrix ENDP

该功能不完整,因为我决定在进一步构建之前修复当前问题。

问题是我无法获取或设置值。 该函数应按如下方式初始化矩阵:

levTab[0][0..n] = 0..n

但我猜我糟糕的索引是错误的,或者我传递参数的方式是错误的。

非常感谢您的帮助。

【问题讨论】:

你不使用 len2。这个矩阵是正方形的吗? 正如我所提到的,我还没有完成我的功能。 len2 参数将在稍后使用。我只想初始化第一行,但我不知道该怎么做。 对于初学者来说,mov DWORD PTR [levTab], eax 毫无意义。它会将NULL 写入levTab,这应该是您指向数组的输入指针? PS:评论你的代码,特别是如果你希望别人帮助,并学习使用调试器,这样你就可以修复自己的错误。 小丑,你是对的。我应该放一些cmets。我刚刚添加了它们。我只想知道如何正确地穿过二维数组。 【参考方案1】:

根据您的评论“我只想初始化第一行”,将 len1 视为 一行的长度 就像您所写的那样是不正确的该程序。它被视为每列中的元素数。

首先将指针指向寄存器中的矩阵。我建议EDI:

mov  edi, levTab
xor  eax, eax
mov  [edi], eax           ; I want to pass 0 to the first element

使用缩放索引寻址

mov  ebx, eax             ; index
imul ebx, ecx             ; multiply the index and the length of a column
mov  [edi + ebx * 4], eax ; move the value to a proper cell

【讨论】:

以上是关于x86 MASM - 传递和访问二维数组的主要内容,如果未能解决你的问题,请参考以下文章

运行循环时 MASM x86 访问冲突

C语言函数传递二维数组

将二维双数组从 C# 传递到 C++ 函数

在 Assembly x86 MASM 中连接字符串和数组的大小

优化 CUDA 二维数组访问

二维数组地址传递的问题,求帮助~