Доступ к элементам массива
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