如何在 MASM 中访问二维数组
How to access two dimmensional arrays in MASM
你能告诉我如何在 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 大小,然后我想设置数组大小。
谢谢
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
,使用 shifts 或 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 中访问两个维数组吗?
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 大小,然后我想设置数组大小。
谢谢
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
,使用 shifts 或 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