
- •«Пермский национальный исследовательский политехнический университет»
- •Цель работы
- •Индивидуальное задание
- •1.Теоретические сведения
- •Основные команды языка Ассемблер
- •Команды пересылки.
- •1) Пересылка данных
- •2) Пересылка адресов
- •4) Пересылка в стек и из стека
- •Арифметические операции.
- •1) Команды счёта
- •2) Арифметические операции над двоичными кодами.
- •3) Команда сравнения:
- •Команды корректировки.
- •Команды логических операций.
- •1) Поразрядные логические операции:
- •2) Команды сдвига
- •Команды передачи управления.
- •Команды организации цикла.
- •Команды вызова процедур и возврата из них.
- •Команды прерываний и возврата из них.
- •Функции ввода/вывода dos.
- •2.Расчетно-графическая часть
- •Листинг программы:
- •Библиографический список
Команды вызова процедур и возврата из них.
Процедура –любой фрагмент программы, который имеет своё имя и завершается определённой командой.
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).
Ввод символа с отображением. Прерывание 21h функция 01h. Вызов: AH=01h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) и выводит его на стандартный вывод (экран). Если ввод был перенаправлен, то невозможно обнаружить EOF.
если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Вывод символа. Прерывание 21h функция 02h. Вызов: AH=02h; DL=выводимый символ. Возвращает: ничего. Действие: выводит символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.
если Ctrl+C после вывода символа, то вызавается прерывание 23h;
если стандартный вывод не был перенаправлен, то символ Backspace (08h) перемещает курсор влево на одну позицию.
Прямой консольный ввод/вывод. Прерывание 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, затем – код клавиши.
Ввод символа без отображения. Прерывание 21h функция 07h. Вызов: AH=07h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.
Никакой реакции на Ctrl+C. Нужно использовать функцию 08h, если реакция требуется;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Ввод символа без отображения. Прерывание 21h функция 08h. Вызов: AH=08h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.
если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h. Нужно использовать функцию 08h, если реакции не требуется;
чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.
Вывод строки. Прерывание 21h функция 09h. Вызов: AH=09h, DS:DX=сегмент:смещение строки. Возвращает: ничего. Действие: посылает строку символов на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.
Строка должна заканчиваться на символ $(код 24h), который не выводится. Любые другие символы ASCII, включая управляющие, могут содержаться в строке. Для перевода курсора на начало новой строки нужно вывести строку, содержащую символы "перевод строки"/"возврат каретки":
string DB 10,13,'$'
или использовать прерывание 10h функцию 02h (см. 6.8.2.).
Если Ctrl+C нажата на клавиатуре, то вызывается прерывание 23h.
Буферизованный ввод с клавиатуры. Прерывание 21h функция 0Ah. Вызов: AH=0Ah, DS:DX=сегмент:смещение буфера. Возвращает: ничего. Действие: читает строку символов со стандарного ввода, до появления символа возврата каретки (0Dh) и помещает в буфер (включая завершающий 0Dh). Символы отображаются на стандартном выводе. Если ввод был перенаправлен, то невозможно обнаружить EOF.
Таблица 5- формат буфера
Байт |
Описание |
0 |
Максимальное количество символов (устанавливается перед вызовом) |
1 |
Количество реально прочитанных символов (устанавливается функцией после ее вызова) |
2 и след. |
Прочитанная строка, заканчивающаяся 0Dh |
Если буфер заполнился (больше символов, чем максимум), последующий ввод игнорируется и подается сигнал до тех пор, пока не нажата клавиша ENTER;
Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.