Система команд процессора Intel 86.




Assembler.

Ассемблер предназначен для написания программ, эффективных по времени и потреблению ресурсов. В ассемблере более 100 базовых символических команд (3800 машинных команд), более 20 директив.

Особенностью Ассемблера по сравнению с «машинными кодами» является:

1) символичное наименование операторов и операндов

2) отсутствие привязки к конкретным адресам памяти

3) использование макросредств

Формат оператора ассемблера:

1) метка: операция операнд(ы); комментарий (такая команда выполняется процессором на этапе выполнения программ

К операциям можно отнести директивы

2) имя директива операнд(ы); комментарий (директива ассемблера выполняется на этапе трансляции в объектный файл; команд не порождает)

 

Метка – задает адрес данной в исполняемом файле команды или директивы в исходном тексте.

Директива – действие над операндами при трансляции программы и генерации объектного файла

Операция – действие, выполняемое над операндами при выполнении программы.

Процесс обработки ассемблерной программы:

 


 

В символических кодах пишется программа, но данные выгодно писать в 16-ом коде.

Доступная ОЗУ делится на сегменты (64 КБ). Начало сегмента CODE закреплено в CS, а адрес в IP. DATA – начало в DS, адрес в OFFSET.

CS DS OFFSET

  CODE
  DATA  
  EXTRA  
  STACK  

 

 
 


IP

SS

ES

SP

Организация выполняемых программ в MS – DOS.

1) bat. – текстовый файл (с его помощью можно запускать) – для организации порядка и записи программ 2-х других типов (.com,.exe).

2).com,.exe – программы, полученные в результате компиляции и компановки.

 

.com:

1) длина не превышает 64 КБ;

2) рассчитан для работы с малыми моделями памяти (TINY, SMALL);

3) хранится на диске в том виде, в котором исполняется и не требует дополнительной настройки после загрузки;

4) все сегментные регистры в начальный момент времени настроены на один и тот же адрес, с которого начинается PSP этой программы.

Структура.com – файла:

 

64 КБ PSP всегда занимает 256 байт = 100Н

  Код программы и данные
SP

- заполнение

100Н

CS:IP

PSP

 

DS,SS,ES,CS

Первично после загрузки все сегментные регистры настроены на PSP. Тогда 1-ая команда в программе начинается с адреса IP=100H; указатель STACK устанавливается на конец сегмента (STACK растет как сосулька).

 

.exe:

1) используется для моделей памяти SMALL и выше, позволяет применять любое количество сегментов;

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

 

 

Структура.exe – файла: SP


SS

PSP (после загрузки)


CS


DS, ES

 
 


PSP (Префикс сегмент program) – специальная структура, которая формирует ОС для каждого исполняемого файла. Она содержит с нулевого адреса команду INT20 (прерывание) длиной 1 слово, которая обеспечивает возврат ОС после выполнения программы.

 

H 1слово INT20 (CD20)

2H 1слово размер доступной памяти (в параграфах)

от 4H до (2C-1) 1слово вспомогательные адреса и команды

2CH среда окружения программ

80H область передачи данных (DTA)

Система команд процессора Intel 86.

 

Формат:

Префикс перераспределение сегмента КОП режим адресации Данные Адрес
0/1 байт 0/1 байт Всегда 1 байт 0/1 байт 0/1/2 байт 0/1/2 байт

Есть всегда! Взаимоисключаемые

Максимальная длина команды = 6 байт.

Префикс используется для:

1) задания, выполнения, повторения данной команды (обычно для строк);

2) запрещает доступ к … на время выполнения команды (LOCK);

Переопределение сегментов – изменение сегмента, принятого поумолчанию.

Режим адресации – указание: с регистром или с памятью мы будем работать.

Директивы ассемблера

1. Директивы задания данных

Директива определения имен

a) имя EQU выражение

Например

N EQU 100h

TABLE EQU DS:[BP][SI]

MINS_DAY EQU 60*24

b) имя = выражение

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

 

Директива выделения памяти

идентификатор D* список значений

где D* ода из приведенный ниже псевдокоманд:

DB- определить байт;

DW- определить слово;

DD- определить двойное слово;

DQ- определить учетверенное слово;

DT- определить десять байт;

DF- определить шесть байт.

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

 

text_string db ‘Hello world’

b_max db 255

b_min db -128

rez_w dw?

rez_tab dw 20dup(?)

b_tab db 4dup(?),8,5,4dup(1)

fl_num dd 5.03E-2

 

2. Директивы сегментации программы

Два способа задания сегментов в программе.

 

2.1. Полное описание сегментов

2.1.1. Определение сегмента

имя_сегмента SEGMENT атрибуты

тело сегмента

имя_сегмента ENDS

Пример

dat_s1 segment byte public ‘data’

a db?

dat_s1 ends

Атрибуты:

- ReadOnly- сегмент доступен только для чтения; при попытки записи в этот сегмент MASM выдаст сообщение об ошибке.

- Атрибут выравнивания- указывает ассемблеру и компоновщику, с какого адреса может начинаться сегмент.

BYTE- с любого адреса.

WORD- с четного адреса.

DWORD- с адреса, кратного 4.

PARA- с адреса, кратного 16 (установлен по умолчанию).

PAGE- с адреса, кратного 256.

- Атрибут группирования, комбинирования.

PUBLIC- конкатенация (присоединение частей сегментов друг к другу).

COMMON- размещение сегментов данного класса с одного адреса (для сегментов кода и оверлейных программ).

PRIVATE- сегмент с таким атрибутом не объединяется с другими сегментами (значение по умолчанию).

- Атрибут типа данных.

USE16- сегмент работает с 16 битными данными.

USE32- сегмент работает с 32 битными данными.

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

 

2.1.2. Связь сегментов с соответствующими сегментными регистрами.

ASSUME {регистр_сегментный: имя_сегмента,…}

Обычно эта директива идет вслед за сегментом кода.

Пример

assume cs: code_s, ds: d_seg,

ss: stack, es: nothing

 

NOTHING- не устанавливать связь или отменить ее, если она была установлена.

 

2.1.3.Загрузка начальных адресов сегментов в соответствующие регистры.

mov ax, seg d_seg; seg- не обязательный оператор

mov ds, ax

 

2.2. Сокращенное описание сегментов.

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

.MODEL тип_модели_памяти

Эта директива накладывает ограничения на комбинирование сегментов

Модель Тип доступа к коду Тип доступа к данным Сегментные регистры Примечания
TINY Near Near (cs)=DGroup (ds)=(ss)=DGroup .com
SMALL Near Near (cs)=_Text (ds)=(ss)=DGroup .exe
MEDIUM Far Near (cs)=<имя_сегмента>_Text (ds)=(ss)=DGroup  
LARGE Far Far (cs)=<имя_сегмента>_Text (ds)=(ss)=DGroup  
HUGE Far Far    

 

.CODE - директива описания сегмента кода; эта запись аналогична

_TEXT SEGMENT Word Public ‘CODE’

или

<имя_сегмента> _TEXT Word Public ‘CODE’

для модели памяти выше MEDIUM

.DATA

_DATA SEGMENT Word Public ‘DATA’

.STACK

STACK SEGMENT Para Public ‘STACK’

.CONST

CONST SEGMENT Word Public ‘CONST’

.DATA?

_BSS SEGMENT Word Public ‘BBS’

Отличие от полного описания сегментов заключается в отсутствии директивы ENDS. Таким образом, в результате создаются предопределенные переменные, которые содержат начальные адреса сегментов: @Code, @Data, @Stack, @Const, @BBS. Следовательно можно написать:

mov ax, @data

mov ds, ax

3. Директивы группирования.

GROUP имя_сегмента1, имя_сегмента2,…

Все перечисленные сегменты относятся к одной группе и могут адресоваться относительно одного регистра (обычно в одну группу объединяют сегменты одного назначения, например, data и stack).

4. Порядок размещения сегментов.

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

.SEQ

для размещения в алфавитном порядке:

.ALPHA

размещение сегментов в порядке, принятом в MS DOS:

.DOSSEG

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

Порядок размещения сегментов, соответствующий.DOSSEG:

- ‘CODE’

- сегменты не относящиеся к DGROUP (FAR DATE, FAR STACK)

- сегменты DGROUP (‘DATE’, ‘STACK’, ‘BSS’, ‘CONST’)

 

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

По умолчанию используется набор команд процессора i8086 (при попытке исполнить какую либо другую, возникает прерывание). Директивы, определяющие набор допустимых команд:

.ix86 (где x=1,2..6) позволяет использовать команды соответствующих процессоров;

.MXX- возможность применения команд мультимедиа расширения;

.K3D- разрешены команды AMD 3D

 

6. Директива END.

END [метка старта]- логический конец программы, далее транслятор текст не просматривает. Метка старта- адрес, с которого начинается выполнение программы.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: