Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

После выполнения команды xlat, регистр AL будет содержать не число 0Сh, а ASCII-код буквы «С».




Лекция №8. Массивы, структуры, записи, объединения

Пересылка данных с помощью команды xlat

 Команда: XLAT адрес XLATB
 Назначение: Трансляция в соответствии с таблицей

 

Помещает в AL байт из таблицы в памяти по адресу ES:BX (или ES:EBX) со смещением относительно начала таблицы, равным AL.

В качестве аргумента для XLAT в ассемблере можно указать имя таблицы, но эта информация никак не используется процессором и служит только как комментарий. Если этот комментарий не нужен, можно применить форму записи XLATB.

 

Пример: Преобразовать шестнадцатеричное число в ASCII-код соответствующего ему символа:

Data

htable db "0123456789ABCDEF"

Code

….

Mov al,0Ch

Mov bx, offset htable

Xlat

После выполнения команды 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 элементов массива. Значения элементов массива могут быть трёхзначными размером в байт.


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...