ЛАБОРАТОРНАЯ РАБОТА 1. Типы данных в языке Ассемблера. Структура программы на языке Ассемблера. Использование средств создания и отладки программ на языке Ассемблера.
Васюткина И.А. – «Методические указания для проведения лабораторных работ по курсу «Программирование на языке низкого уровня» для студентов ИТИ, обучающихся по специальности «Программное обеспечение вычислительной техники и автоматизированных систем». Методические указания. – Тирасполь, 2008. – 2 п.л.
Предлагаемые методические указания для проведения лабораторных работ по курсу «Программирование на языке низкого уровня» подготовлены в соответствии с программой соответствующей дисциплины, изучаемой студентами ИТИ. Данная работа имеет своей целью помочь студентам в освоении методов разработки и написания программ на языке Ассемблера микропроцессоров семейства intel х86, привить навыки отладки программ, а также закрепить знания синтаксиса языка Ассемблер.
Рекомендовано к опубликованию в электронном виде методической комиссией инженерно-технического института и научно-методическим советом ПГУ, протокол № ________от _________.
ISBN © Васюткина И.А., 2008 г.
Директивы описания данных в программе
При использовании переменных необходимо определить место в программе, где будет храниться переменная (в каком сегменте программы для нее будет выделена память), ее имя и тип этой переменной.
Каждая переменная в программе должна иметь уникальное имя, с помощью которого и задается адрес этой переменной в программе. Если в программе известно имя переменной, то всегда можно определить ее адрес.
а) определение констант
Для этого в языке ассемблера можно использовать два псевдооператора.
- <name> equ <выражение>
В качества выражения можно использовать числовую константу, произвольный текст, математическое выражение
сount equ cx
length equ 80
numb equ 80+120
Максимальная длина выражения может быть равной 255 символов.
- Псевдооператор =
<name> = <выражение>
Выражение может быть только числовым.
length = 128
length = 128 + 24
length = length — 128
б) определение переменных
<name> <type> <val1>,<val2>,….
1)определение переменной в 1 байт
<name> db <val> диапазон значений +-127 или 0-256
.data
b1 db ?
b2 db 20h+41h
b3 db ‘a’
b4 db 0dh,2h,4h
b5 db “this is a message”
Если известно, что все элементы в начале работы программы будут иметь одинаковые значения, то можно их описать следующим образом
<name> <type> N dup(<val>)
b6 db 10 dup(?)
2)определение слова диапазон значений +-32767 или 0-65535
<name> dw <val>
3)определение двойного слова диапазон значений ±2147483648 или 0÷4294967295
<name> dd <val>
4)определение 6 байт
<name> df <val>
5)определение 8 байт
<name> dq <val>
6)определение 10 байт
<name> dt <val>
СОЗДАНИЕ ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА
Для создания программы на языке Ассемблера необходимо наличие любого текстового редактора, а также программы компилятора TASM.EXE и программы для компоновки объектного кода TLINK.EXE.
Процесс создания программы на языке Ассемблера можно разделить на три этапа:
— ввод программы;
— ассемблирование;
— компоновка.
Для создания программы на языке Ассемблера необходим любой текстовый редактор. Для программ на языке Ассемблера принято расширение .ASM.
Этап ассемблирования включает в себя трансляцию исходного кода в машинный объектный код и генерацию OBJ-модуля. Формат OBJ-модуля уже более приближен к исполнительной форме, но еще не готов к выполнению. Ассемблирование производится при помощи программы TASM.EXE.
Этап компоновки включает преобразование OBJ-модуля в COM либо EXE (исполнимый) модуль, содержащий машинный код. Компоновка производится при помощи программы TLINK.EXE.
СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА
- ВВОД И АССЕМБЛИРОВАНИЕ ПРОГРАММЫ.
1.1 Введите следующую программу и запишите ее на диск под именем LAB1. ASM.
title Структура .EXE программы
;———————————————
stacksg segment para stack ‘Stack’ ; сегмент стека
dw 32 dup(?) ; 32 слова выделено под стек
stacksg ends
;———————————————
datasg segment para ‘Data’ ; сегмент данных
message db ‘Hello, World!’,’$’
datasg ends
;———————————————
codesg segment para ‘Code’ ; сегмент кода
begin:
assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
push ds ; записать в стек ds
sub ax,ax ; обнулить ax
push ax ; записать в стек 0
mov ax,datasg ; занести в ax адрес datasg
mov ds,ax ; занести в ds содержимое ax
lea dx, message ; загрузка адреса строки
mov ah, 09h ; запись функции прерывания
int 21h ; вызов прерывания
; выход из программы
int 20h
codesg ends
end begin
1.2 Оттранслируйте введенную программу, задав следующую командную строку:
TASM LAB1.ASM
После трансляции TASM выдаст приблизительно следующее:
Turbo Assembler Version 3.2 Copyright (c) 1988, 1992 Borland International
Assembling file: lab1.asm
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 455k
Если в процессе трансляции были обнаружены ошибки, TASM выдаст соответствующее сообщение и укажет номер строки, в которой была обнаружена ошибка. Например:
Turbo Assembler Version 3.2 Copyright (c) 1988, 1992 Borland International
Assembling file: lab1.asm
*Warning* lab1.asm(11) Argument needs type override <—- предупреждение
**Error** lab1.asm(14) Illegal indexing mode <—— ошибка в строке 14
Error messages: 1 <—— имеется 1 ошибка
Warning messages: 1 <—— 1 предупреждение
Passes: 1 <—— 1 проход транслятора
Remaining memory: 431k
При успешной безошибочной трансляции TASM генерирует файл LAB1.OBJ.
1.3 Выполните компоновку полученной программы, введя следующую командную строку:
TLINK LAB1.OBJ
После компоновки на диске появится файл LAB1.EXE.
1.4 Запустите программу LAB1.EXE на исполнение.
1.5 Объясните результат и алгоритм действия программы по исходному тексту.
1.6 Запишите размер программы на диске.
1.7 Измените текст программы, так чтобы можно было получить программу с расширением *.COM. Пример программы п. 2.1.
1.8 Выполните компоновку полученной программы, введя следующую командную строку:
TLINK LAB1.OBJ/T
Ключ /T указывает компоновщику, что необходимо сгенерировать *.COM файл. При успешной компоновке на диске появится файл LAB1.COM.
Дополнительную информацию о ключах программ TASM.EXE и TLINK.EXE можно получить, запустив соответствующую программу с ключом /?.
1.8 Запустите программу LAB1.COM на исполнение.
1.9 Запишите размер программы на диске.
- ОТЛАДКА ПРОГРАММЫ ПРИ ПОМОЩИ ОТЛАДЧИКА Turbo Debugger.
2.1 Ввести программу, которая здоровается со всем миром.
Пример COM-программы:
codesg segment para ‘code’
assume cs:codesg, ds:codesg, ss:codesg, es:codesg
org 100h ; пропустить 256 байт
begin: jmp start
message db ‘Hello, World!’,’$’
start: lea dx, message ; загрузка адреса строки
mov ah, 09h ; запись функции прерывания
int 21h ; вызов прерывания
; выход из программы
mov ah, 4сh
int 21h
codesg ends
end begin
Отладчик Turbo Debugger (далее TD) предназначен для отладки и пошагового исполнения программ, написанных на языках Ассемблера, Pascal, C и т.п. Мы будем иcпользовать TD для отладки программы, написанной на языке Ассемблера.
2.1 Запуск TD и подготовка к отладке.
Запуск TD осуществляется вводом в командной строке команды TD.EXE. После запуска TD на экране появляется 5 окон: окно дизассемблера, регистров, флагов, верхушки стека и дампа памяти.
Перемещение между окнами осуществляется нажатием клавиши <Tab>.
Управление работой TD выполняется через систему меню. Существует 3 типа меню:
1) главное меню, занимающее верхнюю строку экрана и активизируемое в любой момент клавишей F10;
2) подменю, связанное с каждой из команд главного меню;
3) локальное меню, вызываемое нажатием Alt-F10 либо нажатием правой кнопки мыши. Оно контекстно-чувствительно, т.е. для каждого активного окна имеется свое локальное меню.
Для начала работы необходимо загрузить программу, которую нужно отладить. Для загрузки программы войдите в меню (F10), выберете пункт меню File | Open и загрузите файл LAB1.COM. После загрузки программы ее точка входа отмечается символом ‘►’.
Запишите в отчет содержимое всех регистров.
2.2 Трассировка программы.
Под трассировкой понимают пошаговое исполнение программы. TD способен выполнять трассировку программы в двух режимах: режим блочной трассировки и режим полной трассировки.
Блочная трассировка осуществляется нажатием клавиши <F8>. При этом процедуры, вызываемые по CALL и циклы (LOOP) выполняются без трассировки, в реальном времени.
Полная трассировка выполняет трассировку всех команд. Трассировка выполняется c адреса, содержащегося в IP. Для изменения этого адреса необходимо перейти в окно регистров, установить указатель ни регистр IP и ввести новое значение адреса.
Для удобства трассировки предусмотрена установка точек прерывания (Breakpoint). Применение точек прерывания полезно, когда часть отлаживаемой программы необходимо выполнить в реальном времени без трассировки. Когда программа в процессе своего исполнения встречает точку прерывания, управление передается в TD, который переходит в режим ожидания дальнейших действий оператора. Установка и сброс точек прерывания осуществляется нажатием клавиши <F2>. Выполнение программы в реальном времени осуществляется нажатием клавиши <F9>. Выполнение программы производится с адреса, содержащегося в регистре IP.
Выполните полную трассировку программы. После выполнения каждой команды запишите в отчет содержимое изменившихся регистров и ячеек памяти.
ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ
- Программная модель МП.
- Сегментные регистры микропроцессора.
- Регистры общего назначения микропроцессора.
- Индексные регистры микропроцессора.
- Регистры указатели микропроцессора.
- Типы данных в языке Ассемблера.
- Определение переменных в программе.
- Описание констант в программе.
- Понятие сегмент.
- Вычисление физического (абсолютного) адреса.
- Сегментированная модель памяти реального и защищенного режимов.
- Структура .EXE программы.
- Структура .COM программы.
- Различия между .COM и .EXE программой.
- Этапы получения выполняемой программы.
- Отладка программы. Работа с Turbo Debugger.
- Просмотр в отладчике состояния регистров, ячеек памяти.
- Трассировка программы. Установка точек прерывания.