Знакомство с ассемблером на примере NASM. Вывод на экран в текстовом режиме

nasm1. Описание. Расширенный ассемблер NASM (Netwide Assembler) – это 80×86 ассемблер, поддерживает широкий диапазон форматов объектных файлов, включая форматы Linux a.out и ELF, NetBSD/FreeBSD, COFF, Microsoft 16-bit OBJ и Win32. Кроме этого способен также создавать простые бинарные файлы. Поддерживает инструкции Pentium, P6 и MMX, а также имеет макро-расширения.

Для ассемблирования файла необходимо ввести следующую команду: 
nasm -f <format> <filename> [-o <output>]

Здесь <format> – ключ формата создаваемого файла, <filename> – имя исходного файла, <output> – имя создаваемого файла.

В рамках дисциплины будем работать в основном с файлами типа com, поэтому приведу команду для создания файла 1.com:

nasm.exe 01.asm -o 1.com

Замечание. Для удобства можно сделать bat-файл, который будет создавать com-файлы.

Рассмотрим 1-й пример, выводящий фразу «Hello». Для этого необходимо набрать следующий код:

org 100h
start:
mov ah,9
mov dx, message
int 21h
ret
message db «Hello», 0dh, 0ah, «$»

Замечание. 1. Чтобы убедиться, что предложенная программа Вам понятна, модифицируйте ее так, чтобы фраза Hello выводилась два раза (переменную message не изменять).
2. Чтобы увидеть назначение знака $ скомпилируйте программу без него.

В комплект пакета NASM входит также программа ndisasm.exe для проведения дизасемблирования. Изучите дизасемблированный код.

2. Вывод данных на экран средствами MS-DOS. Средства MS-DOS вывода на экран позволяют перенаправлять ввод с использованием знаков > и >>. Функции MS-DOS вызываются с использованием прерывания 21h. На примере первой программы на ассемблере мы уже познакомились с одним из способов вывода текста на экран – вызовом функции DOS 09h. Кроме указанной есть и другие.

Функция DOS 02h. Записать символ в STDOUT с проверкой на Ctrl-Break.
Ввод: АН = 02h
DL = ASCII-код символа
Вывод: Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h).

Эта функция при выводе на экран обрабатывает некоторые управляющие символы, например, вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.

Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое осуществляет выход из программы.

Функция DOS 06h. Записать символ в STDOUT без проверки на Ctrl-Break
Ввод: АН = 06h
DL = ASCII-код символа (кроме FFh)
Вывод: Никакого, согласно документации, но на самом деле: AL = код записанного символа (копия DL).

Функция DOS 09h. Записать строку в STDOUT с проверкой на Ctrl-Break
Ввод: АН = 09h
DS:DX = адрес строки, заканчивающейся символом $ (24h)
Вывод: Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа).

Функция DOS 40h. Записать в файл или устройство
Ввод: АН = 40h
ВХ = 1 для STDOUT или 2 для STDERR
DS:DX = адрес начала строки
СХ = длина строки
Вывод: CF = 0,
АХ = число записанных байт.

Эта функция предназначена для записи данных в файл, но, если в регистр ВХ поместить число 1, функция 40h будет выводить данные на STDOUT, а если ВХ = 2 — на устройство STDERR. STDERR всегда выводит данные на экран и не перенаправляется в файлы.

Использование недокументированного прерывания 29h.
INT 29h: Быстрый вывод символа на экран
Ввод: AL = ASCII-код символа
В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS «вывод символа на экран в режиме телетайпа», так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.

При подготовке материала использована книга С.В.Зубкова «Assembler. Язык неограниченных возможностей«.

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

2 комментария к “Знакомство с ассемблером на примере NASM. Вывод на экран в текстовом режиме”

Комментарии закрыты.