Загрузка...

ЛАБОРАТОРНАЯ РАБОТА 1. Типы данных в языке Ассемблера.


ЛАБОРАТОРНАЯ РАБОТА  1. Типы данных в языке Ассемблера. Структура программы на языке Ассемблера. Использование средств создания и отладки программ на языке Ассемблера.

Васюткина И.А. – «Методические указания для проведения лабораторных работ по курсу «Программирование на языке низкого уровня» для студентов ИТИ, обучающихся по специальности «Программное обеспечение вычислительной техники и автоматизированных систем». Методические указания. – Тирасполь, 2008. – 2 п.л.

Предлагаемые методические указания для проведения лабораторных работ по курсу «Программирование на языке низкого уровня» подготовлены в соответствии с программой соответствующей дисциплины, изучаемой студентами ИТИ. Данная работа имеет своей целью помочь студентам в освоении методов разработки и написания программ на языке Ассемблера микропроцессоров семейства intel х86, привить навыки отладки программ, а также закрепить знания синтаксиса языка Ассемблер.

Рекомендовано к опубликованию в электронном виде методической комиссией инженерно-технического института и научно-методическим советом ПГУ, протокол № ________от _________.

ISBN                                            © Васюткина И.А., 2008 г.

 

Директивы описания данных в программе

При использовании переменных необходимо определить место в программе, где будет храниться переменная (в каком сегменте программы для нее будет выделена память), ее имя и тип этой переменной.

  Каждая переменная в программе должна иметь уникальное имя, с помощью которого и задается адрес этой переменной в программе. Если в программе известно имя переменной, то всегда можно определить ее адрес.

а) определение констант

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

  1. <name> equ <выражение>

В качества выражения можно использовать числовую константу, произвольный текст, математическое выражение

сount   equ      cx

length  equ      80

numb               equ      80+120

Максимальная длина выражения может быть равной 255 символов.

  1. Псевдооператор =

 

<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.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  Запишите размер программы на диске.

  1. ОТЛАДКА ПРОГРАММЫ ПРИ ПОМОЩИ ОТЛАДЧИКА 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.

Выполните полную трассировку программы. После выполнения каждой команды  запишите  в  отчет  содержимое изменившихся регистров и ячеек памяти.

ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ

  1. Программная модель МП.
  2. Сегментные регистры микропроцессора.
  3. Регистры общего назначения микропроцессора.
  4. Индексные регистры микропроцессора.
  5. Регистры указатели микропроцессора.
  6. Типы данных в языке Ассемблера.
  7. Определение переменных в программе.
  8. Описание констант в программе.
  9. Понятие сегмент.
  10. Вычисление физического (абсолютного) адреса.
  11. Сегментированная модель памяти реального и защищенного режимов.
  12. Структура .EXE программы.
  13. Структура .COM программы.
  14. Различия между .COM и .EXE программой.
  15. Этапы получения выполняемой программы.
  16. Отладка программы. Работа с Turbo Debugger.
  17. Просмотр в отладчике состояния регистров, ячеек памяти.
  18. Трассировка программы. Установка точек прерывания.
Загрузка...