Формат команды чтения слова состояния канала
Лабораторная работа №9 Организация работы с процедурами Цель работы Организация ввода-вывода информации с использованием операций процедуры. Теоретические основы Процедуры на языке ассемблера На языке ассемблера процедура оформляется следующим образом: Метка proc тип_адресации ;тело процедуры Метка endp Пример 1 Программа, содержащая процедуру PrintWord, которая печатает на экране "Hello, World!". CodeSg segment 'Code' Assume CS:CodeSg, DS:DataSg, SS:StackSg ; Begin: mov AX, DataSg Mov DS, AX Mov AX, StackSg Mov SS, AX ; Call PrintWord ; Mov AX, 4C00h Int 21h ; PrintWord proc ; Mov AH, 09h Mov DX, offset message Int 21h Ret ; PrintWord endp ; CodeSg ends ;--------------------------------------- DataSg segment 'Data' ; message db 'Hellow, World!', '$' ; DataSg ends ;--------------------------------------- StackSg segment Stack 'Stack' ; Db 256 dup(0) ; StackSg ends End begin Пример 2 Основную часть программы также можно оформлять в виде процедуры: Main proc far ; тело основной программы Main endp End Main При этом команда ret не используется, а в качестве точки входа необходимо указать имя главной процедуры. CodeSg segment 'Code' Assume CS:CodeSg, DS:DataSg, SS:StackSg Main proc far ; Mov AX, DataSg Mov DS, AX Mov AX, StackSg Mov SS, AX ; Call PrintWord ; Mov AX, 4C00h Int 21h ; Main endp PrintWord proc ; Mov AH, 09h Mov DX, offset message Int 21h Ret ; PrintWord endp CodeSg ends ;-------------------------------------------------------------------------- DataSg segment 'Data' ; message db 'Hellow, World!', '$' ; DataSg ends ;-------------------------------------------------------------------------- StackSg segment Stack 'Stack' ; Db 256 dup(0) ; StackSg ends ;-------------------------------------------------------------------------- End Main Сравните с помощью отладчика результирующий код программ из приведённых выше примеров. Способы передачи параметров в процедуры Часто в подпрограммы необходимо передавать параметры. Существует три основных способа: • через регистры; • через стек; • через общие области памяти. Пусть в подпрограмму Y нужно передать параметр X. Тогда это можно сделать так: Пример передачи параметров через регистры Mov AX, X ; параметр X в регистр AX Call Y ; вызов процедуры Y ;---------------------------------------------- Y proc Inc AX ; некоторое действие с параметром Ret ; возврат из процедуры Y endp ;---------------------------------------------- X dw 0 В этом примере для передачи параметра X используется регистр AX, с которым процедура выполняет некоторое действие и возвращает ответ также через регистр AX. Пример передачи параметров через стек Push X ; параметр X в стек Call Y ; вызов процедуры Y ;----------------------------------------------------- Y proc Pop BX ; временно извлекаем адрес возврата Pop AX ; извлекаем из стека параметр Push BX ; возвращаем в стек адрес возврата Inc AX ; некоторое действие процедуры с параметром Ret ; возврат из процедуры Y endp ;----------------------------------------------------- X dw 0 Здесь параметр X помещается перед вызовом процедуры в стек. В вызванной процедуре Y происходит извлечение из стека сперва адреса возврата в регистр BX, а затем самого параметра в регистр AX. Для правильного возврата из процедуры необходимо вернуть значение адреса возврата в стек, причем так, чтобы во время выполнения команды ret он находился в верхушке стека. Пример передачи параметров через общую область памяти Call Y ;--------------------------------------------------------------- Y proc Mov AX, ds:0000h ; извлекаем параметр по адресу ds:0000h Inc AX Ret Y endp ;--------------------------------------------------------------- X dw 0 При этом способе передачи параметра процедура должна знать, по какому адресу находится значение параметра. В данном случае это ds:0000h. Замечание. Возврат значения из процедуры осуществляется как правило через регистр AX. Это может быть либо сам ответ либо его адрес. Передача параметров по ссылке В примерах ко способам передачи параметров подразумевалось, что в процедуру передается значение параметра X. Если же нужно предоставить процедуре возможность самостоятельно извлекать значение параметра, а также, возможно, изменять его значение, то надо передавать в процедуру не значение параметра, а его адрес. Такой способ может быть также полезен при передаче в процедуру массивов, строк или каких-то других блоков данных (например, структур). Пример Процедура, обнуляющая массив X с количеством элементов N. Mov AX, offset X ; передаем через AX адрес массива X Mov CX, N ; передаем через CX кол-во N элементов X Call Y ;------------------------------------------------------------ Y proc l1: mov [AX], 0 ; обнулям ячейку с адресом находящимся в AX add AX, 2 ; "переходим" на следующий элемент массива Loop l1 ; повторяем CX-раз Y endp ;------------------------------------------------------------ X dw 0, 1, 2, 3, 4, 5 ; обнуляемый массив N dw 6 ; кол-во элементов массива X Задание Составить три программы (с разными способами передачи параметров в процедуру), содержащую процедуру, выполняющую нижеприведённые действия. Исследовать её работу в отладчике. (Упражнение выбирать по номеру студента в списке группы.) 1. n - раз выводит на экран символ '*' (в качестве параметра передавать число n). 2. Возводит целое число X в целую степень n (в качестве параметра передавать числа X и n). 3. Проверяет число X на знак и возвращает 0, если число X положительное или 0, и 1 в противном случае (в качестве параметра передавать число X). 4. Проверяет числа X и Y на равенство и возвращает 0, если равны, и 1 в противном случае (в качестве параметра передавать числа X и Y). 5. Вычисляет значение функции |X|, X - целое (в качестве параметра передавать число X). 6. Делит целое число X на n-ю степень числа 2 (в качестве параметра передавать числа X и n). 7. Умножает целое число X на n-ю степень числа 2 (в качестве параметра передавать числа X и n). 8. Преобразует положительное число X в отрицательное (в дополнительный код) (в качестве параметра передавать число X). 9. Проверяет число X на принадлежность диапазону [a, b] и возвращает 0, если принадлежит, и 1 в противном случае (в качестве параметра передавать числа X, a, b). 10.Проверяет число X на принадлежность диапазону [0, a]V[b, 255] и возвращает 0, если принадлежит, и 1 в противном случае (в качестве параметра передавать числа X, a, b). 4 Контрольные вопросы 1. Механизм вызова процедуры/возврата из процедуры (ближний и дальний вызовы). 2. Форматы команды call. 3. Форматы команды ret. 4. Способы передачи параметров в процедуры.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (432)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |