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

Содержание

Слайд 2

Вызов подпрограмм Подпрограмма ≡ Процедура

Вызов подпрограмм

Подпрограмма ≡ Процедура

Слайд 3

Вызов подпрограмм Подпрограмма должна начинаться с директивы ORG OFF. Эта директива

Вызов подпрограмм

Подпрограмма должна начинаться с директивы ORG OFF.
Эта директива предписывает

компилятору ассемблера разместить код подпрограммы с заданным смещением OFF от начала адресного пространства RAM – оперативной памяти.
Это смещение является адресом вызова процедуры, который указывается в команде CALL.
Подпрограмма должна заканчиваться командой завершения работы RET.
Слайд 4

Вызов подпрограмм Выбирается команды вызова подпрограммы CALL В регистр IP загружается

Вызов подпрограмм

Выбирается команды вызова подпрограммы CALL
В регистр IP загружается адрес первой

команды подпрограммы, который указан в команде CALL.
В стек записывается ADDR – адрес команды, которая следует за командой CALL.
Выполняются команды процедуры.
После выполнения команды RET из стека в регистр IP заносится значение ADDR и работа программы продолжается.
Слайд 5

Передача кодов в подпрограмму Для организации взаимодействия с подпрограммой можно использовать

Передача кодов в подпрограмму

Для организации взаимодействия с подпрограммой можно использовать регистры

процессора.
При этом определяют, какие регистры процессора будут хранить коды – исходные данные для процедуры, а какой регистр (регистры) будет хранить результат работы подпрограммы.
Слайд 6

Сложение с помощью подпрограммы Упражнение №1, программа subsum.asm. Требуется вычислить выражение

Сложение с помощью подпрограммы

Упражнение №1, программа subsum.asm. Требуется вычислить выражение K=A+B+C.

При A=2, B=3, C=4.
Для выполнения сложения разработаем процедуру, которая по расположена по адресу 30 от начала оперативной памяти.
Процедура позволяет сложить два числа.
Определим, что первое слагаемое должно быть расположено в регистре AL, второе слагаемое в регистре BL.
Результат сложения процедура должна возвращать в регистре CL.
Слайд 7

Сложение, регистры Первый вызов подпрограммы Второй вызов подпрограммы Подпрограмма

Сложение, регистры

Первый вызов подпрограммы

Второй вызов подпрограммы

Подпрограмма

Слайд 8

Сохранение регистра состояния Подпрограмма является автономным модулем программы, поэтому перед выполнением

Сохранение регистра состояния

Подпрограмма является автономным модулем программы, поэтому перед выполнением команд

процедуры сохраняют состояние флагов программы.
Это код, который находится в регистре SR. Для сохранения флагов используют стек.
Сохранение выполняется вызовом команды PUSHF.
Перед выполнением возврата подпрограммы содержание SR восстанавливают командой POPF.
Слайд 9

Определения Откомпилируйте программу и выполните ее в пошаговом режиме до завершения

Определения

Откомпилируйте программу и выполните ее в пошаговом режиме до завершения работы.
В

регистре CL записан результат работы программы код 09
Слайд 10

Передача кодов через стек Организовать передачу кодов в подпрограмму можно выполнить

Передача кодов через стек

Организовать передачу кодов в подпрограмму можно выполнить через

стек.

Занесение кодов – данных для работы подпрограммы в стек и ее вызов

Слайд 11

Коды и стек После выполнения команды RET в стеке останутся коды

Коды и стек

После выполнения команды RET в стеке останутся коды –

данные для подпрограммы.
Их обязательно нужно убрать из стека для правильного его использования программой.
Для этого выполняют команду POP R.
R – регистр общего назначения
Слайд 12

Сложение, коды в стеке Упражнение №2. Программа передачи кодов через стек, вычисления по упражнению №1

Сложение, коды в стеке

Упражнение №2. Программа передачи кодов через стек, вычисления

по упражнению №1
Слайд 13

Коды в стеке Выполните программу в пошаговом режиме. После завершения работы

Коды в стеке

Выполните программу в пошаговом режиме.
После завершения работы программы в

регистре AL должен быть код 09
Указатель стека должен хранить адрес его «дна» BF
Слайд 14

Дамп регистров и памяти Дамп – получения кодов в регистре процессора,

Дамп регистров и памяти

Дамп – получения кодов в регистре процессора, либо

в ячейках оперативной памяти на консоли ЭВМ
Коды выводят в шестнадцатеричном формате

Для создания дампа используют таблицу трансляции.
Таблица трансляции – строка символов шестнадцатеричных цифр: “0123456789ABCDEF”

Для получения адреса символа Ai цифры нужно к адресу начала таблицы T прибавить смещение off к нужному символу

T

Слайд 15

Трансляция кодов в символы Выделить код в старшей части регистра: R

Трансляция кодов в символы

Выделить код в старшей части регистра:
R and F0
Сдвинуть

старшие четыре бита регистра на место младших четырех битов, получить off
Извлечь из таблицы трансляции символ цифры:
S=[T+off]
Вывести цифру на консоль
Получить цифру в младшей части регистра:
off= R and 0F
Извлечь символ цифры из таблицы трансляции и вывести на консоль.
Слайд 16

Дамп регистра Упражнение №3. Выполните программу dumpreg. asm Программа выводит дамп

Дамп регистра

Упражнение №3. Выполните программу dumpreg. asm
Программа выводит дамп регистра AL.
Программа

состоит из основной части и двух подпрограмм:

Подпрограмма циклического сдвига битов регистра AL на заданное число итераций в регистре CL

Подпрограмма трансляции – выборки символа из таблицы и помещения его в регистр AL

Слайд 17

Программа получения дампа Перейти Начать таблица "0123456789ABCDEF" Начать: AL AL ↓

Программа получения дампа

Перейти Начать
таблица "0123456789ABCDEF"
Начать:
AL <= 0F | Тестируемый

код
AL ↓
AL AND F0 | Выделить старшую часть
CL <= 4 | Счетчик сдвига
Вызов адрес 40 | Сдвиг старших бит
BL < = 02 | Адрес таблицы трансляции
Вызов адрес 50 | Код цифры - смещение
Адрес C1 <= AL | Символ на консоль
AL ↑
AL AND 0F |Выделить младшую часть
BL < =02 | Адрес таблицы трансляции
Вызов адрес 50 | Код цифры - смещение
Адрес C2 <= AL | Символ на консоль
Стоп
Слайд 18

Программа получения дампа Смещение 40 | Подпрограмма сдвига Выполнять: Правый сдвиг

Программа получения дампа

Смещение 40 | Подпрограмма сдвига
Выполнять:
Правый сдвиг AL
CL=

CL - 1
Если Z = 0 то Выполнять
Завершить подпрограмму
Смещение 50 | Подпрограмма трансляции
BL = BL + AL
AL <= Адрес BL
Завершить подпрограмму
Конец