Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп_лекц_МПТ_4.doc
Скачиваний:
135
Добавлен:
23.11.2018
Размер:
2.18 Mб
Скачать

4.7. Описание системы команд 16-разрядного микропроцессора

По функциональному назначению система команд МП разделяется на следующие основные группы /12,17,18/:

команды передачи данных;

арифметические команды;

логические команды и команды сдвигов;

строковые или цепочечные команды;

команды передачи управления;

команды управления микропроцессором.

Каждая команда имеет один или два байта кода команды (инструкции), за которыми могут следовать 1, 2 или 4 байта операнда. Перед кодом команды возможно применение префиксов CS:, DS:, SS:, ES:, указывающих на использование заданных сегментных регистров, префикса REP, указывающего на необходимость повтора инструкции указанное в регистре CX число раз и префикса LOCK, блокирующего системную шину на время выполнения команды.

Система команд МП семейства i8086/8088 является базовым подмножеством системы команд современных 32-разрядных МП. Поэтому знание нижеприведенных групп команд является необходимым для изучения современных процессоров и разработки программ для систем на их базе.

Набор базовых команд МП семейства i8086/8088 и описание выполняемых командами операций приведены в Приложении 2.

4.8. Основные элементы программ на языке Турбо ассемблер

Команда программы на языке Турбо ассемблер (Turbo assembler) имеет следующий формат /12,17,18/:

[Метка:] [Префикс] Операция Операнды ; Комментарий

Поля команды отделяются пробелами, а операнды - запятыми. Команда не может иметь более двух операндов, обозначаемых dst и src.

Структура ассемблерной программы существенно зависит от используемых программистом директив управления сегментами. Турбо ассемблер поддерживает два набора управления сегментами.

Первый набор – стандартные (расширенные) сегментные директивы (GROUP, ASSUME, ENDS, SEGMENT) обеспечивает самые полные средства управления сегментами, необходимые в сложных прикладных программах, но более сложен в использовании, и полученные программные модули имеют сложную логическую структуру.

Второй набор – упрощенные сегментные директивы (DOSSEG, .MODEL, .STACK, .DATA, .CODE) обеспечивает ограниченные средства управления сегментами, но сравнительно прост в применении, и полученные программные модули более обозримы и читаемы.

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

Директива DOSSEG вызывает группирование сегментов ассемблерной программы в соответствии с соглашениями, принятыми фирмой Microsoft для языков высокого уровня.

Директива .MODEL model, language задает модель памяти, где model представляет имя модели памяти, а language – имя языка программирования (C, Pascal и др.), на котором написаны вызываемые процедуры данного ассемблерного модуля. В программах, написанных целиком на языке Турбо ассемблер, достаточно ограничиться названием модели памяти.

Существуют следующие модели памяти:

tiny – код и данные программы размещаются в одном и том же сегменте, размером 64 Кбайт;

small – код и данные программы размещаются в двух отдельных сегментах размером 64 Кбайт;

medium – код программы может занимать более одного сегмента, а данные этой программы размещаются в одном отдельном сегменте;

compact – код программы занимает один сегмент, а данные могут размещаться в нескольких сегментах;

large и huge – код программы и данные могут превышать по размеру 64 Кбайт и занимать по несколько сегментов.

Ассемблерные программы на практике редко требуют более 64 Кбайт памяти для программного кода или данных, поэтому для большинства приложений применима модель small.

Директива .STACK size определяет размер стека. Например, .STACK 200h

определяет размер стека равным 200h, или 512 байт.

Директива .CODE определяет начало кодового сегмента программы и не имеет операндов. Загружать регистр CS в явном виде никогда не требуется, ибо это производит операционная система при запуске программы. Подобным образом операционная система устанавливает также регистр SS и, как правило, во время работы программы эта установка сохраняется.

Директива .DATA определяет начало сегмента данных. Следует учесть, что при выполнении программы для доступа к ячейкам памяти сегмента данных, определяемого директивой .DATA, необходимо явно загрузить в регистр DS символическое имя @Data. Эта загрузка обычно производится последовательностью из двух команд:

………………..

mov ax,@Data

mov ds,ax

………………..

Таким образом, обобщенная структура (шаблон) типовой ассемблерной программы, использующей упрощенные сегментные директивы, имеет вид:

DOSSEG

.MODEL SMALL

.STACK size

.DATA

Здесь записываются директивы определения идентификаторов и пе-ременных для резер-вирования места в памяти

.CODE

ProgramStart:

mov ax,@data

mov ds,ax ;Устанавливает DS на сегмент .DATA

Здесь записываются команды программы

………………………..

………………………..

mov ah,4ch ;Обращение к DOS для выхода из программы

int 21h

END ProgramStart

Ниже приведен пример ассемблерной программы, использующей упрощенные сегментные директивы.

;=============================================================

;Эта программа реверсирует введенную строку и отображает

реверсируемую и ;реверсированную строки на экране дисплея.

;=============================================================

DOSSEG

.MODEL SMALL

.STACK 200h

.DATA

MAX_LENGTH EQU 100

STR_REVERS DB MAX_LENGTH DUP (?)

REVERS_STR DB MAX_LENGTH DUP (?)

.CODE

ProgReverse:

mov ax,@Data ;Установка регистра DS на

mov ds,ax ;сегмент данных

mov ah,3fh ;Функция DOS считывания из устройства

;с логическим номером в bx

mov bx,00 ;Логический номер стандартного

;устройства ввода - клавиатуры

mov cx,MAX_LENGTH ;Считывание до максимального

;числа символов в cx

mov dx,OFFSET STR_REVERS;Адресация области памяти

;буфера для реверсируемой строки

int 21h ;Прием символов

and ax,ax ;Были ли считаны какие-либо символы

jz Last ;Нет, переход на завершение программы

mov cx,ax ;Записать число введенных символов в cx

push cx ;Сохранить в cx длину введенной строки

mov bx,OFFSET STR_REVERS ;Реверсируемая строка

mov si,OFFSET REVERS_STR ;Реверсированная строка

add si,cx ;Указание на конец буфера

dec si ;реверсированной строки

ReverseLoop: mov al,[bx] ;Прием следующего символа и запись

mov [si],al ;символов в обратном порядке

inc bx ;Указание на следующий символ в

;буфере реверсируемой строки

dec si ;Указание на предыдущий символ в

;буфере реверсированной строки

Loop ReverseLoop;Перенос следующего символа,

;если символ есть

pop cx ;Считать из cx длину введенной строки

mov ah,40h ;Функция DOS записи в устройство

mov bx,1 ;с логическим номером в bx

mov dx, OFFSET REVERS_STR;Вывод на экран дисплея

int 21h ;этой строки

Last: mov ah,4ch ;Обращение к функции DOS

Int 21h ;для выхода из программы

END ProgReverse ;Конец программы

В рассмотренной программе для ввода реверсируемой и вывода реверсированной строк использовались служебные функции 3fh и 40h MS – DOS, вызываемые через программное прерывание int 21h /11/.

Многочисленные примеры программ на языках Турбо ассемблер и Макро ассемблер рассмотрены в /17,18,19/.

Создание ассемблерной программы, как уже было рассмотрено выше, включает этапы редактирования, ассемблирования, компоновки (линкирования) и отладки. Положим, с помощью редактора подготовлен исходный модуль (файл) программы REVERSE.ASM из последнего примера. Для ассемблирования файла REVERSE.ASM вводится следующая командная строка Турбо ассемблера:

TASM REVERSE

Если не задано другое имя файла, в результате ассемблирования получается объектный файл REVERSE.OBJ. Для выполнения компоновки, если после ассемблирования не было сообщений об ошибках или предупреждений, вводится следующая командная строка: TLINK REVERSE

По завершении компоновки, если не было сообщений об ошибках, получается загрузочный файл REVERSE.EXE программы.

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