Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет№8(asm).docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
88.69 Кб
Скачать

Команды вызова процедур и возврата из них.

Процедура –любой фрагмент программы, который имеет своё имя и завершается определённой командой.

RET –команда возврата из процедуры.

CALL –команда вызова процедуры

Формат команды: CALL <имя процедуры>

Определение процедуры выполняется с помощью двух псевдооператоров

<имя процедуры> Proc

<имя процедуры> Endp

Процедуры бывают far-далёкие и near- близкие (near по умолчанию). Proc far – исполняется для придания ей возможности вызова из др. сегмента программы (др. программы) поэтому удобно содержимое сегмента любой программы оформлять как proc far. В пределах любой программы можно оформлять любое количество proc near.

CALL исполняется следующим образом: содержимое двух регистров CS, IP загружается в стек, а на их место в МП загружается адрес процедуры, указанный в команде CALL.

Командой RET из стека возвращаются CS и IP.

Pr1 segment

Assume CS: pr1

Mypr proc far proc ; –псевдооператор (для транслятора)

… ;команды (для МП)

Ret

Mypr endp

Pr1 ends

End mypr ; конец трансляции

Команды прерываний и возврата из них.

Таблица 4- Команды прерываний и возврат из них

Мнемоника

Формат

Комментарий

INT

INT номер_прер

Выполнить прерывание

INTO

INTO

Выполнить прерывание по переполнению

IRET

IRET

Вернуться из прерывания

INT При исполнении в стек загружается содержимое регистра флагов F, затем CS, затем IP. По коду прерываний (байт) из таблицы прерываний, хранимой в ОЗУ читается полный указатель прерывающей программы, (адрес загружается в СS и IP). После этого процессор начинает исполнять вызванную программу. Обработчик прерываний всегда в качестве последней содержит команду IRET.

INTO – условное прерывание и выполняется

IRET - команда возврата из прерывающей программы в основную. После исполнения из стека возвращаются СS, IP, F; т.к. для компьютера это немного, подпрограммы каждой

из этих программ указываются программистом через регистр АН. С помощью команды INT программист обращается к любым аппаратным средствам компьютера,

вместо того, чтобы писать программы обращения в ПУ.

Схема работы команды INT изображена на рисунке 7

Р исунок 7- схема работы команды INT

Функции ввода/вывода dos.

Все функции DOS вызываются прерыванием 21h, при этом в AH содержится номер функции. Ниже везде, где есть слова "стандартный ввод", под ними подразумевается клавиатура, однако ввод может быть переопределен (например, из файла). Аналогично, "стандартный вывод" – экран, но вывод также может быть переопределен (например, в файл). ASCIIZ-строка (нуль-терминированная строка) – это строка символов, заканчивающаяся нулевым символом (код 00h).

  1. Ввод символа с отображением. Прерывание 21h функция 01h. Вызов: AH=01h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) и выводит его на стандартный вывод (экран). Если ввод был перенаправлен, то невозможно обнаружить EOF.

  • если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h;

  • чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

  1. Вывод символа. Прерывание 21h функция 02h. Вызов: AH=02h; DL=выводимый символ. Возвращает: ничего. Действие: выводит символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.

  • если Ctrl+C после вывода символа, то вызавается прерывание 23h;

  • если стандартный вывод не был перенаправлен, то символ Backspace (08h) перемещает курсор влево на одну позицию.

  1. Прямой консольный ввод/вывод. Прерывание 21h функция 06h. Вызов: AH=06h; DL=действие: если DL=00h-FEh, то вывод; если DL=FFh, то ввод. Возвращает:

если вызов с DL=00h-FEh, то ничего;

если вызов с DL=FFh, то: если есть символ – ZF=0, AL=введенный символ

если нет символа – ZF=1.

Действие: используется, если нужно прочитать или записать все возможные символы и управляющие коды без действий ОС. Читает символ со стандартного ввода или записывает символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить EOF или что нет места на диске.

  • Никакой реакции на Ctrl+C;

  • чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

  1. Ввод символа без отображения. Прерывание 21h функция 07h. Вызов: AH=07h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.

  • Никакой реакции на Ctrl+C. Нужно использовать функцию 08h, если реакция требуется;

  • чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

  1. Ввод символа без отображения. Прерывание 21h функция 08h. Вызов: AH=08h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.

  • если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h. Нужно использовать функцию 08h, если реакции не требуется;

  • чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

  1. Вывод строки. Прерывание 21h функция 09h. Вызов: AH=09h, DS:DX=сегмент:смещение строки. Возвращает: ничего. Действие: посылает строку символов на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.

  • Строка должна заканчиваться на символ $(код 24h), который не выводится. Любые другие символы ASCII, включая управляющие, могут содержаться в строке. Для перевода курсора на начало новой строки нужно вывести строку, содержащую символы "перевод строки"/"возврат каретки":

string DB 10,13,'$'

или использовать прерывание 10h функцию 02h (см. 6.8.2.).

  • Если Ctrl+C нажата на клавиатуре, то вызывается прерывание 23h.

  1. Буферизованный ввод с клавиатуры. Прерывание 21h функция 0Ah. Вызов: AH=0Ah, DS:DX=сегмент:смещение буфера. Возвращает: ничего. Действие: читает строку символов со стандарного ввода, до появления символа возврата каретки (0Dh) и помещает в буфер (включая завершающий 0Dh). Символы отображаются на стандартном выводе. Если ввод был перенаправлен, то невозможно обнаружить EOF.

Таблица 5- формат буфера

Байт

Описание

0

Максимальное количество символов (устанавливается перед вызовом)

1

Количество реально прочитанных символов (устанавливается функцией после ее вызова)

2 и след.

Прочитанная строка, заканчивающаяся 0Dh

  • Если буфер заполнился (больше символов, чем максимум), последующий ввод игнорируется и подается сигнал до тех пор, пока не нажата клавиша ENTER;

  • Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.