Студопедия

КАТЕГОРИИ:


Архитектура-(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.

Варианты индивидуальных заданий

№ вар. Задания
  Определить функцию для вычисления объема параллелепипеда. (V=a*b*c) и рассчитать суммарный объем параллелепипедов с длинами ребер (10, 15, 5), (15, 10, 20), (20, 10, 5). Передача параметров (по значению) осуществляется через стек.
  Определить функцию для вычисления объема параллелепипеда (V=a*b*c) и и рассчитать суммарный объем параллелепипедов с длинами ребер (10, 15, 5), (15, 10, 20), (20, 10, 5). Передача параметров (по адресу) осуществляется через стек.
  Определить функцию, которая возвращает максимальное из двух целых чисел и выполнить вычисление формулы: у=max(2, 5) + max(15, 8). Передача параметров (по значению) осуществляется через стек.
  Определить функцию, которая возвращает максимальное из двух целых чисел и выполнить вычисление формулы: у=max(3, 8) + max(5, 7). Передача параметров (по значению) осуществляется через регистры.
  Определить функцию, которая возвращает минимальное из двух целых чисел и выполнить вычисление формулы: у=min(4,6) + min(8, 2). Передача параметров (по адресу) осуществляется через стек.
  Определить функцию, которая возвращает максимальное из двух целых чисел и выполнить вычисление формулы: у = min (4, 8)+ min(7, 4). Передача параметров (по значению) осуществляется через регистры.
  Определить функцию, которая выполняет сравнение двух целых чисел, и возвращает номер (1 или 2) максимального из них. Проверить работу функции для наборов данных (10, 25), (80, 50). Передача параметров (по значению) осуществляется через стек.
  Определить функцию, которая выполняет сравнение двух целых чисел, и возвращает номер (1 или 2) максимального из них. Проверить работу функции для наборов данных (30, 20), (10, 40). Передача параметров (по адресу) осуществляется через регистры.
  Определить функцию, которая выполняет сравнение двух целых чисел, и возвращает номер (1 или 2) минимального из них. Проверить работу функции для наборов данных (40, 25), (15, 50). Передача параметров (по значению) осуществляется через стек.
  Определить функцию, которая выполняет сравнение двух целых чисел, и возвращает номер (1 или 2) минимального из них. Проверить работу функции для наборов данных (10, 50), (5, 4). Передача параметров (по значению) осуществляется через регистры.
  Определить функцию, которая выполняет сравнение трех целых чисел, и возвращает номер (1, 2, или 3) максимального из них. Проверить работу функции для наборов данных (30, 20, 10), (10, 50, 40). Передача параметров (по адресу) осуществляется через регистры.
  Определить функцию, которая выполняет сравнение трех целых чисел, и возвращает номер (1, 2, или 3) максимального из них. Проверить работу функции для наборов данных (45, 14, 15), (2, 7, 8). Передача параметров (по адресу) осуществляется через стек.
  Определить функцию, которая возвращает максимальное из трех целых чисел. Проверить работу функции для наборов данных (40,10,20), (5, 3, 10). Передача параметров (по адресу) осуществляется через регистры.
  Определить функцию, которая возвращает максимальное из трех целых чисел. Проверить работу функции для наборов данных (5,15,10), (25, 30, 50). Передача параметров (по значению) осуществляется через стек.
  Определить функцию, которая возвращает минимальное из трех целых чисел. Проверить работу функции для наборов данных (15,25,5), (20, 40, 80). Передача параметров (по адресу) осуществляется через регистры.
  Определить функцию, которая возвращает минимальное из трех целых чисел. Проверить работу функции для наборов данных (30,20,40), (8, 70, 15). Передача параметров (по значению) осуществляется через регистры.
  Определить функцию для вычисления площади круга (S~3*(r*r) и рассчитать площади для кругов с радиусами r=5, r=10, r=15. Передача параметров (по адресу) осуществляется через стек.
  Определить функцию для вычисления длины окружности (Р~6*r) и рассчитать сумму длин окружностей при r=5, r=10, r=15. Передача параметра (по адресу) осуществляется через регистр.
  Определить функцию, которая возвращает 1 в случае, если сумма двух параметров размером в байт не превышает 255, и 0 – иначе. Проверить работу функции для наборов данных (100, 200), (120, 100). Передача параметров (по адресу) осуществляется через стек.
  Определить функцию, которая возвращает 1 в случае, если сумма двух параметров размером в байт не превышает 100, и 0 – иначе. Проверить работу функции для наборов данных (100, 200), (200, 50). Передача параметров (по значению) осуществляется через регистры.

Пример выполнения задания: разработать программу, содержащую функцию, которая возвращает значение суммы слов а и 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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.089 сек.