Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Массивы vs masm  (Прочитано 21191 раз)
0 Пользователей и 1 Гость смотрят эту тему.
programmer
Гость
« : 10-08-2004 14:49 » 

Подскажите плз, как в masm можно создавать массивы? И главное - как объявлять инициализированные массивы?!
Т.е. в C я делаю так: int mas[] = {1, 2, 3, 4};
как-то же самое сделать в masm и возможно ли это вообще? Улыбаюсь

И второй вопрос: возможно ли в masm объявлять и работать с многомерными массивами? Т.е. опять та же аналогия с С:
int mas[2][2] = { {1, 1}, {2, 2}, {3, 3}, {4, 4} };
Записан
Xeysan
Гость
« Ответ #1 : 10-08-2004 19:02 » 

При программировании на языке ассемблера, нет такого понятия как массив, есть лишь данные в памяти, а как их интерпретировать - зависит от программиста.
1. Вратце так
Код:

bytes1  db  1, 2, 3, 4  ; создается массив из 4-х байт со значениями1,2,3,4
bytes2  db  3 dup) 0 :  ; создается массив из 3-х байт забитые нулями

вместо db может быть dw ) 2 : - word, dd - double word ) 4 : , etc
words1  dw  1, 2        ; массив из 2-х слов = четырех байт


2. Нет. Работаешь с двумерным как с набором одномерных.

А вообще, лучше почитать книгу, тем более там наверняка будут примеры использования.
Записан
programmer
Гость
« Ответ #2 : 10-08-2004 21:49 » 

Книжку я читал. Просто я спрашиваю из-за того, что встала такая проблема: существует некий GUI. Суть в том, что при переключении radio-кнопок в текстовых полях нужно выводить соответствующие значения. Т.е. нажимаю кнопку "1" - выводятся значения "1 2 3" и т.п. Мне показалось, что лучше всего будет реализовать это в виде многомерного массива, где на месте номера копки будет стоять соответствующая инфа, т.к. в последствии легче все это дело обновлять и изменять. Т.е. если кнопка номер 1, то и доступ к массиву такой: mas[1][1], mas[1][2] и т.д.

С числовыми массивами я понял. А что делать с текстом? Т.е. аналогия все с тем же С:
mas[2][2] = { {"abc", "abc"}, {"bcd", "bcd"}, {"cde", "cde"}, {"def", "def"} }? Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 11-08-2004 05:16 » 

Код:

mas
    db "abc","abc"
    db "bcd","bcd"
    db "cde","cde"
    db "def","def"


а дальше пишешь процедуру -"мини-драйвер" для своего массива
Записан

Хрюккиннен
Гость
« Ответ #4 : 12-08-2004 13:06 » 

Не пропрет, если строки должны быть разной длины
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 12-08-2004 13:26 » 

Именно! В С массивы строк на самом деле являются массивами указателей. Массив может состоять только из элементов одного размера.
Код:

; char * _array[2([2(=||"aaa","bbb"",|"ccc"",|"ddd""";
_str1_1   db "aaa",0
_str1_2   db "bbb",0
_str2_1   db "ccc",0
_str2_2   db "ddd",0
_array    dd offset _str_1_1,offset _str_1_2,offset _str_2_1,offset _str_2_2

; printf)_array[1([0(:;
  mov eax,[offset _array + 1*2 + 0(
  push eax
  call printf
  add esp,4
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
programmer
Гость
« Ответ #6 : 13-08-2004 11:16 » 

RXL, big RESPECT! Отлично  Теперь вроде бы все стало понятным. Еще раз всем спасибо за помощь Улыбаюсь
Записан
mycatismurzik
Гость
« Ответ #7 : 22-04-2005 21:39 » 

А как создать (объявить) массив, число элементов которого вводится с клавиатуры во время работы программы. Пробовал делать это следующим образом:
Код:
Matrix LABEL BYTE
REPT n
        DB 0
ENDM
где n-переменная (DB), указывающая число элементов массива.
При компиляции выводится сообщение об ошибке:
Expecting Scalar Type
Если вместо n явно указать число, например 10, то все работает.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 22-04-2005 22:36 » 

Данные в памяти могут быть статическими (размер и адрес определяется при компиляции), автоматическими (временное выделение на стеке и адресация через указатель) и динамическими (выделяется/освобождается менеджером памяти по запросу).
Первое - это то, что ты пытаешься сделать.

Есть обходной маневр: выделить статически, или еще как, блок максимального возможного размера (напр. одномерный байтовый массив переменного размера 1..100 - значит выделить 100 байт). Для структур данных фиксированного размера можно выделять блок sizeof()*N и адресовать через смещение блока + n*sizeof(). Для матрицы: sizeof()*N*M и offset+(n*M+m)*sizeof().

Кстати, "DB" - не переменная, а директива компилятора на выделение блока памяти в один байт по текущему адресу компиляции. Ничего, кроме как выделить фиксированное число байт, она не может.

« Последнее редактирование: 22-04-2005 22:46 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
mycatismurzik
Гость
« Ответ #9 : 22-04-2005 22:43 » 

Это все понятно, но не могли бы вы, уважаемый RXL, привести реально работающий кусок кода.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 22-04-2005 23:05 » 

Пример:
Код:
; IN:
; bl - M (1..255)
; bh - N (1..255)
; OUT:
; di - адрес выделенного массива
get_int_matrix:
    mov al,bh
    mul al,bl
    mov bx,2 ; sizeof(short int)
    mul ax,bx
    call malloc ; вызов библиотечной ф-ии выделения памяти
    ret

Что не понятно - спрашивай.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
mycatismurzik
Гость
« Ответ #11 : 22-04-2005 23:12 » 

Что-то до меня туго доходит:
 - BL и BH - это размерность массива (или нет?)
 - как обратится к массиву, по метке Get_Int_Matrix?
 - malloc - по подробней-бы.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 24-04-2005 07:10 » 

- BL и BH - это размерность массива (или нет?)

это регистры Улыбаюсь
Записан

mycatismurzik
Гость
« Ответ #13 : 25-04-2005 12:13 » 

Глубокоуважаемый Алексей1153! Отлично Я знаю, что такое BL и BH! Меня интересует что в этих регистрах хранится (в приведенном коде).
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 30-04-2005 00:39 » 

mycatismurzik, угу - массив [M][N] по С-шному.
Чувствую, что без чтения datasheet-а по нужному процу дело с места не тронется.
« Последнее редактирование: 30-04-2005 00:41 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines