Создание и отладка программы на Ассемблере

Создание и отладка программы на Ассемблере

Цель работы:

- ознакомление со структурой программы на языке Ассемблер;

- приобретение навыков работы со средствами разработки программ на Ассемблере для IBM-совместимых ЭВМ

- изучение основных команд процессора i8086 (пересылки данных, арифметики) и директив определения данных языка Ассемблер;

Основные положения

!!!Предварительно следует ознакомиться со структурой процессора и сегментной организацией памяти ОС MS-DOS (файлы Ассемблер.doc или asm_lab.doc).

Инструментальные средства разработки программы на Ассемблере

 
  Создание и отладка программы на Ассемблере - student2.ru

Инструментальные средства или системы программирования (СП), предназначены для автоматизации работы пользователя по подготовке и отладке программ. Фактически это комплекс программ или интегрированная среда, объединяющая несколько программ. Основу большинства систем программирования составляют 3 компонента: транслятор, редактор связей и отладчик. Последовательность работ по созданию программ на языке Ассемблер с помощью этих инструментальных средств отображена на рис.1.1.

Рис.1.1 Процесс разработки ПО на Ассемблере

С помощью редактора текста (Microsoft Word, NotePad или др.) создается исходный модуль программы – текстовый файл в коде ASCII, содержащий текст программы на исходном языке. Этому файлу присваивается расширение .asmдля Ассемблера. Транслятор переводит программу с языка программирования на язык машинных кодов и производит несколько модулей, в том числе объектный модуль с расширением .obj и текстовый файл, содержащий как программу на исходном языке, так и программу в кодах ЭВМ для просмотра (файл с расширением .lst). Транслятор с языка Ассемблер называется ассемблером. Редактор связей объединяет при необходимости полученный модуль с другими объектными модулями и приводит программу к виду, пригодному для загрузки в память и выполнения ее компьютером (загрузочный или исполняемый модуль с расширением .exe). Наконец, Отладчик загружает исполняемую программу в память ЭВМ и позволяет выполнить программу в режимах трассировки с отображением результатов, отладку в пошаговом режиме, в режиме с остановкой в любых отладочных точках программы. Промежуточным шагом на этапе создания исполняемого модуля может быть преобразование модуля с расширением .exe в модуль с расширением .comс помощью программы преобразователя EXE2BIN. Программы в форме .com занимают меньше места в памяти, поэтому они предпочтительнее в тех случаях, когда программа должна быть резидентной, то есть должна постоянно находиться в памяти.

Существует несколько вариантов СП для Ассемблера. Наиболее популярны из них система фирмы Microsoft (ассемблер MASM, редактор связей LINK, отладчик SYMDEB [ ] ) и Turbo-система фирмы Borland (ассемблер TASM, редактор связей TLINK и мощный отладчик TD [ ]).

Каждая программа должна быть обязательно оформлена в соответствии с требованиями выбранного ассемблера.

Mov DS,AX

… ; Текст программы.

mov AH,4Ch ; Выход из программы

int 21h; в DOS.

myproc endp;

cseg ends; Конец сегмента программы.

Stacksegment stack ‘stack’; Организация

dw 128 dup (0); сегмента

stack ends; стека.

end myproc ; Конец программы

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

Рассмотрим структуру программы. Оператор title позволяет следующий за ним текст вывести во все страницы листинга программы в качестве заголовка. Комментарии указываются после знака «;».

Программа состоит из трех сегментов: программного cseg, сегмента данных data и сегмента стека stack. Имена сегментам даются произвольно. Каждый сегмент открывается оператором segment и закрывается оператором ends. Перед обоими операторами должно стоять имя сегмента. Порядок описания сегментов в большинстве случаев значения не имеет, но предпочтительнее данные, используемые в программе, располагать перед текстом программы.

Слова ‘code’ и ‘stack’ указывают на класс сегментов. Сегменты, принадлежащие одному классу, загружаются в память рядом. Когда в памяти используется один сегмент данного класса, этот указатель не обязателен, но для программы – компоновщика LINK необходимо указать класс ‘code’.

Текст сегмента данных в этом примере начинается с одной из типичных команд работы с данными. Команда

String db “строка данных”,”$”

определяет строку, значение которой приведено в кавычках, знак доллара необходим для указания конца строки. По этой команде в памяти выделяется место и в эту область заносится текст «строка данных».

Текст программного сегмента начинается с обязательного оператора assume, который позволяет транслятору сопоставить сегментные регистры и символические имена сегментов.

Собственно программа обычно состоит из процедур. Деление программы на процедуры не обязательно, но повышает ее наглядность и облегчает передачу управления подпрограммам и другим программным модулям. В примере программа содержит единственную процедуру myproc, открываемую оператором proc и закрываемую оператором endp c обязательным указанием имени процедуры. Последние две команды программного сегмента

mov ah,4Ch

int 21h

используются для организации возврата в DOS после выполнения программы. При этом вызывается процедура DOS с номером 21h (здесь h указывает на то, что код 21 представлен в 16-тиричном виде) и используется функция 4C, шестнадцатеричный номер которой помещается в регистр АН. Процедура завершает текущий процесс, возвращая указанный код завершения родительскому процессу. В процессе завершения освобождает всю выделенную процессу память, сбрасывает на диск буферы, закрывает все открытые дескрипторы и переда­ет управление обработчику завершения процесса.

В сегментный регистр данных DS данные загружаются через регистр общего назначения AX. В в регистры CS и SS данные загружаются автоматически.

Для правильности выделения стека и автоматической инициализации регистра сегмента стека СS в строке описания сегмента стека необходимо указать параметр stack и класс ‘stack’. Для сегмента стека в программе зарезервировано 128 слов памяти с помощью оператора dw. Для программ, не осуществляющих операций со стеком, определение регистра SS и выделение сегмента стека необязательны. Текст программы заканчивается обязательной директивой end.

Пример программы (. ехе-файл), реализующей вычисление функции у=(a+d)*c/d:

; Вычисление функции у=(а+b)*c/d

; Формат данных – слово.

; ************************************************************

stseg segment para stack 'stack' ;задание сегмента стека

dw 16 dup(?) ; резервирование 16 слов памяти под стек

stseg ends

;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

dseg segment para ;задание сегмента данных

a dw 10

b dw 20

c dw 30

d dw 30

y dw ? ;результат (2 байта)

ostd dw ? ;остаток от деления

dseg ends

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

cseg segment para ;начало сегмента кода

lab1 proc far ; вызов процедуры

assume cs: cseg, ds: dseg,ss: stseg

push ds

mov ax,0

push ax

mov ax,dseg

mov ds,ax

;––––––––––––––––––––––– текст программы ––––––––––––––––––––––––

mov ax,a ; (a)

add ax,b ; (a+b)

imul c ; (a+b)*c

idiv d ;(a+b)*c

mov y,ax ; запись результата в память

mov ost,dx ; запись остатка в память

ret ;возврат изпроцедуры

lab1 endp; конец описания процедуры

cseg ends ; конец сегмента кода

;–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

end lab1 ; конец программы

;************************************************************

Ret

mov ah,4ch ;завершение выполнения программы

Int 21h

endlab1

Оформление программы типа .com с использованием модели памяти:

.model tiny;модель памяти для .com-программы

.code ; начало сегмента

org 100h ; под нужды ОС выделяется 256 байтов в

; начале сегмента

lab1proc far

movax,a

subax,b

imulc

idivd

movy,ax

movost,dx

Ret

adw10

bdw20

cdw30

ddw30

ydw?

ostdw?

lab1endp

endlab1

Пример отладки программы в отладчике AFDPro:

       
  Создание и отладка программы на Ассемблере - student2.ru
    Создание и отладка программы на Ассемблере - student2.ru
 


AX 0009 SI 0000 CS 2C8D IP 001A Stack +0 0000 Flags 3284 BX 0000 DI 0000 DS 2C8C +2 2C7A CX FFF6 BP 0000 ES 2C7A HS 2C7A +4 0003 OF DF IF SF ZF AF PF CF DX FFFF SP 001C SS 2C8A FS 2C7A +6 0002 0 0 1 1 0 0 1 0 +------------------------------------------------------------------------------- ¦CMD > ¦ 1 0 1 2 3 4 5 6 7 +------------------------------------------02-¦ DS:0000 0A 00 14 00 1E 00 1E 00 0017 A10600 MOV AX,[0000] ¦ DS:0008 00 00 00 00 00 00 00 00 001A F63E0800 ADD AX,[0002] ¦ DS:0010 1E B8 00 00 50 B8 8C 2C 001E 03C1 IMUL W/[0004] ¦ DS:0018 8E D8 A1 00 00 03 06 02 0020 A30900 IDIV W/[0006] ¦ DS:0020 00 F7 2E 04 00 8B C8 A1 0023 89160B00 MOV [0008],AX ¦ DS:0028 06 00 F6 3E 08 00 03 C1 0027 CB MOV [000A],DX ¦ DS:0030 A3 09 00 89 16 0B 00 CB 0028 0000 RET Far ¦ DS:0038 00 00 00 00 8F 4E 00 00 002A 0000 ADD [BX+SI],AL ¦ DS:0040 00 20 00 00 00 00 00 00 002C 8F ADD [BX+SI],AL ¦ DS:0048 00 00 00 00 00 00 00 00 -------------------------------------------------------------------------------- 2 0 1 2 3 4 5 6 7 8 9 A B C D E F ¦ DS:0000 03 00 02 00 FE FF 09 00 02 00 00 00 00 00 00 00 ¦....__.. ........ DS:0010 1E B8 00 00 50 B8 8C 2C 8E D8 A1 00 00 03 06 02 ¦.+..P+М, О+б..... DS:0020 00 F7 2E 04 00 8B C8 A1 06 00 F6 3E 08 00 03 C1 ¦.ў...Л+б ..Ў>...- DS:0030 A3 09 00 89 16 0B 00 CB 00 00 00 00 8F 4E 00 00 ¦г..Й...- ....ПN.. DS:0040 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ¦. ...... ........ -------------------------------------------------------------------------------- 1 Step 2ProcStep 3Retrieve 4Help ON 5BRK Menu 6 7 up 8 dn 9 le 10 ri  

Создание и отладка программы на Ассемблере - student2.ru Создание и отладка программы на Ассемблере - student2.ru

Лабораторное задание

Задание 1.Разработать программу вычисления функции y=f(a,b,c,d). Формат данных – байт, слово. Данные задаются в программе с помощью директив DBиDW. Результат записать в память. Правильность работы программы проверить с помощью отладчика.

Оформить программу в виде файлов типа .ехе для операндов-слов.

Программу следует набрать в любом текстовом редакторе, создающем файл в ASCII-кодах, (например, с помощью Блокнота) и сохранить с именем, например, Lab1.asm.

Пусть для работы с программой используются транслятор Tasm, редактор связей Tlink и отладчик AFD. Настройте в свойствах этих программ снятие флажка Закрывать окно по завершении работы на вкладке Программа. Для удобства работы можно разместить эти программы и программу Lab1.asm в одном каталоге.

Откомпилировать c получением листинга:

набрать в командной строке Total Commander:

Tasm.exe /l Lab1.asm

Если ошибок при компиляции не обнаружено, будут созданы файлы листинга Lab1.lst и объектного кода Lab1.obj.

Получить исполняемый файл, запустив Редактор связей:

Tlink.exe Lab1.obj

Запустить отладчик:

AFD.exe Lab1.exe

В процессе отладки использовать несколько тестовых наборов исходных данных: операнды должны быть как положительные, так и отрицательные. Результаты отладки зафиксировать в файле протокола. Для отчета представить листинг программы c комментариями и распечатку файла протокола отладки. Варианты заданий представлены в таблице1.

Таблица 1. Варианты заданий.
Вариант Функция Вариант Функция
y=a+b-c/d*e y=(a+b)*c-d/e
y=a-b/c+d*e y=a*b/c-d*e
y=a*b+c/d-e y=a+b-c+d/e
y=a/b+c-d*e y=(a+b)/c-d*e
y=(a-b+c)/d*e y=a-b/c*d+e
y=a-b+c/d*e y=(a-b)+c/d+e

Задание 2.Настроить среду Asm Editor на работу с программами Tasm, Tlink и AFD.

Кнопку трансляции свяжите с .bat-файлом, который

· запускает Tasm с параметром, указывающим на исходную программу,

· если трансляция прошла успешно, запускает Tlink для создания объектного файла, в противном случае открывает Блокнот с листингом программы.

Оформить разработанную в соответствии с Заданием 1 программу в виде .сом –программы, используя операнды-байты. Отладить программу.

Отчет должен содержать листинги программ и окна отладки программ на момент окончания их выполнения.

Создание и отладка программы на Ассемблере

Цель работы:

- ознакомление со структурой программы на языке Ассемблер;

- приобретение навыков работы со средствами разработки программ на Ассемблере для IBM-совместимых ЭВМ

- изучение основных команд процессора i8086 (пересылки данных, арифметики) и директив определения данных языка Ассемблер;

Основные положения

!!!Предварительно следует ознакомиться со структурой процессора и сегментной организацией памяти ОС MS-DOS (файлы Ассемблер.doc или asm_lab.doc).

Наши рекомендации