Сборка: определить пустой 2D-массив 32 бит (синтаксис NASM + Intel)

Как мы можем определить пустой 2D-массив 251x256 для 32-битного кода в ассемблере?

У меня есть старый пример в 16-битном коде для сборки:

DataIn          byte    251 dup (256 dup (?))

Теперь я хотел бы объявить то же самое, но это будет работать для 32-битных архитектур для NASM.


person C-PROG    schedule 12.12.2016    source источник
comment
@JoseManuelAbarcaRodríguez Я делал это раньше, и это не работает должным образом. Я думаю, что ссылка, которую вы разместили, имеет только код в 16 битах.   -  person C-PROG    schedule 13.12.2016
comment
Я бы объявил array resb 16 и обращался к нему как к двумерному, например, как 4x4 (например) или 8x2.   -  person Jose Manuel Abarca Rodríguez    schedule 13.12.2016
comment
Это ваша вторая попытка, первая здесь. Вы пытались решить проблему? Какова структура памяти массива 251x256 байт? Сколько места 251 DUP(?) резервирует? а как же 251 DUP (256 DUP (?))? Можете ли вы сделать это с помощью директивы TIMES (как уже предлагалось)? Подсказка: Да   -  person Margaret Bloom    schedule 13.12.2016
comment
@JoseManuelAbarcaRodríguez Если я сделаю это в моем случае, я получу 64 256 значений в обычном массиве. Будет довольно сложно заставить все работать правильно. Но если я не найду ничего проще для реализации, я воспользуюсь вашим ответом. Так что спасибо тебе   -  person C-PROG    schedule 13.12.2016
comment
Это много памяти.   -  person Jose Manuel Abarca Rodríguez    schedule 13.12.2016
comment
@MargaretBloom В предыдущем вопросе я работал над тем, как определить входные файлы. И поскольку я решил эту проблему, я работаю над следующей. Как определить 2D-массив.... + Постараюсь учесть ваш намек. Так что спасибо за помощь... Я пытаюсь научиться всему. Но я никогда раньше не работал со сборкой, поэтому сейчас работаю над огромным проектом и стараюсь учиться как можно быстрее.   -  person C-PROG    schedule 13.12.2016
comment
@ io16 В сборке нет ни обычных массивов, ни массивов. Просто буферы. Вы должны проверить, как 2D-массивы расположены в памяти, т.е. как непрерывная последовательность байтов. 64'256 - правильный размер, если нет отступов (а их не должно быть).   -  person Margaret Bloom    schedule 13.12.2016


Ответы (2)


Вы можете объявить одномерный массив и получить к нему доступ как к двумерному, вычислив смещение каждой строки и добавив столбец. В вашем случае ваш массив состоит из 251 строки и 256 столбцов, поэтому вы можете умножить 256 на нужную строку и добавить столбец, например:

section .data
    array  resb  251*256  ;251 ROWS X 256 COLUMNS.
_start:
    mov eax,256     ;ROW SIZE (256 COLUMNS PER ROW).
    mov ebx,35      ;DESIRED ROW (35).
    mul ebx         ;EAX * EBX = 8960.

    mov esi,array   ;POINT TO ARRAY.
    add esi,eax     ;POINT TO DESIRED ROW (35).
    add esi,20      ;POINT TO DESIRED COLUMN (20).

Это для типа byte, для больших типов нужно будет умножать на размер (на 2, на 4 и т.д.).

person Jose Manuel Abarca Rodríguez    schedule 12.12.2016

Из всей помощи в комментариях я думаю, что понял это.

<сильный>1. В сборке нет таких вещей, как 2D-массивы

2 4 6 
3 6 9 
7 8 9 

Расположены в памяти так: 2 4 6 3 6 9 7 8 9

<сильный>2. Таким образом, единственный способ создать «двумерный» массив — это импровизировать.

<сильный>3. Мы можем сохранить 2 счетчика, которые будут отслеживать наш импровизированный 2D-массив.

<сильный>4. Таким образом, для каждых 3 чисел мы будем увеличивать счетчик строк и «переезжать» на следующий импровизированный ряд.

person C-PROG    schedule 12.12.2016