Ассемблер для 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>