Передача параметров в процедуру. Ассемблер для IBM PC.
Основы программирования.
Часть 2
Лабораторный практикум
Для студентов специальностей
010200 «Прикладная математика и информатика»,
351500 «Математическое обеспечение и администрирование информационных систем»,
220200 «Автоматизированные системы обработки информации и управления»
Майкоп 2008
УДК 681.32 (075.8)
ББК 32.973.26 – 018
М 52
Рецензенты: Тлюстен В.Ш., зав. кафедрой прикладной математики и информационных технологий АГУ, канд. физ-мат. наук, доцент;
Довгаль В.А., доцент кафедры информатики и вычислительной техники МГТУ, канд. техн. наук, доцент.
Работа печатается по решению редакционно-издательского совета Адыгейского государственного университета.
М 52 Меретуков Ш.Т., Бучацкая В.В., Бучацкий П.Ю. Лабораторный практикум «Ассемблер для IBM PC. Основы программирования. Часть 1.» для студентов специальностей 010200 «Прикладная математика и информатика», 351500 «Математическое обеспечение и администрирование информационных систем», 220200 - Автоматизированных систем обработки информации и управления / Ш.Т. Меретуков и др. – Майкоп, 2008. - 35 с.
Лабораторный практикум «Ассемблер для IBM PC. Основы программирования. Часть 2.» включает описания лабораторных работ по курсам «Архитектура ЭВМ и систем», «Организация ЭВМ и систем», «Введение в язык Ассемблера IBM PC», состоящих из теоретической, практической части, заданий для индивидуальной работы, контрольных вопросов и заданий.
Содержание
Введение……………………………………………………………………………
|
| Лабораторная работа № 5. Процедуры
|
| Лабораторная работа № 6. Обработка символьной информации……………
|
| Лабораторная работа № 7. Битовые операции ……………………………
|
|
|
| Рекомендуемая литература……………………………………………………….
|
|
Введение.
Данная разработка является второй частью методического руководства к выполнению лабораторных работ. В нее вошли вопросы, касающиеся обработки символьной информации, работы с процедурами, выполнения логических битовых операций. Разработка составлена на основе лекций, читаемых авторами по курсу «Архитектура вычислительных систем и сетей», «Организация ЭВМ и систем», «Введение в язык Ассемблера».
Изучение тем, предлагаемы в данном руководстве необходимо при подготовке профессиональных программистов, поскольку позволяет лучше понять принципы работы ЭВМ, операционных систем и трансляторов с языков высокого уровня, а также разрабатывать высокоэффективные программы.
Описание каждой лабораторной работы состоит из следующих разделов:
ü цель работы;
ü основные сведения – содержат минимальных набор теоретических сведений, необходимых в ходе выполнения работы;
ü пример выполнения работы – типовое задание и программа, реализующая поставленную задачу, можно рассматривать как шаблон для выполнения работы по данной теме;
ü варианты заданий для индивидуальной работы;
ü контрольные вопросы.
При выполнении каждой лабораторной работы рекомендуется прочесть описание и разобрать предложенный пример, написать программу согласно варианту задания, создать исполнимый файл, отладить программу при нескольких наборах входных данных, ответить на контрольные вопросы.
Отчет по лабораторной работе должен включать: вариант задания, тексты программ в виде листинга трансляции, исходные данные и результаты выполнения программы для нескольких наборов данных.
Лабораторная работа № 5
Процедуры в языке Ассемблера.
Цель:изучение приемов программирования на языке Ассемблера с использованием подпрограмм, выработка навыков работы с командами вызова подпрограмм, возврата из подпрограммы.
Задачи:
ü изучить механизм работы команды вызова подпрограммы CALL, возврата из подпрограммы RET, правила оформления подпрограмм;
ü получить практические навыки по созданию подпрограмм на языке Ассемблера.
Команды работы с подпрограмми.
В языке ассемблера подпрограмма оформляется в виде процедур. Для объявления процедур в одномодульных, простых программах можно использовать упрощенный вариант синтаксиса:
<имя> PROC <тип>
<тело процедуры>
RET
<имя> ENDP
где PROC – директива, определяющая начало процедуры,
<имя> – метка, служащая именем процедуры и задающая адрес точки входа в процедуру;
<тип> – параметр, определяющий тип процедуры и может принимать два значения: near (ближний) и far (дальний). Если используется упрощенные формы определения сегментов, то тип процедуры задается выбранной моделью памяти и его можно не указывать. Для моделей tiny, small и compact определяется тип near, а для остальных – far;
RET (Return) – последняя команда подпрограммы. Она осуществляет выход из подпрограммы и возврат в основную программу. Тип процедуры автоматически задает тип возврата из процедуры.
Вызов подпрограммы из основной программы осуществляется командой CALL, которая имеет следующий синтаксис:
CALL <тип> <имя>
где <тип> – параметр, определяющий тип перехода и может принимать значения near или far;
<имя> – имя вызываемой процедуры.
Команда CALL вызывает процедуру и сохраняет в стек адрес следующей за ней команды. При ближнем вызове в стек помещается значение регистра IP, а при дальнем вызове – значение регистров CS и IP. После выполнения в процедуре команды RET – выполняется обратное действие.
Example 5.1.Фрагмент программы вызова процедур.
;фрагмент кода программы
main PROC
MOV AX, @data
MOV DS, AX
CALL MySub
…
MOV AX, 4C00h
INT 21
main ENDP
MySub PROC
…
RET
MySub ENDP
Передача параметров в процедуру.
Передавать фактические параметры процедуре можно по-разному. Используются несколько способов передачи параметров. Выбор конкретного способа для определенной задачи зависит от количества используемых параметров и сложности их обработки.
1. Способ передачи параметров через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
2 Способ передачи параметров по значению: перед обращением к процедуре основная процедура вычисляет значения фактических параметров и записывает их в регистры.
Example 5.2.Вычислить c = max(a, b) + max(5, a-l), где все числа – знаковые размером в слово. Вычисление max(х, у) описать как процедуру. Условия передачи параметров: первый параметр (х) – через регистр АХ, второй параметр (у) – через регистр ВХ, результат (max) – в регистре АХ.
При этих условиях процедура и соответствующий фрагмент основной программы выглядят следующим образом: (для примера опишем процедуру как дальнюю):
;процедура: АХ= max (АХ,ВХ)
MAX PROC FAR
CMP AX, BX
JGE MAX1
MOV AX, BX
МАХ1: RET
MAX ENDP
;основная программа
MOV AX, А ;АХ:=а
MOV ВХ, В ;ВХ:=b
CALL MAX ;АХ:=mах(а,b)
MOV С, АХ ; сохранить АХ
MOV AX, 5 ;АХ:=5
MOV ВХ, А
DEC ВХ; ВХ:=а-1
CALL MAX ;AX:=max(5,a-l)
ADD С, АХ ;С:=mах(а,b)+mах(5,а-1)
3 способ передачи параметров по ссылке означает передачу адреса (имени) ячейки, соответствующей фактическому параметру, через регистр: основная программа записывает в какой-то регистр адрес фактической переменной, а процедура берет его оттуда. Используют регистры-модификаторы ВХ, ВР, SI или DI, т. к. процедуре придется модифицировать по этому регистру.
Example 5.3.Реализовать на Ассемблере процедуру на языке Паскаль:
procedure D (var x:integer);
begin
x:=x div 16
end;
Пусть в программе есть такие обращения к ней: D(A) и D(B), где А и В - имена переменных, значениями которых являются неотрицательные числа. Используем регистр ВХ: к началу выполнения процедуры в регистре ВХ должен находиться адрес той ячейки (А или В), содержимое которой она изменяет. Доступ к ячейки в этом случае можно получить с помощью конструкции [ВХ].
Фрагмент основной программы, соответствующий обращениям D(A) и D(B):
;процедура
D PROC
PUSH СХ ;сохранить cx
MOV CL, 4
SHR WORD PTR [BX], CL ; X:=x div 16
POP CX ;восстановить СХ
RET
D ENDP
;основная программа
LEA BX, A ;ВХ=адрес А
CALL D D(A)
LEA BX, B ;ВХ=адрес В
CALL D ; D(B)
Замечание. В начале своей работы процедура должна сохранить в стеке значения тех регистров, которые ей потребуются для работы. Перед выходом она должна восстановить прежние значения этих регистров, считав их из стека.
В случае, когда параметром процедуры являются данные сложных типов, они также передаются в процедуру по ссылке с использованием одного из регистров-модификаторов и косвенной адресации.
4 способпередачи параметров через стек: программа перед вызовом заносит параметры в стек с помощью команды push. Чтобы подпрограмма могла изменять значения параметров, следует передавать ей не сами значения, а адреса параметров. Используется в случае большого количества параметров.
Выполнение процедуры должно начинаться со следующих команд («входные» действия процедуры):
Р PROC
PUSH ВР; сохранить ВР
MOV BP,SP ; ВР - на вершину стека
…
команды процедуры
После записи в стек старого значения ВР (ВРст) для доступа к параметрам процедуры надо использовать выражение вида [ВР+i], где i=2*n (n – размерность параметра).
При выходе из процедуры стек должен быть в том же состоянии, в каком он был после «входных» действий. Для восстановления состояния стека выполняются «выходные» действия:
POP ВР ;восстановить старое значение ВР
RET 2*k ;очистка стека от k параметров-слов и возврат
Р ENDP
По команде RET i*k из стека удаляется адрес возврата, затем стек очищается на указанное операндом число байтов и далее выполняется переход по адресу возврата.
|