КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Указания по организации самостоятельной работы. В языке Аssembler для МП і80х86
В языке Аssembler для МП і80х86. Исследование принципов организации подпрограмм Лабораторная работа № 4. Цель работы: Изучить принципы организации подпрограмм, механизмы передачи параметров и получить практические навыки разработки программ на языке Аssemblerс модульной структурой.
Перед работой необходимо изучить теоретический материал по литературе [1, 4 - 7] и конспект лекций с целью ознакомления с принципами модульного программирования, организацией подпрограмм, механизмами передачи параметров и вызова процедур и функций. 4.1.1. Принципы функционирования стека в МП і80х86. В МП і80х86 стеком называют сегмент памяти, предназначенный для временного хранения произвольных данных и работающий по принципу LIFO (последним вошел – первым вышел.). В любой момент доступен лишь верхний элемент, т.е. элемент, загруженный в стек последним. Выгрузка из стека верхнего элемента делает доступным следующий элемент. Элементы стека располагаются в сегменте стека, начиная с максимального адреса (дна стека) по последовательно уменьшающимся адресам до вершины стека. Для работы со стеком предназначены три регистра: SS – сегментный регистр стека, SP – регистр указателя стека, в котором хранится адрес верхнего (доступного) элемента, ВР – регистр указателя базы стека. Таким образом, регистровая пара SS:SP описывает полный физический адрес доступной ячейки стека. Загрузка данных в стек осуществляется специальной командой push op. По этой команде сначала уменьшается на 2 содержимое указателя стека SP, а затем по адресу в SP помещается операнд ор, который может быть регистром, или ячейкой памяти размеров в слово. Исходное состояние стека, а также стек после команд push АХ и push ВХ приведены на рис. 4.1 а), 4.1 б) и 4.1 в) соответственно.
а) б) в) г) д) Рис. 4.1. Иллюстрация механизма работы стека: Х – произвольное значение.
Для извлечения данных из стека используется команда pop op, по формату совпадающая с командой push ор, но противоположная ей по действию. При выполнении команды рор ор сначала происходит извлечение элемента из стека и запись его в ор (регистр или ячейку памяти), а затем увеличение SP на 2. Состояния стека после команд рор BX и рор AX приводятся на рис. 4.1 г), и 4.1д) соответственно. При этом данные в стеке не стираются, а изменяется лишь указатель стека SP. Для корректного восстановления содержимого регистров извлечение элементов из стека должно выполняться в порядке, строго противоположном загрузке: Загрузка данных в стек Извлечение данных из стека push AX pop CX push BX pop BX push CX pop AX Запись и извлечение данных из стека осуществляется только словами. Произвольный доступ к ячейкам стека можно обеспечить, используя механизм сегментной базово-индексной адресации с использованием регистров: SS:[BP][SI], SS:[BP][DI]. 4.1.2. Организация Assembler – подпрограмм в языке высокого уровня Turbo Pascal. Функции (процедуры) в языке Turbo Pascal описываются после раздела описания переменных var и имеют следующий формат: function function_name: return_ value_type; assembler; указываются имя функции и тип возвращаемого значения; аsm начальная операторная скобка; ………… тело функции; ret N оператор выхода из процедуры; end; конечная операторная скобка.
Вызов функции осуществляется с помощью команды call function_name, которая записывает в стек адрес возврата в основную программу (адрес следующей за ней команды) и осуществляет переход на первую команду функции. В зависимости от дополнительно указываемых в команде call директив far ptr и near ptr в стек заносится полный адрес возврата, представленный относительным и сегментным адресами (дальний вызов подпрограммы), или только относительный адрес возврата (ближний вызов подпрограммы) соответственно. Например, по команде call far ptr func1 при переходе к выполнению кода функции func1 в стек заносится относительный и абсолютный адреса команды, следующей за call.
Перед вызовом функции необходимо передать соответствующие параметры. Физически, существуют два основных механизма передачи параметров: через регистры и через стек. В случае передачи параметров через регистры, перед вызовом команды call параметры помещаются в регистры общего назначения (AX-DX, SI, DI) микропроцессора и затем используются в теле подпрограммы. При передаче параметров через стек, перед вызовом команды call в стек необходимо последовательно загрузить параметры и затем в обратном порядке извлечь их в теле процедуры. Логически, параметры могут передаваться по значению или по адресу (по ссылке). Это означает, что в регистры (или стек) могут передаваться как значения параметров, так и их адреса. Возвращаемые значения в функциях всегда передаются через регистровую пару (DX, АХ), в DX – cтаршее слово (если необходимо), в АХ – младшее. Для корректной работы функции необходимо обеспечить сохранение данных в регистрах, не используемых для передачи параметров, но модифицируемых в теле функции, а при выходе из процедуры - восстановить прежние значения. Выход из процедуры осуществляется командой rеt N с необязательным параметром N. Данная команда извлекает из стека адрес возврата в главную программу, помещенный командой call, и, в случае передачи параметров через стек, увеличивает значение указателя стека IP на N байт. В случае передачи параметров через регистры, параметр N в команде ret не используется. Рассмотрим примеры: необходимо разработать программу, содержащую функцию, которая возвращает значение разности слов а и b. Параметры передаются: а) по значению через регистры, б) по значению через стек, в) по адресу через регистры, г) по адресу через стек. Рассмотрим вариант а) при ближнем вызове функции: function razn: word; assembler; описание функции razn; asm стартовая операторная скобка функции; sub AX, BX вычитание а - b и сохранение результата в АХ; ret; извлечение из стека смещения следующей за call команды и возврат в основную программу;
end; завершающая операторная скобка функции; ……………………. фрагмент вызова функции основной программы: mov AX, a загрузка в АХ параметра а; mov BX, b загрузка в ВХ параметра b; call near ptr razn в стек загружается смещение следующей за call команды и осуществляется переход на первый оператор функции razn.
Рассмотрим вариант б) при дальнем вызове функции: function razn: word; assembler; описание функции razn; asm стартовая операторная скобка функции; код пролога функции: push BР сохранение в стеке значения регистра ВР; mov BP, SP присвоение регистру ВР значения в SP; push BX сохранение в стеке значения регистра ВХ; операционная часть функции: mov АX, word ptr [BP+8] извлечение из стека в АХ параметра а; mov ВX, word ptr [BP+6] извлечение из стека в BХ параметра b; sub AX, BX вычитание а - b и сохранение результата в АХ; код эпилога функции: pop BX восстановление из стека значения регистра ВХ; mov SP, BP восстановление прежнего значения SP из ВР; pop BP восстановление из стека значения регистра ВР; ret 4; извлечение из стека: полного адреса следующей за call команды, 2-х слов-параметров; и возврат в основную программу; end; завершающая операторная скобка функции; …………………….
фрагмент вызова функции основной программы: push a загрузка в АХ параметра а; push b загрузка в ВХ параметра b; call far ptr razn в стек загружается полный адрес следующей за call команды и осуществляется переход на первый оператор функции razn.
Рассмотрим вариант в) при дальнем вызове функции: function razn: word; assembler; описание функции razn; asm стартовая операторная скобка функции; код пролога функции: push SI сохранение в стеке значения регистра SI; push DI сохранение в стеке значения регистра DI; операционная часть функции: mov SI, AX загрузка SI смещением переменной а из АХ; mov DI,BX загрузка DI смещением переменной b из АХ; mov AX, [SI] загрузка в АХ слова (значения a) по адресу DS:[SI]; mov BX, [DI] загрузка в ВХ слова (значения b) по адресу DS:[DI]; sub AX, BX вычитание а - b и сохранение результата в АХ; код эпилога функции: pop DI восстановление из стека значения регистра DI; pop SI восстановление из стека значения регистра SI;
ret; извлечение из стека смещения следующей за call команды и возврат в основную программу; end; завершающая операторная скобка функции; ……………………. фрагмент вызова функции основной программы: mov AX, offset a загрузка в АХ относительного адреса параметра а; mov BX, offset b загрузка в ВХ относительного адреса параметра b; call far ptr razn в стек загружается полный адрес следующей за call команды и осуществляется переход на первый оператор функции razn.
Рассмотрим вариант г) при ближнем вызове функции: function razn: word; assembler; описание функции razn; asm стартовая операторная скобка функции; код пролога функции: push BР сохранение в стеке значения регистра ВР; mov BP, SP присвоение регистру ВР значения в SP; push DI сохранение в стеке значения регистра SI; push SI сохранение в стеке значения регистра DI; push BX сохранение в стеке значения регистра ВХ; операционная часть функции: mov SI, word ptr [BP+6] извлечение из стека в SI и DI относительных mov DI, word ptr [BP+4] адресов параметров а и b; mov AX, [SI] загрузка в АХ слова (значения a) по адресу DS:[SI]; mov BX, [DI] загрузка в ВХ слова (значения b) по адресу DS:[DI]; sub AX, BX вычитание а - b и сохранение результата в АХ; код эпилога функции: pop BX восстановление из стека значения регистра ВХ; pop SI восстановление из стека значения регистра SI; pop DI восстановление из стека значения регистра DI; mov SP, BP восстановление прежнего значения SP из ВР; pop BP восстановление из стека значения регистра ВР; ret 4; извлечение из стека: относительного адреса следующей за call команды, 2-х слов-параметров; и возврат в основную программу; end; завершающая операторная скобка функции; ……………………. фрагмент вызова функции основной программы: mov AX, offset a загрузка в АХ относительного адреса параметра а; mov BX, offset b загрузка в ВХ относительного адреса параметра b; push АХ загрузка в стек относительного адреса параметра а; push ВХ загрузка в стек относительного адреса параметра b; call near ptr razn в стек загружается относительный адрес следующей за call команды и осуществляется переход на первый оператор функции razn.
4.2. Описание лабораторной установки. Лабораторные работы выполняются в индивидуальном порядке. На рабочем месте каждого студента должен быть установлен ПК типа IBM PC/AT c инсталлированным на нем программным обеспечением: операционной системой MS–DOS v. 6.22 – 7, оболочкой для управления файлами типа NC, компилятором языка программирования высокого уровня Borland Turbo Pascal v. 7.0. 4.3. Порядок проведения работы и указания по ее выполнению. Перед началом выполнения практической части лабораторной работы проводится экспресс–контроль знаний по основным принципам работы стека, организации подпрограмм, механизмам передачи параметров. При подготовке к лабораторной работе необходимо составить предварительный вариант листинга программы, предусмотренной индивидуальным заданием. Задание: Необходимо разработать программу, выполняющую комплекс вычислений с помощью функции. Варианты индивидуальных заданий представлены в таблице 4.1.
Таблица 4.1. Варианты индивидуальных заданий
Пример выполнения задания: разработать программу, содержащую функцию, которая возвращает значение суммы слов а и b и помещает его в ячейку памяти с. Параметры передаются по адресу через стек. Блок – схема алгоритма программы приведена на рис.4.2. Рис. 4.2. Блок - схема алгоритма программы.
Текст программы с комментариями приводится ниже: Program LAB4; var раздел описаний глобальных переменных; a,b,c:word; описание переменных a, b и c; function summa:integer;assembler; описание функции summa; asm стартовая операторная скобка функции summa; push BP сохранение в стеке значения регистра ВР; mov BP,SP присвоение регистру ВР значения в SP; push BX сохранение в стеке значения регистра ВХ; push SI сохранение в стеке значения регистра SI; push DI сохранение в стеке значения регистра DI; mov DI,[BP+4] извлечение из стека в SI и DI относительных mov SI,[BP+6] адресов параметров а и b; mov AX,[SI] загрузка в АХ слова (значения a) по адресу DS:[SI]; mov BX,[DI] загрузка в ВХ слова (значения b) по адресу DS:[DI]; add AX,BX сложение а + b и сохранение результата в АХ; pop DI восстановление из стека значения регистра DI; pop SI восстановление из стека значения регистра SI; pop BX восстановление из стека значения регистра ВХ; mov SP,BP восстановление прежнего значения SP из ВР; pop BP восстановление из стека значения регистра ВР; ret 4 извлечение из стека: относительного адреса следующей за call команды, 2-х слов-параметров; и возврат в основную программу; end; завершающая операторная скобка функции summa; begin стартовый оператор основной программы; asm стартовая операторная скобка ассемблерного кода; mov a, 100 загрузка численного значения по адресу а. mov b, 200 загрузка численного значения по адресу b. mov ax,offset a загрузка в АХ относительного адреса параметра а; mov bx,offset b загрузка в ВХ относительного адреса параметра b; push AX загрузка в стек относительного адреса параметра а;
Дата добавления: 2014-12-07; Просмотров: 420; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |