我目前正在为我的大学做集会的项目 目标是在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
然而,我猜我糟糕的索引是错误的,或者我传递参数的方式是错误的。
非常感谢你的帮助。
答案 0 :(得分:3)
根据您的评论&#34;我只是想初始化第一行&#34;,将 len1 视为行的长度是不正确的< / em>和你一样写在程序中。它被视为每列中元素的数量。
首先将指针指向寄存器中的矩阵。我建议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