GNU Эмулятор, вызов подпрограмм
397.00K
Категория: ПрограммированиеПрограммирование

GNU Эмулятор, вызов подпрограмм

1. GNU Эмулятор, вызов подпрограмм

1
GNU Эмулятор, вызов подпрограмм
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
English     Русский Правила