Глава 15 - практика:EXE и COM программы, вывод на экран
Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам улучшить сервис для Вас с целью персонализации сервисов и предложений. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Продолжая пользоваться сайтом без изменения настроек, вы даёте согласие на использование ваших cookie-файлов.
speech bubble

Глава 15 - практика:EXE и COM программы, вывод на экран

Самоучитель по языку ассемблер(assembler)

 

Содержание:

 

ВНИМАНИЕ! Данный самоучитель был написан много лет назад и его автор не сможет ответить на ваши вопросы. Курс по assembler предназначен для саморазвития. Если у вас хватает квалификации, можете предложить внести правки.

 

Способы вывода на экран

Вывод информации в ассемблерных программах осуществляется обычно при помощи сервисных функций DOS (прерывание 21h). Процесс вывода состоит в следующем:

  • определенные регистры микропроцессора загружаются выводимой информацией;
  • в регистр AH заносится номер используемой для операции вывода функции;
  • инициируется прерывание.

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

Функция 02h
Вывод на дисплей.
Вход: AH=02h
DL=выводимый символ
Выход: нет

Описание: Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции.

Функция 05h
Вывод на принтер.
Вход: AH=05h
DL= символ, записываемый на стандартный принтер
Выход: нет

Описание: Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Команда DOS MODE может перенаправить этот вывод в последовательный порт.


Функция 09h
Выдать строку.
Вход: AH=09h
DS:DX=адрес строки, заканчивающейся символом '$' (ASCII 24H)
Выход: нет

Описание: Строка, исключая завершающий ее символ '$', посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02h. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 13H и ASCII 0aH). Строки, содержащие '$', можно выдать через 40h (BX=0), которая посылает символ в DL на стандартное устройство принтера, обычно LPT1.

Кроме этого прерывания есть еще функции BIOS которые вызываются прерыванием 10h

Функция 02h
Вход. AH=02h
BH = видео страница
DH,DL = строка, колонка (считая от 0)
Выход. Нет

Описание. Устанавливает курсор в позицию DH,DL. Установка кур-сора на строку 25 делает курсор невидимым.

Функция 09h
Писать символ/атрибут в текущей позиции курсора.
Вход. AH=09h
BH = номер видео страницы
AL = записываемый символ
CX = счетчик (сколько экземпляров символа записать)
BL = видео атрибут (текст) или цвет (графика)
Выход. Нет

Описание. Выводит на экран в текущую позицию курсора символ с заданным атрибутом.

Функция 0ah
Писать символ в текущей позиции курсора.
Вход. AH=0ah
BH = номер видео страницы
AL = записываемый символ
CX = счетчик (сколько экземпляров символа записать)
Выход. Нет

Описание. Выводит на экран в текущую позицию курсора заданный символ.

Функция 13h
Вывод строки.
Вход. AH=13h
ES:BP – выводимая строка
CX = длина строки (подсчитываются только символы)
DH,DL = позиция (строка, колонка) начала вывода
BH = номер страницы
AL = код подфункции:
0=атрибут в BL; курсор без изменения
1=атрибут в BL; курсор – в конец строки
2=формат строки: char,attr,...; курсор без изменения
3=формат строки: char,attr,...; курсор – в конец строки
Выход. Нет

Описание. Выдает строку в позиции курсора. Символы 0dH (CarRet), 0aH (LineFeed), 08H (backspace) и 07H (Beep) трактуются как команды управления и не высвечиваются.
Некоторые функции прерывания 10h используют для вывода атрибут символа. Для адаптеров цветной графики в текстовом режиме атрибут определен следующим образом:

7 6 5 4 3 2 1 0
fgB background brt foreground
foreground – цвет переднего плана (от 0 до 0fH)
brt – интенсивность: 1=передний план яркий
background – фоновый цвет (от 0 до 7)
fgB – мерцание: 1=передний план мерцает
Вычислить значение атрибута можно, используя следующее выражение:
(фон * 16) + передний план + (128 для мерцания)

Видеоадаптер поддерживает следующие цвета:

Поддерживаемые цвета видеоадаптера

Примеры программ

COM программа

С учётом рассмотренной ранее теории примеры программ разобрать для вас будет не трудно!
Создайте файл prcom.asm следующего содержания (можно без комментариев):

;устанавливаем модель памяти для com программы
.model tiny
;описываем сегмент кода
.code
;смещение обязательное для COM программ
org 100h
;стартовая метка
start:
;в dx смещение строки
mov dx,offset message
;номер функции DOS
mov ah,09h
;вызываем прерывание DOS для вывода на экран
int 21h
;завершаем com программу
ret
;описываем данные (прямо в сегменте кода)
message db 'This string is out!!!!!!',0Ah,0Dh,'$'
;метка конца программы
end start

Для компиляции с помошью пакета TASM воспользуйтесь командами (замените пути к каталогу bin своими):

c:\specprog\tasm\bin\tasm.exe prcom.asm
c:\specprog\tasm\bin\tlink.exe prcom.obj /t/x

В случае masm используйте (тут посложнее!):

ml /c prcom.asm
link prcom.obj,,NULL,,,
exe2bin prcom.exe prcom.com

Exe программа

Здесь я уже не стану приводить подробных комментариев:

;модель памяти для EXE программ
.model small
.code
start:
;загружаем явно сегм. регистр DS
mov ax,DGROUP
mov ds,ax
;выводим сообщение
mov dx,offset message
mov ah,09h
int 21h
;выводим символ
mov dl,'!'
mov ah,02h
int 21h
;теперь явно завершаем программу
mov ax,4C00h
int 21h
;описываем сегмент данных - отдельно от кода
.data
message db 'This symbol is out:',0Ah,0Dh,'$'
end start

Чтобы скомпилировать используйте команды:

c:\specprog\tasm\bin\tasm.exe prexe.asm
c:\specprog\tasm\bin\tlink.exe prexe.obj /x

На masm:
ml /c prexe.asm
link prexe.obj

Вот что должно вывестись при запуске:

Exe программа на ассемблере

 

Для комментирования необходимо авторизоваться