Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПСМПС (лаб)

.pdf
Скачиваний:
20
Добавлен:
10.06.2015
Размер:
1.42 Mб
Скачать

 

 

11

 

 

 

КОП

 

Имя метки

:

Операнд 1

;

 

Комментарий

,

Операнд 2

Рис. 1.6. Формат команд и макрокоманд ассемблера

Допустимыми символами ассемблера являются:

все латинские буквы, при этом заглавные и прописные считаются эквивалентными;

цифры;

знаки: «?, @, $, _, &»;

разделители: «, . [] () <> {} + / * % " " ? \ = # ^ ».

Предложения ассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора. Лексемами языка ассемблера являются:

идентификаторы – последовательности допустимых символов, использующихся для обозначения таких объектов программы, как коды операций, имена переменных и названия меток;

цепочки символов – последовательности символов, заключенные в одинарные и двойные кавычки;

целые числа в двоичной, десятичной или шестнадцатеричной системе счисления.

Большинство предложений на ассемблере содержит описание объекта, над которым производятся некоторые действия. Такие объекты называются операндами. Операнды представляют собой объекты, на которые действуют инструкции или директивы. К основным видам операндов относятся непосредственные операнды, адресные операнды, регистровые операнды:

mov AX, 555 ; 555непосредственный операнд mov AX, 0010h ; AX – регистровый операнд

mov DS, AX

mov CX, DS:1000h

; адресный операнд DS:1000h

12

Операнды являются элементарными компонентами, из которых формируется часть машинной команды, обозначающая объекты, над которыми выполняется операция. В более общем случае операнды могу входить как составные части в более сложные образования, называемые выражениями. Выражения представляют собой комбинации операндов и операторов, рассматриваемые как единое целое. Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное значение).

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

арифметические операторы. К ним относятся унарные операторы «+» и «-», бинарные «+» и «-», операторы умножения и целочисленного деления «*» и «/», а также получения остатка от деления MOD, например:

tsize

equ

50

;

tsize

=

50

esize

equ

2

;

esize

=

2

. . .

mov DX, tsize / esize ; DX = 25

операторы правого и левого сдвига – SHR и SHL выполняют сдвиг выражения на указанное количество разрядов, например:

bmask equ 10111011000b

mov AL, bmask shr 3 ; сдвиг вправо AL = 00010111 mov СL, bmask shl 3 ; сдвиг влево CL = 11011000

операторы сравнения предназначены для формирования логических выражений. Логическая единица – значение, все биты которого равны 1, соответственно, логический нуль – значение, все биты которого равны 0. К операторам сравнения относятся операторы EQ, – если равно, NE – не равно, LT – если меньше, GT – если больше, например:

mconst equ 100

eq 50

 

mov CL, mconst

; CL = 0

13

логические операторы – AND, OR, XOR, NOT – выполняют над вы-

ражениями побитовые логические операции, при этом выражения должны быть абсолютными, например:

mconst equ 10010011b

mov CL, mconst or 01101111b ; CL = 11111111

индексный оператор [] воспринимается транслятором как указание сложить значение за скобками со значением в скобках, например:

mov AX, mas[SI]; пересылка слова по адресу mas+SI

оператор переопределения типа PRT применяется для переопределения или уточнения типа метки или переменной. Тип может принимать одно из следующих значений: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR. Например:

d_wrd dd 1110011100011000b mov AL, byte ptr d_wrd + 1

;пересылка второго байта из двойного слова

;AL <- 11100111b

2.4. Жизненный цикл программы на ассемблере

Процесс подготовки и отладки программы на ассемблере включает этапы подготовки исходного текста, трансляции, компоновки и отладки.

У большинства существующих реализаций ассемблера нет интегрированной среды, подобной интегрированным средам высокоуровневых языков программирования. Поэтому для выполнения всех функций по вводу кода программы, ее трансляции, редактированию и отладке необходимо использовать отдельные служебные программы. Общая схема процесса разработки программы на ассемблере представлена рис. 1.7:

14

1. Ввод исходного текста

 

 

 

Текстовый редактор

 

*.asm

 

 

 

 

 

2. Создание объектного модуля

 

 

*.obj,

Транслятор

 

 

 

 

 

*. lst,

 

 

*.crf

3. Создание загрузочного модуля

Компоновщик

*.obj,

4. Отладка программы

Отладчик

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

Наибольшую популярность среди разработчиков имеют два программных пакета, включающих в себя инструментальные средства разработки на ассемблере – это макроассемблер MASM (Macro assembler) Microsoft Corp. и TASM (Turbo assembler) Borland Inc.

Подготовка исходного текста программы выполняется с помощью любого текстового редактора (NOTEPAD, EDIT, NE и др.), который представляет текст в виде последовательности кодов ASCII без служебных тегов. Трансляция исходного текста состоит из преобразования строк исходного текста программы в бинарные коды (MASM.EXE, TASM.EXE). Компоновка объектного файла выполняется с помощью компоновщика (LINK.EXE, TLINK.EXE). Основное назначение компоновщика – присоединение к объектному файлу с основной программой других объектных модулей и настройка связей между ними. Однако компоновать необходимо и одномодульные проекты, поскольку одной из функций компоновщика является изменение формата объектного файла и преобразование его к формату исполняемого файла, который может быть загружен в память для исполнения.

15

3.Практическая часть

3.1.Пример простейшей программы на ассемблере

Рассмотрим простейшую программу на ассемблере, которая выводит на экран строку с текстом.

1. Создадим пустой текстовый файл с именем TEXT.ASM, используя, любой файловый менеджер. Затем, введем следующий исходный текст, не указывая нумерацию:

(1)text segment 'code'

(2)

assume CS: text, DS: data

(3)begin: mov AX, data ;AX = {баз. адр. сег. Data}

(4)

 

mov

DS, AX

;DS = AX

(5)

 

mov

AH, 09h

;AH = 09h

(6)

 

mov

DX, offset message

(7)

 

int

21h

 

(8)

 

mov

AH, 4ch

 

(9)

 

mov

AL, 00h

 

(10)

 

int

21h

 

(11)

text

ends

 

 

(12)

data

segment

 

 

(13)

 

message db'Привет мир$'

(14)

data

 

ends

 

(15)

 

end

begin

 

Первая строка (1) данной программы с помощью директивы SEGMENT открывает сегмент кода программы именем TEXT. Имя сегмента как и любой другой идентификатор может быть произвольным. Далее (2) с помощью директивы ASSUME сегментные регистры ассоциируются с сегментами программы. Первые две строки являются директивами и не содержат инструкций. Они необходимы только для поддержки процесса компиляции и компоновки программы.

Исполняемая часть программы начинается с третьей строки (3). Здесь инструкция начинается с метки – точки входа в программу (entry point), за которой следует первая инструкция. Действия инструкции MOV сводятся к пересылке начального базового адреса сегмента данных в аккумулятор. Это

16

же значение, в свою очередь, в строке (4) пересылается в регистр DS, который и должен использоваться по умолчанию для доступа к сегменту данных.

В строке (5) в младшую половину аккумулятора засылается значение 09h, номер функции ОС DOS, которая реализует вывод строки на экран. Для выполнения этой функции в строке (6) в регистр DX заносится значение относительного адреса выводимой на экран строки. Далее (7) с помощью инструкции INT 21h происходит возбуждение программного прерывания, обработчик которого и реализует конечные действия по выводу строки на экран.

Вконечном итоге этим обработчиком является подпрограмма резидентного ядра ОС DOS, которая анализирует содержимое регистра AH на номер вызываемой функции, а другие регистры общего назначения на предмет параметров вызываемой функции. Фактически, при выполнении инструкции INT 21H текущая программа приостанавливает свою работу и передает управление другой программа, которая и выполняет необходимые действия.

Смысл строк (8-10) аналогичен смыслу (5-7) – в регистре AH задается номер запрашиваемой у ОС функции, в регистре AL – ее параметр и далее возбуждается прерывание с номером 21h. Результатом выполнения этих строк является завершение программы и возврат управления командному процессору DOS (функция 4Сh с кодом возврата 00h).

Следующей строкой (11) завершается сегмент кода программы TEXT, а в строке (12) происходит объявление сегмента данных программы с именем DATA. Как уже упоминалось, имена сегментов могут быть произвольными.

Встроке (13) выполняется определение и заполнение набора последовательных ячеек памяти, которые содержат коды символов строки «Привет мир$». Эта символьная строка заканчивается символом знака валюты, который и задает ее конец в памяти при выводе с помощью функции 09h. Строка (14) закрывает сегмент данных, а строка (15) завершает текст программы. Надо отметить, что за директивой END следует имя метки, которая служит точкой входа в программы. Эта необходимость обусловлена несколькими причинами: во-первых, явно заданная точка входа необходима отладчику; во-вторых, это необходимо при организации многосегментных программ.

2.Выполним компиляцию проекта, используя следующую команду командной строки:

>MASM TEXT.ASM

После компиляции при отсутствии ошибок исходного текста программы в каталоге проекта должен появиться объектный модуль в виде файла с именем с именем TEXT.OBJ. Исполняемый файл компилятора и компонов-

17

щика должен находится в том, же каталоге, что и файл с исходным текстом проекта.

3. Для получения исполняемого модуля выполним компоновку полученного в п. 2. объектного модуля с помощью команды:

> LINK TEXT.OBJ

3.2.Задания

1.Внимательно изучить материал разделов 2.1-2.3.

2.Удалить в листинге программы в строке 13 символ $. Выполнить перекомпиляцию и повторную сборку проекта и запустить программу. Проанализировать способ нахождения конца строки в функции 09h.

3.Организовать многострочный вывод на экран, используя коды символов перехода строки и возврата каретки (10 и 13).

4.Контрольные вопросы

1.Назовите основные сферы применения ассемблера.

2.Укажите его основные отличия от высокоуровневых языков программирования?

3.Какие базовые типы предложений можно выделить в языке ассемб-

лере?

4.С помощью диаграммы Бекуса-Нуара представьте форматы базовых основных конструкций языка ассемблера.

5.Перечислите объекты программной модели микропроцессора и укажите их основное назначение.

6.Объясните основные положения сегментной модели памяти реального режима.

8.Приведите исходный текст программы на ассемблере и опишите каждое из его предложений.

18

Лабораторная работа № 2

ИСПОЛЬЗОВАНИЕ ИНТЕРАКТИВНОГО ОТЛАДЧИКА РЕАЛЬНОГО РЕЖИМА MICROSOFT CODEVIEW. КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ И АРИФМЕТИКО-ЛОГИЧЕСКИЕ КОМАНДЫ INTEL-СОВМЕСТИМОГО ПРОЦЕССОРА

1. Цель работы

Целью настоящей лабораторной работы является изучение базовых арифметико-логических команд и команд пересылки данных, а также развитие представлений об этапах создания программ на ассемблере.

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

Изучение материала данной лабораторной работы создает предпосылки для самостоятельного освоения студентами использования высокоразвитых интегрированных сред разработки и отладчиков режима ядра, таких, как

SoftIce.

2.Основные теоретические сведения

2.1.Приемы использования интерактивного отладчика

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

Среди отладчиков, многие из которых несмотря на «преклонный возраст» до сих пор используются, следует выделить две группы – это отладчики реального режима и отдатчики защищенного режима. К первой группе от-

носятся отладчики Microsoft CodeView и Borland Turbo Debugger, а также

Microsoft Debug. Ко второй группе относятся отладчики Borland Turbo Debugger for Win16/32, Microsoft WinDebug и Numega SoftIce. Наиболее разви-

тым отладчиком на сегодняшний день является отладчик режима ядра Numega SoftIce, который позволяет вести низкоуровневую отладку как приклад-

19

ных программ, драйверов режима ядра, так и других программных компонентов ядра операционной системы.

Для отладки программ реального режима с успехом могут быть использованы любые интерактивные отладчики реального режима – как CodeView, так и Turbo Debugger. При этом CodeView более простой в освоении, но обладает меньшими возможностями.

Отладчик CodeView предназначен для отладки загрузочных файлов, подготовленных компиляторами С/С++ или ассемблера. CodeView позволяет отображать текст программы, контролировать ее выполнение, просматривать и менять значения переменных. Псевдографический оконный интерфейс (рис. 2.1) делает отладку наглядной: он позволяет видеть исходный текст в одном окне, выполнять команды – в другом, наблюдать регистры и флаги процессора – в третьем, отслеживать значения локальных и глобальных переменных и выражений – в четвертом. CodeView, в зависимости от специфики кода, позволяет отлаживать программы на уровне ассемблера и на уровне исходного текста, работая с адресами или номерами строк. Команды отладчика CodeView вводятся с клавиатуры или выбираются из меню. Совместное использование клавиатуры и команд меню делает работу CodeView значительно эффективнее.

5

2

4

1

3

Рис. 2.1. Внешний вид главного окна отладчика CodeView

Основные оконные элементы выполняют следующие функции:

окно отладки Source (1) содержит текст отлаживаемой программы на языке С или ассемблере;

20

текущая исполняемая строка программы (2), отмеченная негативом (или другим цветом);

строка, содержащая точку останова отмечается повышенной ярко-

стью;

окно диалога Command (3), служит для ввода диалоговых команд. При просмотре буфера команд диалога его можно листать верх/вниз;

окно регистров (4) Reg, предназначено для вывода и изменения текущего значения регистров и флагов процессора;

строка меню (5), содержащая заголовки меню и команд, которые можно также активизировать специальными клавишами;

сторожевое окно (команда Windows | Watch), которое отображает текущее состояние переменных или выражений, поставленных на контроль.

В общем случае управлять ходом отладки можно тремя способами: с помощью меню, путем использования функциональных клавиш, а также с помощью команд отладчика.

Рассмотрим основные функциональные клавиши, позволяющие контролировать окна и управлять процессом выполнения отладки:

F2 – вывод на экран информационного поля с содержимым регистров;

F3 – переключение вида основного информационного кадра (только машинные команды, только исходный текст, или и то, и другое);

F4 – переключение на экран DOS (консольного окна виртуальной

DOS-машины в Windows 2000);

F5 – выполнение программы до конца или до ближайшей точки оста-

нова;

F6 – перевод курсора на информационное поле программы или поле командной строки;

F7 – выполнение программы до курсора или до точки останова;

F8 – выполнение одной команды. При этом подпрограммы и циклы выполняются последовательно команда за командой;

F9 – установка или снятие точки останова в позиции курсора;

F10 – выполнение одной команды. При этом подпрограммы и циклы выполняются, как одна команда, если в них нет почек останова.

Другим способом управления ходом отладки является использование команд командной строки, которые позволяют более детально работать c точками останова, дампом памяти и регистрами:

G <seg:addr> – выполнение программы до адреса seg:addr, точки останова или конца программы. В качестве параметра seg может использоваться обозначение сегментного регистра или число (по умолчанию seg = CS).