Я был бы очень впечатлен процессором, обеспечивающим семантику поиска массива на его языке ассемблера. Или, скорее, я был бы раздражен, если бы это означало, что было принесено в жертву что-то более важное.
Общий способ поиска массива в сборке заключается в том, чтобы самостоятельно выполнить вычисление, чтобы превратить два индекса для двумерного массива в один индекс для одномерного массива и настроить размер элемента. Например (псевдокод):
ax = cx * major_dimension
ax = ax + dx
ax = ax * element_size
ax = peek[base+ax]
, где major_dimension
- это одно из измерений двумерного массива (используемое вами измерение полностью зависит от того, как данные располагаются в памяти), element_size
- это размер каждого элемента, base
- начало. массива, а cx / dx - индексы, которые вы используете для доступа к массиву.
Например, если у вас есть массив размером 3 на 4 (a[0-2][0-3]
) в ячейке памяти 0x0700
и это 32-разрядные целые числа:
+--------+--------+--------+--------+
0x0700: | a[0,0] | a[0,1] | a[0,2] | a[0,3] |
+--------+--------+--------+--------+
0x0710: | a[1,0] | a[1,1] | a[1,2] | a[1,3] |
+--------+--------+--------+--------+
0x0720: | a[2,0] | a[2,1] | a[2,2] | a[2,3] |
+--------+--------+--------+--------+
Чтобы найти элемент массива a[n,m]
, вы вычисляете главный индекс, умноженный на четыре, плюс младший индекс, масштабируете его до правильного размера элемента (4 байта) и затем добавляете основание. Найти элемент a[2,1]
addr = base + (n * 4 + m) * 4
= 0x0700 + (2 * 4 + 1) * 4
= 0x0700 + (8 + 1) * 4
= 0x0700 + (9 ) * 4
= 0x0700 + 36
= 0x0700 + 0x24
= 0x0724
Тогда это адрес, который вы используете для поиска 1D массива.
И, исходя из комментария, что:
ar db 3dup(3dup(0))
mov ar[bx][si],al
будет работать, это не совсем верно (ar[bx][si]
- это синтаксис, зависящий от массы, эквивалентный ar[bx+si]
).
Все, что нужно сделать, - это просто добавить адрес ar
с регистрами bx
и si
. не масштабирует регистр bx
или si
, чтобы учесть основное измерение, и не масштабирует значение bx+si
для размера элемента. Таким образом, он будет работать только как есть для двумерного массива байтов , где основной размер равен 1, что, я уверен, сделает его массивом 1D: -)
Чтобы работать в любом случае, вам сначала нужно умножить bx
или si
(в зависимости от того, что используется для основного измерения) на основное измерение, а затем bx
и si
на элемент размер.