Главная / Ассемблер / Примеры (исходники) /

Как вывести строку на экран в Ассемблере


Лучшие книги по Ассемблеру Лучшие книги по Ассемблеру

Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится. Подробнее...

Что бы ни делала ваша программа, в большинстве случаев она должна выводить какие-то данные на экран. И если в языках высокого уровня это делается “лёгким движением руки”, то в ассемблере для этого приходится как следует помучиться.

Правда, в современных воплощениях языка Ассемблера могут быть стандартные макросы или подпрограммы для вывода строк на экран. Однако начинающим будет полезно разобраться с тем, как это можно сделать только с помощью инструкций, без применения каких-либо облегчающих жизнь библиотек.

Итак, выводить строки на экран можно двумя путями:

  1. Посимвольно (то есть в цикле выводить каждый символ строки).
  2. Строку целиком.

Кроме того, в текстовом режиме вывод на экран можно выполнить одним из трёх способов:

  1. С помощью функций DOS.
  2. С помощью функций BIOS.
  3. Путём прямой записи в видеопамять.

Третий способ хорош тем, что он сразу записывает данные в видеопамять, что позволяет выполнять вывод более быстро. Однако в наше время он применим, разве что, в учебных целях. Потому что современные операционные системы не позволяют напрямую обращаться к “железу”.

Поэтому, если ваша программа является чуть более, чем учебной, то придётся применять один из первых двух способов. Ну а если вам интересно, как выполнить вывод непосредственно в видеопамять, то посмотреть примеры вы можете здесь или здесь.

Функции вывода DOS

Итак, начнём с функций вывода DOS. Эти функции являются функциями операционной системы DOS, но поддерживаются и операционными системами Windows.

Как я уже говорил, можно напечатать на экране строку в цикле, отдельно выводя каждый символ. Для этих целей можно использовать функции 02h, 06h или недокуметированное прерывание 29h.

Если требуется вывести на экран строку целиком, то можно применить функции 09h и 40h.

Для использования функций DOS надо сначала подготовить необходимые данные, записать номер функции в регистр AH, а затем вызвать прерывание 21h.

Все функции рассматривать здесь не будем. Для примера используем одну из самых простых функций DOS - функцию 09h, которая выводит в стандартное устройство вывода (в нашем случае - на экран) строку, адрес которой находится в DS:DX. Строка должна заканчиваться символом $, иначе функция не поймёт, где конец строки, и программа будет выводить много-много символов из памяти, начиная с указанного адреса. Примерно так, как показано на рисунке:

Неправильное использование функции DOS 09h

Пример:

;==========================================================
; Эта программа выводит на экран строку "Hello, World!!!" 
; с помощью функции DOS 09h
;----------------------------------------------------------
	.model	tiny
	.code
	ORG	100h                ;начало СОМ-файла
		
start:	
  MOV	AH,	09h             ;Номер функции 09h
  MOV	DX,	offset stroka   ;Адрес строки записываем в DX
  INT	21h
  RET                     ;завершение СОМ-файла	
	
stroka	DB	'Hello, World!!!$'  ;Строка для вывода	
  END 	start
;==========================================================

При правильном использовании на экран будет выведено примерно следующее:

Правильное использование функции DOS 09h

Функции вывода BIOS

Функции BIOS также могут выводить как отдельные символы (функции 09h, 0Ah, 0Eh), так и строки целиком (функция 13h).

Кроме того с помощью функций BIOS можно установить видеорежим, установить или считать положение курсора, а также считать символ и его атрибуты.

Хотя функции DOS тоже могут считывать символы, но всё-таки возможности BIOS более широки.

Для работы с функциями BIOS также сначала надо подготовить данные, записать номер функции в регистр AH, а затем вызвать прерывание 10h.

Для примера рассмотрим функцию 13h. Перед вызовом функции надо:

  • Записать номер функции в регистр АН.
  • Записать режим вывода в регистр AL:
    • бит 0: переместить курсор в конец строки после вывода.
    • бит 1: строка содержит не только символы, но и атрибуты. Так что каждый символ описывается двумя байтами - ASCII-код и атрибут. Это можно использовать, если в строке символы должны иметь, например, разный цвет. Если атрибуты одинаковы для всей строки, то этот бит лучше сбросить (обнулить).
    • биты 2-7: не используются.
  • Записать длину строки в регистр СХ (только число символов, байты атрибутов не учитываются).
  • Если строка содержит только символы, то записать в регистр BL атрибут. Этот атрибут будет применяться для всей строки.
  • Записать координаты экрана, начиная с которых будет выводиться строка, в регистры DL (столбец - координата Х) и DH (строка - координата Y).
  • Записать адрес начала строки в ES:BP.

Пример:

;==========================================================
; Эта программа выводит на экран строку "Hello, World!!!" 
; с помощью функции BIOS 13h
;----------------------------------------------------------
	.model	tiny
	.code
	ORG	100h          ;начало СОМ-файла
		
start:	
  MOV    AH,  13h             ;Номер функции 13h
  MOV    AL,  1               ;Перевести курсор в конец строки
  MOV    CX,  15              ;Длина строки
  MOV    BL,  00011110b       ;Жёлтый текст на синем фоне
  MOV    DL,  5               ;Координата Х
  MOV    DH,  2               ;Координата Y
  MOV    BP,  offset stroka   ;Адрес строки записываем в DX
  INT    10h
  RET                         ;завершение СОМ-файла	
	
stroka   DB	'Hello, World!!!' ;Строка для вывода	
  END    start
;==========================================================

Использование функции BIOS 13h

Рассказывать об остальных функциях, а также об установке атрибутов и прочих вещах сегодня не буду. Если кому интересно, то всё это можно найти в справочных материалах.



Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su