КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Двумерные массивы
Масштабирование эффективно только, когда размерность элементов массива равна 2, 4 или 8 байтам. Если же размерность элементов другая, то организовывать обращение к элементам массива нужно обычным способом. Пример 7: Обработка массива элементов с нечетной длиной. Размер элемента массива в три байта. Массив сформировать самостоятельно, следующим образом: первый элемент массива равен Е3 1111h=14 881 041d, все последующие трёхбайтные элементы массива равны inc(E3 1111h). В памяти сформировать массив из 16 трёхбайтных элемента. Увеличить на единицу в каждом элементе массива значение первого байта. Вывести измененный массив на экран в одну строку. Примечание: Е4 1111h=14 946 577d. ;--------------------------------------------------------------------------- ; Версия для Win32 (tri.asm) .386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db 'Massiv',0h mas db 16 dup (3 dup (0)); 48 элементов в массиве ; следующую строчку 2 байта 0ah,0dh mes1 db 'Massiv: ',0ah,0dh Msg db 150 dup (?)
masVivod db 85 dup (?); var dd 0E31111h var2 dd? var3 dd 00000000h i db 1 N db 16 tabl db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h k dd 0
.code start: xor ecx,ecx;обнуление есx xor edx,edx mov cl,N;значение счетчика цикла в cl mov esi, 0;индекс начального элемента в si ;------------------------------------------------------------------------------------------------- ; Заполнение элементов массива значениями var E31111h++ mov eax,var mov var2,eax go2: xor eax,eax mov al,byte ptr [var+2]; al=E3h mov mas[esi],al inc esi mov al,byte ptr [var+1]; al=11h mov mas[esi],al inc esi mov al,byte ptr [var]; al=11h mov mas[esi],al inc esi inc var loopnz go2
;-------------------------------------------------------------------------------------------- ; Изменение первого байта в каждом элементе массива mov esi,0;0 в si xor ecx,ecx mov cl,N go: mov dl,mas[esi];первый байт поля в dl inc dl;увеличение dl на 1 (по условию) mov mas[esi],dl;заслать обратно в массив add esi,3;сдвиг на следующий элемент массива loop go;повтор цикла
mov cl,N mov edi,0 mov esi,0
go1: ;---------------------------------------------------------------------------- ; Переносим трёхбитное число из массива mas в регистр еах для перевода в ; десятичное число xor eax,eax xor ebx,ebx mov ah,mas[esi] mov al,mas[esi+1] mov bl,mas[esi+2] shl eax,8 add eax,ebx add esi,3 ;------------------------------------------------------------------------------- ; Перевод в десятичную систему исчисления трёхбайтного числа из eax и ; запись десятичного числа в память push esi mov ebx,eax xor eax,eax xor edx,edx xor edi,edi mov dl,i mov al,8 mul dl add eax,k mov edi,eax xor esi,esi mov esi,10 push edi mov eax,ebx lp2: xor edx,edx div esi xchg eax,edx add al,'0' mov byte ptr [Msg+edi],al xchg eax,edx dec edi or eax,eax jne lp2 ;------------------------------------------------------------------------------------- ; Ставим символ ";" в качестве разделителя после каждого числа pop edi mov byte ptr [Msg+edi+1],';' inc i inc k pop esi loopnz go1 ;--------------------------------------------------------------------------------------- ;вывод на экран получившегося массива push 0h push offset Ttl push offset [Msg+1] push 0h call MessageBoxA push 0h call ExitProcess end start
Результат: _______________________________________________________________ Самостоятельно на практике: Создать массив с элементами нечетной длины. Размер элемента массива в три байта. Массив сформировать самостоятельно, следующим образом: первый элемент массива равен Е3 1111h=14 881 041d, все последующие трёхбайтные элементы массива равны inc(E3 1111h). В памяти сформировать массив из 16 трёхбайтных элемента. Увеличить на единицу в каждом элементе массива значение второго байта. Вывести измененный массив на экран построчно так, чтобы в строке было 4 элемента массива.
Обращение к элементам двумерного массива в памяти как к строкам или как к столбцам зависит от алгоритма обработки двумерного массива. Если последовательность однотипных элементов в памяти трактуется как двумерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле: (база + количество_элементов_в_строке * размер_элемента * i+ +j* размер_элемента)
Здесь i = 0...n-l указывает номер строки, a j = 0...m-l указывает номер столбца. Например, пусть имеется массив чисел (размером в 1 байт) mas(i,j) с размерностью 4 X 4 (i = 0...3, j = 0...3):
Дата добавления: 2014-01-07; Просмотров: 358; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |