Ассемблер для 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.Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то, начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщ