Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_Lab_1.doc
Скачиваний:
3
Добавлен:
18.08.2019
Размер:
361.47 Кб
Скачать

Лабораторная работа №6 процедуры. Табличная трансляция. Перевод двоичных данных в символьную форму Теоретические сведения

Процедуры. Процедурой в ассемблере называют участок программы, управление которому передается при помощи команды CALL, а выход из которого осуществляется командой RET. Использование процедур преследует две основные цели: во-первых, уменьшение объема программы путем повторного использования ее частей, и, во-вторых, облегчение разработки программы за счет разбиения общей задачи программы на подзадачи и решения каждой из подзадач по отдельности.

В языке ассемблера имеются директивы PROC и ENDP, облегчающие оформление процедур. Перед каждой из них указывается имя процедуры (назначаемое произвольно):

name PROC [near │ far]

... ; тело процедуры

name ENDP

Имя (в примере — name) играет роль адреса процедуры (эквивалентно метке первой команды процедуры) и используется при ее вызове. Имя указывается в качестве операнда команды CALL. Эта команда помещает в стек адрес следующей за ней команды (этот адрес содержится в регистре IP и представляет собой адрес возврата), а затем передает управление процедуре по указанному адресу (загружает адрес в IP). Возврат из процедуры, как уже отмечалось, осуществляется командой RET, которая забирает из стека адрес возврата и передает по нему управление (загружает в IP).

; Процедура Name

name PROC

... ; тело процедуры

ret ; возврат из ближней процедуры

name ENDP

; Основная программа

...

call name ; вызов ближней процедуры

...

Процедура может быть описана как до, так и после вызывающей программы и может быть расположена как в том же сегменте (ближняя процедура — описатель near), так и в другом (дальняя процедура — far). В последнем (более редком) случае команда CALL помещает в стек полный адрес возврата (два слова — текущие CS:IP) и загружает в CS:IP полный адрес процедуры, а команда RET считывает из стека двухсловный адрес возврата и помещает в CS:IP. Ассемблер при трансляции использует эти варианты команд CALL и RET в том случае, если процедура и, возможно, ее вызов оформлены с помощью описателя far как дальние. Если же описатель не указан, по умолчанию принимается near.

(В виде процедур часто оформляются участки программы, выполняющие какие-либо служебные, вспомогательные задачи и управление которым передается неоднократно. Главная часть программы, тем не менее, тоже может быть оформлена с помощью директив PROC и ENDP. Однако, так как передача управления главной процедуре будет осуществляться не командой CALL, вместо команды RET необходимо вызвать функцию DOS завершения программы. Имя главной процедуры можно использовать при указании точки входа в директиве конца программы END.)

Перевод чисел в символьную форму 16-ричной системы. При создании самых разнообразных программных продуктов часто требуется выводить на экран какие-либо числа. При этом возникает необходимость преобразования этих чисел из внутреннего двоичного формата, в котором они обрабатываются ЭВМ, в символьный, в котором они могут быть отображены на экране. Для представления чисел используются различные системы счисления. Для человека привычна десятичная система. Однако при выводе содержимого ячеек оперативной памяти, адресов и других системных значений чаще используется 16-ричная система счисления, так как ее использование в этом случае более естественно. Кроме того, преобразование в 16-ричную систему осуществляется проще, чем в десятичную.

Перевод чисел из двоичной системы счисления в 16-ричную осуществляется следующим образом: разряды двоичного числа группируются по 4, начиная с младшего, после чего каждая четверка разрядов (тетрада) преобразуется в соответствующую 16-ричную цифру (в нашем случае — в ASCII-код этой цифры).

В процессоре 8086 нет средств обращения к четверкам битов, минимальной ячейкой оперативной памяти, к которой он имеет доступ, является байт. Поэтому необходимо каждую тетраду расширить до байта и лишь затем преобразовывать результат в ASCII-код.

Для выделения значений отдельных битов двоичного числа применяется операция логического умножения (AND) по маске. Например, для выделения второй по старшинству тетрады двоичного слова (предположим, регистра АХ) используется маска 0F0h, например:

AND

AND

1010 1011 1100 1101b = ABCDh (исходное число в АХ)

0000 0000 1111 0000b = 00F0h (маска)

0000 0000 1100 0000b = 00С0h (результат);

соответствующая ассемблерная команда:

and ax, 0F0h

Для сдвига совокупности битов относительно разрядной сетки используются команды логического сдвига (в частности, SHR — сдвиг вправо). Чтобы сдвинуть цифру С, полученную выше, можно использовать команду

shr ax, 4 ; сдвиг вправо на 4 разряда

После того, как тетрада подготовлена, необходимо преобразовать ее в ASCII‑код. Одним из методов является использование таблицы преобразования, содержащей ASCII-коды преобразуемых цифр. При этом номер ячейки таблицы, соответствующий одной цифре, заменяется значением данной ячейки — кодом цифры. Таблица преобразования (трансляции) оформляется в виде набора символов цифр, записанных в порядке возрастания:

tabl db '0123456789ABCDEF'

Для выборки значения из таблицы удобно использовать команду табличной трансляции XLAT (без операндов). Перед выполнением XLAT необходимо занести в регистры DS:BX полный адрес таблицы, а в AL — номер (n) ячейки таблицы. XLAT помещает в тот же регистр AL значение n-й ячейки таблицы, например:

lea bx, tabl

mov al, 9

xlat ; AL = '9' = 39h

Преобразованные цифры можно заносить в память или сразу выводить на экран.

При переводе в символьную форму чисел размером более одного байта, расположенных в памяти, необходимо учитывать их «перевернутое» хранение. Например, следующие друг за другом байты памяти со значениями 7Dh и 0A9h образуют словное число 0A97Dh. То же касается числовых форматов с размером разрядной сетки, не кратным восьми. Например, при использовании 12-битных (полуторабайтовых форматов) три следующих друг за другом байта со значениями 7Dh, 0A9h и 5Fh образуют два 12-битных числа 0A7Dh (младшее) и 5F9h (старшее)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]