如何在 MASM 中访问二维数组

Posted

技术标签:

【中文标题】如何在 MASM 中访问二维数组【英文标题】:How to access two dimmensional arrays in MASM 【发布时间】:2015-01-07 17:07:34 【问题描述】:

你能告诉我如何在 MASM 中访问两个维度数组吗?

C++ 代码:

int k = 0
    for (i = 0; i<5; ++i)
    
        if (k == text.length())break;
        for (j = 0; j<2; ++j)
        
            for (t = 0; t<26; ++t)
            
                if (text[k] == letters[t]) tab[i][j] = t; k++; break; 
            
        
    

MASM

mov al, [ebx]       ;ebx - begin of text array          
xor esi, esi        
for1:
cmp al, 00                  
je break_for1                   
mov j, 0        
for2:
mov t, 0                    
mov ecx, adrAlphabet        ;ecx - begin of letters array           
for3:               
;if (text[k] == letters[t]) tab[i][j] = t; k++; break; 
mov ah, [ecx]               
cmp ah, 00                      
je end_of_alphabet              
cmp al, 00                      
je end_of_text                  
cmp al, ah                          
jne not_equal
;here comes the problem
        mov edx, t                      
        mov [letters + (esi*4 + j)*4], edx
;   
inc k                           
inc ebx                         
jmp break_t                 
; end if
not_equal:
inc ecx                         
inc t                       
cmp t, 26                       
jne for3

break_t:
inc j                           
cmp j, 2                    
jne for2

inc esi                             
cmp esi, 5                      
jne for1

break_for1:
end

这只是我的代码的一部分,但我只想了解数组。 你能举一些例子我如何在 MASM 中使用 tab[i][j] 吗? 另一个问题是,如何修改 tab 数组的长度?简而言之:在程序开始时会计算 tab 大小,然后我想设置数组大小。

谢谢

【问题讨论】:

1) 将i乘以每行的元素数,加上j,再乘以每个元素的大小,最后加上数组的基地址。 2) 为数组动态分配内存。你如何做到这一点取决于你的目标操作系统。如果您正在编写 Windows 应用程序,请查找 HeapAlloc 【参考方案1】:

C++ 标准保证大小为[a][b] 的二维数组等同于大小为[a*b] 的单个一维数组。 您可以停止将其视为二维数组,而将其视为普通数组,只是一个连续的数据块。

也就是说,如果你想访问tab[i][j],它与访问tab+a*i+j完全一样

如果你知道a(我们数组中的行数)总是2、4或8,你可以直接使用形式的表达式

mov byte ptr [eax*8+ecx], someValue

其中 i 是 eax,j 是 ecx。

否则,您将不得不手动计算 i*a+j,使用 shift 或 imul 并将其用作数组的索引。

例如:

; Write 0 at tab[i][j]
; We use EDX because of how IMUL works
mov edx, i ; EDX = i
imul a ; EDX = i*a
add edx, j ; EDX = i*a+j
add edx, offset tab ; EDX = tab[i*a+j] = tab+i*a+j
mov byte ptr [edx], 0

【讨论】:

这个答案包含几个错误。从乘以行数到错误的程序集没有正确计算地址。

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

汇编语言中的二维数组

如何在AngularJS的二维数组中找到访问元素

c语言中如何通过二级指针来操作二维数组

如何在Java中访问二维数组

如何访问二维数组的元素?

如何使用指针表达式访问 C 中的二维数组的元素?