Similar presentations:
GNU Эмулятор, вызов подпрограмм
1. GNU Эмулятор, вызов подпрограмм
1GNU Эмулятор, вызов подпрограмм
1. Создание подпрограмм.
2. Передача кодов в подпрограмму.
3. Возврат результата.
2.
Вызов подпрограммПодпрограмма Процедура
2
3.
Вызов подпрограммПодпрограмма должна начинаться с
директивы ORG OFF.
Эта директива предписывает компилятору
ассемблера разместить код подпрограммы с
заданным смещением OFF от начала
адресного пространства RAM – оперативной
памяти.
Это смещение является адресом вызова
процедуры, который указывается в команде
CALL.
Подпрограмма должна заканчиваться
командой завершения работы RET.
3
4.
Вызов подпрограмм1. Выбирается команды вызова
подпрограммы CALL
2. В регистр IP загружается адрес первой
команды подпрограммы, который указан в
команде CALL.
3. В стек записывается ADDR – адрес
команды, которая следует за командой
CALL.
4. Выполняются команды процедуры.
5. После выполнения команды RET из стека в
регистр IP заносится значение ADDR и
работа программы продолжается.
4
5.
Передача кодов в подпрограммуДля организации взаимодействия
с подпрограммой можно
использовать регистры
процессора.
При этом определяют, какие
регистры процессора будут
хранить коды – исходные данные
для процедуры, а какой регистр
(регистры) будет хранить
результат работы подпрограммы.
5
6.
Сложение с помощью подпрограммыУпражнение №1, программа subsum.asm.
Требуется вычислить выражение K=A+B+C.
При A=2, B=3, C=4.
Для выполнения сложения
разработаем процедуру, которая по
расположена по адресу 30 от начала
оперативной памяти.
Процедура позволяет сложить два
числа.
Определим, что первое слагаемое
должно быть расположено в регистре
AL, второе слагаемое в регистре BL.
Результат сложения процедура должна
возвращать в регистре CL.
6
7.
Сложение, регистрыПервый вызов подпрограммы
Второй вызов подпрограммы
Подпрограмма
7
8.
Сохранение регистра состоянияПодпрограмма является автономным модулем
программы, поэтому перед выполнением команд
процедуры сохраняют состояние флагов
программы.
Это код, который находится в регистре SR. Для
сохранения флагов используют стек.
Сохранение выполняется вызовом команды
PUSHF.
Перед выполнением возврата подпрограммы
содержание SR восстанавливают командой POPF.
8
9.
Определения9
1. Откомпилируйте программу
и выполните ее в
пошаговом режиме до
завершения работы.
2. В регистре CL записан
результат работы
программы код 09
10.
Передача кодов через стек10
Организовать передачу кодов в
подпрограмму можно выполнить
через стек.
Занесение кодов – данных
для работы подпрограммы
в стек и ее вызов
11.
Коды и стекПосле выполнения команды RET в стеке останутся
коды – данные для подпрограммы.
Их обязательно нужно убрать из стека для
правильного его использования программой.
Для этого выполняют команду POP R.
R – регистр общего назначения
11
12.
Сложение, коды в стекеУпражнение №2. Программа передачи кодов через стек,
вычисления по упражнению №1
12
13.
Коды в стеке1. Выполните программу
в пошаговом режиме.
2. После завершения
работы программы в
регистре AL должен
быть код 09
3. Указатель стека
должен хранить адрес
его «дна» BF
13
14.
Дамп регистров и памяти14
Дамп – получения кодов в регистре процессора, либо в
ячейках оперативной памяти на консоли ЭВМ
Коды выводят в шестнадцатеричном формате
Для создания дампа используют таблицу трансляции.
Таблица трансляции – строка символов
шестнадцатеричных цифр: “0123456789ABCDEF”
T
‘0’
‘1’
‘2’
‘3’
‘4’
‘5’
‘7’
‘8’
‘9’
‘A’
‘B’
‘C’
‘D’
E
‘F’
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
Для получения адреса символа Ai цифры нужно к адресу начала
таблицы T прибавить смещение off к нужному символу
15.
Трансляция кодов в символыВыделить код в старшей части регистра:
R and F0
Сдвинуть старшие четыре бита регистра на место
младших четырех битов, получить off
Извлечь из таблицы трансляции символ цифры:
S=[T+off]
Вывести цифру на консоль
Получить цифру в младшей части регистра:
off= R and 0F
Извлечь символ цифры из таблицы трансляции и
вывести на консоль.
15
16.
Дамп регистра16
Упражнение №3. Выполните программу dumpreg. asm
Программа выводит дамп регистра AL.
Программа состоит из основной части и двух
подпрограмм:
Подпрограмма циклического сдвига битов
регистра AL на заданное число итераций в
регистре CL
Подпрограмма трансляции – выборки
символа из таблицы и помещения его в
регистр AL
17.
Программа получения дампаПерейти Начать
таблица "0123456789ABCDEF"
Начать:
AL <= 0F | Тестируемый код
AL
AL AND F0 | Выделить старшую часть
CL <= 4 | Счетчик сдвига
Вызов адрес 40 | Сдвиг старших бит
BL < = 02 | Адрес таблицы трансляции
Вызов адрес 50 | Код цифры - смещение
Адрес C1 <= AL | Символ на консоль
AL
AL AND 0F |Выделить младшую часть
BL < =02 | Адрес таблицы трансляции
Вызов адрес 50 | Код цифры - смещение
Адрес C2 <= AL | Символ на консоль
Стоп
17
18.
Программа получения дампаСмещение 40 | Подпрограмма сдвига
Выполнять:
Правый сдвиг AL
CL= CL - 1
Если Z = 0 то Выполнять
Завершить подпрограмму
Смещение 50 | Подпрограмма трансляции
BL = BL + AL
AL <= Адрес BL
Завершить подпрограмму
Конец
18
19.
Контрольное задание19
Дано выражение:
Z A2 B 2
Написать программу с
подпрограммами для
вычисления значения
выражения и вывода
результата в 16ричном
формате.
Передавать исходные
данные для вычисления
через регистры
процессора.
Контрольный
пример:
A=1010
B=310
Z=10910=6DH