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"} }?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #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 - по подробней-бы.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 24-04-2005 07:10 » |
|
- BL и BH - это размерность массива (или нет?)
это регистры
|
|
|
Записан
|
|
|
|
mycatismurzik
Гость
|
|
« Ответ #13 : 25-04-2005 12:13 » |
|
Глубокоуважаемый Алексей1153! Я знаю, что такое BL и BH! Меня интересует что в этих регистрах хранится (в приведенном коде).
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #14 : 30-04-2005 00:39 » |
|
mycatismurzik, угу - массив [M][N] по С-шному. Чувствую, что без чтения datasheet-а по нужному процу дело с места не тронется.
|
|
« Последнее редактирование: 30-04-2005 00:41 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|