
- •Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение
- •«Комсомольский-на-Амуре государственный технический университет»
- •1 Основные сведения
- •1.1 Структура программы на Ассемблере
- •1.1.1 Программа типа сом
- •1.1.2 Программа типа ехе
- •1.2 Порядок работы с tasm. Создание exe-файла
- •1) Редактирование
- •2) Ассемблирование
- •3) Компоновка
- •4) Выполнение
- •1 0000 .Model small
- •2 Задание к лабораторной работе
2 Задание к лабораторной работе
Создать программу, выводящую на экран сообщение "Privet!".
Введите в текстовом редакторе следующие строки программы:
DOSSEG
.MODEL SMALL ; модель памяти
.STACK 100h ; сегмент стека размером 100h
.DATA ; сегмент данных
Mes DB ' Privet!',13,10,'$' ; выводимое сообщение с управляющими
;символами перевода строки, возврата каретки и конца строки
.CODE ; сегмент кода
main proc ; начало процедуры main
mov ax,@Data ; загрузка адреса сегмента данных
mov ds,ax ; установить регистр DS таким образом,
;чтобы он указывал на сегмент данных
mov ah,9 ; функция DOS вывода строки
mov dx,OFFSET Mes ; ссылка на сообщение " Privet!"
int 21h ; вывести " Privet!" на экран
mov ah,4ch ; функция DOS завершения программы
int 21h ; завершить программу
main endp ; конец процедуры main
end main ; конец программы с точкой входа main
В программе используется функция 09h прерывания DOS 21h для вывода строки символов на монитор. Строка должна заканчиваться символом $, который является признаком конца выводимой информации.
Сохраните введенную программу на диске под именем HELLO.ASM. Затем нужно преобразовать программу в выполняемый вид. Это потребует двух дополнительных шагов - ассемблирования и компоновки.
На этапе ассемблирования ваш исходный код (текст программы) превращается в промежуточную форму, которая называется объектным модулем, а на этапе компоновки один или несколько модулей комбинируются в выполняемую программу.
Для ассемблирования файла HELLO.ASM наберите команду:
TASM hello
и нажмите клавишу ENTER. Если вы не задали другое имя, файл HELLO.ASM будет ассемблирован в файл HELLO.OBJ. Заметим, что расширение имени файла вводить не требуется. Турбо Ассемблер подразумевает в этом случае, что файл имеет расширение .ASM. На экране вы увидите следующее:
Turbo Assembler Version 4.1 Copyright (c) 1996 Borland International (1)
Assembling file: hello.ASM (2)
Error messages: None (3)
Warning messages: None (4)
Passes: 1 (5)
Remaining memory: 417k (6)
1 - Турбо Ассемблер, версия 4.1; авторские права фирмы Borland, 1996 г.; 2 - ассемблирован файл HELLO.ASM; 3 - сообщения об ошибках: нет; 4 - предупреждающие сообщения: нет; 5 – один проход; 6 - остается памяти: 417К.
Если вы введете файл HELLO.ASM в точности так, как показано, то вы не получите никаких предупреждающих сообщений или сообщений об ошибках. Если вы получаете такие сообщения, они появляются на экране наряду с номерами строк, указывающими строки, где содержатся ошибки. При получении сообщений об ошибках проверьте исходный код (текст) программы и убедитесь, что он выглядит точно так, как исходный код в нашем примере, а затем снова ассемблируйте программу.
При наличии ошибок очень полезным бывает листинг ассемблированной программы, который помогает не только локализовать и идентифицировать синтаксические ошибки, найденные ассемблером, но и выявлять логические ошибки и прослеживать выполнение программы на этапе отладки. Получить файл листинга HELLO.LST можно, если при вызове ассемблера задать в командной строке параметр /l:
tasm /l hello.
Еще раз выполните ассемблирование файла HELLO.ASM с созданием листинга.
Для наглядности дальнейшей отладки программы удобно иметь информацию об оригинальных идентификаторах программы для отладки. Для этого при вызове ассемблера нужно задать в командной строке параметр /zi:
tasm /zi hello.
Можно сразу задавать в командной строке несколько параметров, разделяя их пробелом:
tasm /l /zi hello.
После ассемблирования файла HELLO.ASM вы продвинулись только на один шаг в процессе создания программы. Теперь, если вы скомпонуете только что полученный объектный код в выполняемый вид, вы сможете запустить программу.
Для компоновки программы используется программа TLINK, представляющая собой поставляемый вместе с ТурбоАссемблером компоновщик. Введите командную строку:
TLINK HELLO.
Здесь опять не требуется вводить расширение имени файла. TLINK по умолчанию предполагает, что этим расширением является расширение .OBJ. Когда компоновка завершится (самое большее через несколько секунд), компоновщик автоматически присвоит файлу с расширением .EXE имя, совпадающее с именем вашего объектного файла (если вы не определили другое имя). При успешной компоновке на экране появляется сообщение:
Turbo Linker Version 3.0 Copyright (c) 1987, 1990 by Borland International Inc.
В процессе компоновки могут возникнуть ошибки (в данной программе это маловероятно). Если вы получили сообщения об ошибках компоновки (они выводятся на экран), измените исходный код программы так, чтобы он в точности соответствовал тексту программы в приведенном выше примере, а затем снова выполните ассемблирование и компоновку.
Наряду с объектным файлом TLINK создает MAP-файл (файл перекрестных ссылок - HELLO.MAP),содержащий таблицу имен и размеров сегментов и ошибки, которые обнаружит TLINK.
Запустите программу на выполнение и наблюдайте на экране сообщение «Privet!». Повторим ключевые моменты создания исполнимой программы на ассемблере.
Файл HELLO.ASM - это стандартный текстовый файл в коде ASCII. Его можно отредактировать с помощью текстового редактора.
Когда вы ассемблируете файл HELLO.ASM, Турбо Ассемблер превращает текст инструкций в этом файле в их двоичный эквивалент в объектном файле HELLO.OBJ. Этот файл является промежуточным файлом в процессе перехода от текстового к выполняемому файлу. Файл HELLO.OBJ содержит всю информацию, необходимую для создания выполняемого кода из инструкций, содержащихся в файле HELLO.ASM, но она записана в виде, который позволяет комбинировать ее с другими объектными файлами для создания одной программы.
При компоновке файла HELLO.OBJ утилита TLINK преобразует его в выполняемый файл HELLO.EXE, который вы запускаете, введя “hello” в ответ на подсказку DOS.
Теперь введите команду:
dir hello.*.
При этом будет выведен список файлов HELLO на диске. Это будут файлы HELLO.ASM, HELLO.OBJ, HELLO.LST, HELLO.EXE и HELLO.MAP.
Теперь снова войдем в редактор и модифицируем программу таким образом, чтобы она могла воспринимать какие-то данные из внешней среды (этой "внешней средой" будете вы, а вводимые данные будут набираться на клавиатуре). Измените программу следующим образом:
DOSSEG
.MODEL SMALL ;модель памяти
.STACK 100h ; сегмент стека размером 100h
.DATA ;сегмент данных
Time DB 'Eto wremja posle poludnja? (ДА/НЕТ) - [Y/N]$'
GoodMorn DB 13, 10, 'Dobroje utro!', 13, 10, '$'
GoodAftern DB 13,10, 'Sdrawstwuite!', 13, 10, '$'
.CODE ; сегмент кода
main proc ; начало процедуры main
mov ax, @Data
mov ds, ax ; установить регистр DS таким
; образом, чтобы он указывал
; на сегмент данных
mov dx, OFFSET Time ; ссылка на сообщение-запрос
mov ah, 9 ; функция DOS вывода строки
int 21h
mov ah, 01 ; функция ввода символа с ожиданием
int 21h ; получить ответ из одного символа
cmp al, 'Y' ; сравниваем с прописной буквой Y
jz IsAftern ; переход, если указано Y
cmp al, 'y' ; сравниваем со строчной буквой y
jnz IsMorn ; переход, если указано N
IsAftern: ; метка
mov dx, OFFSET GoodAftern ; указывает на "Здравствуйте"
jmp Displ ; переход на вывод ответа
IsMorn: ; метка
mov dx, OFFSET GoodMorn ; указывает на "Доброе утро"
Displ: ; метка
mov ah, 9 ; функция DOS вывода сообщения
int 21h ; вывести соответствующее сообщение
mov ah, 01h ; функция ввода символа с ожиданием
int 21h ; ожидание нажатия любой клавиши
mov ah, 4ch ; функция DOS завершения программы
int 21h ; завершить программу
main endp ; конец процедуры main
end main ; конец программы с точкой входа main
Таким образом, вы добавили в программу два очень важных новых средства: возможность ввода и принятие решений. Эта программа запрашивает у вас, является ли вводимое время временем после полудня, воспринимая ответ (один символ) с клавиатуры. Если таким ответом будет буква Y в верхнем или нижнем регистре (что означает ответ ДА), то программа выводит сообщение "Здравствуйте!", в противном случае выводится сообщение "Доброе утро!". В данной программе имеются все основные элементы полезной программы: ввод информации из внешней среды, обработка данных и принятие решения.
Сохраните эту модифицированную программу на диске. После этого заново ассемблируйте и скомпонуйте программу, как в предыдущем примере. Запустите ее снова, введя hello в ответ на подсказку DOS. Выведется сообщение:
Это время после полудня? (ДА/НЕТ) - [Y/N].
Курсор будет мерцать у последнего символа в ожидании ввода
ответа. Нажмите Y. Программа ответит:
Здравствуйте!
Таким образом, HELLO.ASM стала теперь интерактивной программой с принятием решений.
В ходе ассемблирования вы можете получить различные сообщения об ошибках из-за неправильного набора программы и ошибках в синтаксисе. Турбо Ассемблер перехватывает такие ошибки, сообщая о них. Выводимые сообщения об ошибках разбиваются на две категории: предупреждения и ошибки. Если Турбо Ассемблер обнаруживает что-то подозрительное, но необязательно неверное, он выводит предупреждающее сообщение. Иногда предупреждающие сообщения можно игнорировать, но всегда лучше их проверить и убедиться в том, что вы понимаете суть проблемы. При обнаружении чего-либо явно неправильного в вашей программе, что делает невозможным завершение ассемблирования и формирование объектного файла, Турбо Ассемблер выводит сообщение об ошибке.
Другими словами, предупреждающие сообщения не свидетельствуют о критических ситуациях, в то время как обнаруженные ошибки должны быть исправлены перед запуском программы.
Как и любой язык программирования, Турбо Ассемблер не может распознавать ошибки в логике программы. Турбо Ассемблер только сообщает вам, может ли ваш ассемблируемый код быть выполнен в том виде, как он введен, но он не может сделать вывод о том, будет ли программа работать так, как вы этого хотите. Об этом можете судить только вы сами.
Для закрепления материала разработаем программу, выводящую на экран многоцветную наклонную линию длиной в 400 точек. Графический видеорежим с номером 12h устанавливаем с помощью функции 00h прерывания BIOS 10h. В данном режиме видеокарта настраивается на разрешение 640 на 480 пикселей с использованием 16 цветов. Вывод одного пикселя выполняем с помощью функции 0Ch прерывания BIOS 10h. Код цвета заносится в регистр AL, номер страницы в BH, номер столбца в CX, а строки в DX. Начало координат находится в левом верхнем углу экрана.
Текст программы приведен ниже.
DOSSEG
.MODEL SMALL ; модель памяти
.STACK 100h ; сегмент стека размером 100h
.DATA ; сегмент данных
CWET DB 0 ; байтовая переменная кода цвета
X DW 0 ; словная переменная координаты X
Y DW 0 ; словная переменная координаты Y
N DW 400 ; словная переменная счетчика числа точек
.CODE ; сегмент кода
main proc ; начало процедуры main
mov ax, @Data ; загрузка адреса сегмента данных
mov ds, ax ; установка DS таким на сегмент данных
mov ah, 00 ; функция BIOS установки видеорежима
mov al, 12h ; графический режим 640х480
int 10h ; вызов прерывания
M1: mov ah, 0Ch ; функция BIOS вывода пикселя
mov al, CWET ; код цвета точки
mov bh, 00 ; страница 0
mov cx, X ; координата X
mov dx, Y ; координата Y
int 10h ; вызов прерывания
inc CWET ; увеличить код цвета на 1
and CWET, 0Fh ; стереть старшую тетраду
inc X ; увеличить координату X на 1
inc Y ; увеличить координату Y на 1
dec N ; декремент счетчика точек
jnz M1 ; следующий цикл вывода точки
mov ah, 01h ; функция DOS ввода символа с ожиданием
int 21h ; вызов прерывания
mov ah, 4ch ; функция DOS завершения программы
int 21h ; завершить программу
main endp ; конец процедуры main
end main ; конец программы с точкой входа main
Создайте исполнимую программу и проверьте ее работу.
Получите у преподавателя вариант задания и разработайте оригинальную программу. Покажите, как она работает.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1) Каково назначение программ tasm.exe, tlink.exe?
2) Опишите действия, необходимые для создания исполняемой программы в EXE-формате.
3) Какую структуру имеет EXE-файл?
4) Какие стандартные прерывания DOS и BIOS можно использовать для вывода текстовой и графической информации? Как правильно вызвать эти прерывания?
Библиографический список
1 Лямин Л.В. Макроассемблер MASM – М.: Радио и связь, 1994. – 320 с.
2 Абель П. Язык Ассемблера для IBM PC и программирования /Пер. с англ. Ю.В. Сальникова. – М.: Высш. шк., 1992 – 447 с.
3 Пильщиков В.Н. Программирование на языке ассемблера IBM PC. – M.: Диалог – МИФИ, 1997.
4 Фролов А.В., Фролов Г.В. Аппаратное обеспечение IBM PC: В 2-х ч.: – М.: Диалог – МИФИ, 1998.
5 Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. – 352 с.
6 Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996.
7 Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. – 637 с
8 Юров В.И. Assembler: Специальный справочник. – СПб: Питер, 2000.
9 Юров В.И. Assembler: практикум. – Санкт-Петербург: Питер, 2003. – 400 с.
10 Пирогов В.Ю. Ассемблер на примерах. – СПб.: БХВ-Петербург, 2005. - 416 с.
11 Пирогов В.Ю. Ассемблер для Windows. – 3-е изд. – СПб.: БХВ-Петербург, 2005. – 864 с.
12 Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К. Масловского. – Москва: Мир, 1988. – 405 с.
13 Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. – 288 с.