КАТЕГОРИИ: Архитектура-(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) |
Доступ к элементам массива
Xlat Mov bx, offset htable Mov al,0Ch Code Data htable db "0123456789ABCDEF" …. После выполнения команды xlat, регистр AL будет содержать не число 0Сh, а ASCII-код буквы «С». Пример 3: Заполнить массив из 30-ти элементов размером в байт значениями индексов. Вывести массив на экран в одну строку, учитывая, что элементы массива максимум двухзначные числа.
.386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db 'Massiv',0h mas db 30 dup (?); 32 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh db 0ah mes1 db 'Massiv: ',0ah,0dh masVivod db 85 dup (?); 30 элементов массива + 30 символов +переходы на ; следующую строчку 2 байта 0ah,0dh i db 0 N db 30 tabl db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h .code start: xor ecx,ecx;обнуление есx xor edx,edx mov cl,N;значение счетчика цикла в cl mov esi, 0;индекс начального элемента в si ;------------------------------------------------------------------------------------------------- ; Заполнение элементов массива значениями их индексов go: mov bh,i mov mas[esi],bh inc esi inc i loopnz go ;-------------------------------------------------------------------------------------------------
mov cl,N mov edi,0 mov esi,0 ;------------------------------------------------------------------------------------------------- ; Проверяем число больше или равно 10, если «да», то уходим на метку met1 и ; выводим его как двузначное число. Если число меньше 10 (однозначное), ; то уходим на метку met2. go1:; цикл инициализации xor eax,eax mov al,mas[edi] cmp al,0ah jae met1 jmp met2 ;------------------------------------------------------------------------------------------------- ; Формируем двузначное число в массив masVivod. Делим его на 10, чтобы ; отделить первую цифру и получить одну цифру в остатке. Переводим первую ; цифру и остаток в ASCII код met1: mov bl,10 div bl mov ebx, offset tabl xlat mov masVivod[esi],al inc esi mov al,ah xlat mov masVivod[esi],al jmp met3 ;------------------------------------------------------------------------------------------------- ; Если число однозначное, то заменяем число на символ ; числа и записываем символ числа (ASCII код числа) в регистр al met2:
mov ebx, offset tabl xlat mov masVivod[esi],al ;------------------------------------------------------------------------------------------------- ; Ставим после числа символ «;» и наращиваем индексы met3: inc esi mov masVivod[esi],';' inc esi inc edi loopnz go1 mov masVivod[esi],0h ;вывод на экран получившегося массива push 0h push offset Ttl push offset mes1 push 0h call MessageBoxA push 0h call ExitProcess end start Результат: Пример 5: Вывести в одну строку все значения элементов массива, учитывая, что значения элементов массива могут быть трёхзначными и имеют размер в один байт. Значение элементов массива сформировать как i*k, i=k. .386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db 'Massiv',0h mas db 30 dup (?); 32 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh mes1 db 'Massiv: ',0ah,0dh masVivod db 85 dup (?); 10 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh i db 0 k db 0 N db 16; Максимальное значение элемента массива 15*15=225 tabl db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h .code start: xor ecx,ecx xor edx,edx mov cl,N mov esi, 0
go: mov bl,i mov al,k mul bl mov mas[esi],al inc esi inc i inc k loopnz go
mov cl,N mov edi,0 mov esi,0 ; ---------------------------------------------------------------------------------------------- ; Проверяем число. Если оно однозначное, то уходим на метку met2. Если число ; двухзначное, то уходим на метку met1. Если число трёхзначное, то продолжаем ; выполнять код программы. go1: xor eax,eax mov al,mas[edi] cmp al,0ah jb met2 cmp al,64h jb met1
; Если число трёхзначное, то делим его на 10, чтобы ; получить две первых цифры числа и остаток. Заносим в регистр целую часть от деления ; а остаток переводим в ASCII код. Оставшиеся две цифры числа (целую часть от ; деления) сохраняем в регистре ah и переходим на метку met4.
mov bl,10 div bl mov ebx, offset tabl xchg al,ah xlat mov masVivod[esi+2],al mov al,ah xor ah,ah jmp met4 ; --------------------------------------------------------------------------------------------- ; Если число двухзначное, то делим его на 10, чтобы ; получить первую цифру числа и остаток. Заносим в память первую цифру и ; остаток.
met1: mov bl,10 div bl mov ebx, offset tabl xchg al,ah xlat mov masVivod[esi+1],al
mov al,ah xlat mov masVivod[esi],al inc esi jmp met3
met4: mov bl,10 div bl mov ebx, offset tabl xchg al,ah xlat mov masVivod[esi+1],al
mov al,ah xlat mov masVivod[esi],al inc esi inc esi jmp met3 ; ---------------------------------------------------------------------------------------------- ; Имеем однозначное число. Записываем ASCII код этого числа в память. met2: mov ebx, offset tabl xlat mov masVivod[esi],al ; ---------------------------------------------------------------------------------------------- ; Ставим после числа в памяти символ «;» в качестве разделителя. met3: inc esi mov masVivod[esi],';' inc esi inc edi
loop go1
mov masVivod[esi],0h ;------------------------------------------------------------ ;вывод на экран получившегося массива push 0h push offset Ttl push offset mes1 push 0h call MessageBoxA push 0h call ExitProcess end start Результат: _______________________________________________________________ Самостоятельно на практике: Вывести все значения элементов массива в несколько строк. В каждой строке должно быть по 5 элементов массива. Значения элементов массива могут быть трёхзначными размером в байт. Все элементы массива располагаются в памяти компьютера последовательно и то, как трактовать данную последовательность решает программист. Одну и ту же область памяти можно трактовать как одномерный массив, и одновременно те же самые данные могут трактоваться как двумерный массив. Все зависит только от алгоритма обработки этих данных в конкретной программе. Эти же соображения можно распространить и на индексы элементов массива. Наример, в программе статически определена последовательность данных: Mas dw 0,1,2,3,4,5,456,876,7,8752; 00 00 00 01 00 02 00 03 00 04 ; 00 05 01 С8 03 6С 00 07 22 30 Организовать доступ к предпоследнему байту можно следующим образом: 1) Mas[19]; =30 2) Mas[13h]; =C8
Дата добавления: 2014-01-07; Просмотров: 379; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |