Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
После выполнения команды 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 (?); 10 элементов массива + 10 символов +переходы на ; следующую строчку 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 Mov esi,19 Mas[esi]; =30 4) Mov esi,6*2; 2 байта – размер элементов Mov ax, Mas[esi]; ax=01C8 Пусть эта последовательность чисел трактуется как одномерный массив. Размерность каждого элемента определяется директивой dw. В общем случае для получения адреса элемента в массиве необходимо начальный (базовый) адрес массива сложить с произведением индекса (номер элемента минус единица) этого элемента на размер элемента массива: база + (индекс*размер элемента)
|
||||
Последнее изменение этой страницы: 2016-09-13; просмотров: 309; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.254.229 (0.009 с.) |