Ассемблер для IBM PC
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
?е процедуру копирования данных с использованием команд MOVSB и MOVSW.
.Реализуете процедуру копирования данных по убыванию адресов.
.Реализуете процедуру копирования данных без использованием цепочечных команд копирования.
.Выясните, что будет, если в SI поместить смещение строки dst, а в DI строки src.
.Можно ли вместо префикса REP использовать другой, например REPE. Если, да, то почему.
.Имеется следующее определение данных:
SEGMENTPARA
CONAMEDBSPACE EXPLORES INC.
PRLINEDB20 DUP ( )
Используя цепочечные команды, выполните (запишите фрагмент программы):
a).Пересылку данных из CONAME в PRLINE слева направо.
b).Пересылку данных из CONAME в PRLINE справа налево.).Загрузку третьего и четвертого байта области CONAME в регистр AX.).Сохранение содержимого регистра AX по адресу PRLINE + 5).Сравнение данных в областях CONAME и PRLINE.).Сканирование области CONAME и поиск в ней символов пробел. Если символ найден, то переслать его в регистр BH.
.Сравнить командой cmps две цепочки байт в памяти string1 и string2 и поместить первый несовпавший байт из string2 в регистр al. Для загрузки этого байта в регистр-аккумулятор al использовать команду lods.
. Процедуры в языке Ассемблера
команда ассемблер подпрограмма строка
Цель: изучение приемов программирования на языке Ассемблера с использованием подпрограмм, выработка навыков работы с командами вызова подпрограмм, возврата из подпрограммы.
Задачи:
изучить механизм работы команды вызова подпрограммы CALL, возврата из подпрограммы RET, правила оформления подпрограмм;
получить практические навыки по созданию подпрограмм на языке Ассемблера.
Команды работы подпрограммы.
В языке ассемблера подпрограмма оформляется в виде процедур. Для объявления процедур в одномодульных, простых программах можно использовать упрощенный вариант синтаксиса:
RET
ENDP
где PROC - директива, определяющая начало процедуры, - параметр, определяющий тип процедуры и может принимать два значения: near (ближний) и far (дальний). Если используется упрощенные формы определения сегментов, то тип процедуры задается выбранной моделью памяти и его можно не указывать. Для моделей tiny, small и compact определяется тип near, а для остальных - far; RET (Return) - последняя команда подпрограммы. Она осуществляет выход из подпрограммы и возврат в основную программу. Тип процедуры автоматически задает тип возврата из процедуры.
Вызов подпрограммы из основной программы осуществляется командой CALL (), которая имеет следующий синтаксис:
CALL
где - имя вызываемой процедуры.
Когда команда CALL вызывает процедуру, и сохраняет в стек адрес следующей за CALL команды. При ближнем вызове в стек помещается значение регистра IP, а при дальнем вызове - значение регистров CS и IP. После выполнения в процедуре команды RET - выполняется обратное действие.
Фрагмент программы вызова процедур
; фрагмент кода программы
mainPROC
MOVAX, @dataDS, AXMySub
…AX, 4C00h21ENDP
MySubPROC
…ENDP
Передача параметров в процедуру.
Передавать фактические параметры процедуре можно по-разному. Используются несколько способов передачи параметров. Выбор конкретного способа для определенной задачи зависит от количества используемых параметров и сложности их обработки.
1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
Передача параметров по значению: перед обращением к процедуре основная процедура вычисляет значения фактических параметров и записывает их в регистры.
Пример. 1. Вычислить c=max (a, b)+max (5, a-l), где все числа - знаковые размером в слово. Вычисление max (х, у) описать как процедуру. Условия передачи параметров: первый параметр (х) - через регистр АХ, второй параметр (у) - через регистр ВХ, результат (max) - в регистре АХ.
При этих условиях процедура и соответствующий фрагмент основной программы выглядят следующим образом: (для примера опишем процедуру как дальнюю):
; процедура: АХ= max (АХ, ВХ); основная программаMAXPROCFARMOVAX, А; АХ:=аCMPAX, BXMOVВХ, В; ВХ:=bJGEMAX1CALLMAX; АХ:=mах (а, b)MOVAX, BXMOVС, АХ; сохранить АХМАХ1:RETMOVAX, 5; АХ:=5MAXENDPMOVВХ, АDECВХ; ВХ:=а-1CALLMAX; AX:=max (5, a-l)ADDС, АХ; С:=mах (а, b)+mах (5, а-1)
Передача параметров по ссылке означает передачу адреса (имени) ячейки, соответствующей фактическому параметру, через регистр: основная программа записывает в какой-то регистр адрес фактической переменной, а процедура берет его оттуда. Используют регистры-модификаторы ВХ, ВР, SI или DI, т.к. процедуре придется модифицировать по этому регистру.
Пример 2. Возьмем следующую процедуру на языке Паскаль:
procedure D (var x:integer);:=x div 16;
Пусть в программе есть такие обращения к ней: D(A) и D(B), где А и В-имена переменных, значениями которых являются неотрицательные числа. Используем регистр ВХ: к началу выполнения процедуры в регистре ВХ должен находиться адрес той ячейки (А или В), содержимое которой она изменяет. Доступ к ячейки в этом случае можно получить с помощью конструкции [ВХ].
Фрагмент основной программы, соответствующий обращениям D(A) и D(B):
; процедура; основная программаDPROCLEABX, A; ВХ=адрес АPUSH СХ; сохра?/p>