Ассемблер для IBM PC

Методическое пособие - Компьютеры, программирование

Другие методички по предмету Компьютеры, программирование

?ить cxCALLDD(A)MOV CL, 4LEABX, B; ВХ=адрес ВSHR WORD PTR [BX], CLX:=x div 16CALLD; D(B)POP CX; восстановить СХRETDENDP

Замечание. В начале своей работы процедура должна сохранить в стеке значения тех регистров, которые ей потребуются для работы. Перед выходом она должна восстановить прежние значения этих регистров, считав их из стека.

В случае, когда параметром процедуры являются данные сложных типов, они также передаются в процедуру по ссылке с использованием одного из регистров-модификаторов и косвенной адресации.

. Передача через стек: программа перед вызовом заносит параметры в стек с помощью команды push. Чтобы подпрограмма могла изменять значения параметров, следует передавать ей не сами значения, а адреса параметров. Используется в случае большого количества параметров.

Выполнение процедуры должно начинаться со следующих команд (входные действия процедуры):

 

Р PROCUSH ВР; сохранить ВРBP, SP; ВР - на вершину стека

 

команды процедуры

После записи в стек старого значения ВР (ВРст) для доступа к параметрам процедуры надо использовать выражение вида [ВР+i], где i=2*n (n - размерность параметра).

При выходе из процедуры стек должен быть в том же состоянии, в каком он был после входных действий. Для восстановления состояния стека выполняются выходные действия:

POP ВР; восстановить старое значение ВР2*k; очистка стека от k параметров-слов и возврат

Р ENDP

По команде RET i*k из стека удаляется адрес возврата, затем стек очищается на указанное операндом число байтов и далее выполняется переход по адресу возврата.

Модульная структура программ на языке Ассемблера.

Модулем называют часть программы, решающую некоторую подзадачу и более или менее независимую от других частей. Частным случаем модулей являются процедуры.

Рассмотрим процесс объединения отдельных модулей (оформленных в виде отдельных asm-файлов) в единый загрузочный модуль.

Пусть в программе имеется два модуля Ml и М2. Пусть в модуле М2 описана процедура Р, к которой будет обращаться модуль Ml, и пусть модуль М2 пользуется переменной Х и константой К из модуля Ml. Чтобы при трансляции не возникло сообщение об ошибке неописанное имя, транслятору ассемблера сообщается, что имена Х и К, хотя и используются в М2, описаны в другом модуле. Такое сообщение делается с помощью директивы

 

где - это BYTE, WORD, DWORD, ABS, NEAR, FAR.

В нашем случае в модуле М2 надо указать директиву EXTRN X:BYTE, K:ABS. Она сообщает ассемблеру, что имена Х и К являются внешними по отношению к данному модулю. В модуле Ml следует поместить директиву EXTRN Р: PAR, сообщающую, что Р - это процедура из другого модуля и вызов ее должен быть дальним. В модуле, где описаны имена К и Х (т.е. в Ml) надо поместить директиву PUBLIC

В данном случае в модуле Ml надо записать директиву PUBLIC X, K. Этой директивой сообщается, что имена Х и К данного модуля разрешено использовать в других модулях. Имена, описанные в модуле и доступные другим модулям, по отношению к этому модулю называются общими. Итак, если в каком-то модуле программы некоторое имя описано как внешнее, то в каком-то другом модуле это имя обязательно должно быть объявлено общим. С учетом сказанного модули Ml и М2 должны иметь следующий вид

 

; модуль Ml; модуль М2EXTRN Р: FAREXTRN X:BYTE, K:ABSPUBLIC Х, KPUBLIC PXDB?PPROCFARКEQU100MOVX, 0…MOVАХ, КCALLР…

Модули транслируются отдельно. Затем при компоновке они объединяются в единую машинную программу с помощью команды:

LINK M1.OBJ+ … +Mk.OBJ, M.EXE;

Работа с командой прерываний INT.

Особым видом являются подпрограммы, вызываемые по прерыванию командой INT. Прерывания бывают двух видов:

аппаратные - это сигнал от любого устройства системы для процессора, который по этому сигналу должен обслужить данное устройство:

программные - создается программами BIOS или DOS для вызова сервисных подпрограмм.

Команда прерывания

INT number

вызывает подпрограммы операционной системы. Эти прерывания имеют номера от 0 до FFh. Перед вызовом команды INT, в регистр AX помещают номер функции, который определяет необходимую подпрограмму. Другие регистры тоже могут использоваться в прерывании.

Процессор выполняет команду прерывания, используя таблицу векторов прерываний. Таблица векторов прерываний занимает самые нижние 1024 байта памяти. Каждый элемент таблицы - это 32-битный адрес сегмент: смещение, указывающий на подпрограммы операционной системы. Когда происходит вызов команды INT процессор производит следующие действия:

1.Параметр number сообщает процессору местонахождение вектора в таблице векторов прерываний.

2.Процессор передает управление по указанному в векторе прерываний адресу процедуры обработки прерывания (ПОП).

.Подпрограмма DOS или BIOS, расположенная по указанному адресу начинает выполняться и передает управление назад, когда будет достигнута команда IRET.

.Команда возврата из прерывания IRET отдает управление вызывающей программе, которая продолжает работу со следующей за прерыванием командой.

Практические задания.

В приведенных ниже вариантах заданий используется стандартное представление строк ASCII. Зациклите программу по вводу, признаком окончания работы считать ввод пустой строки.

1.Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то, начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщ