Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.