Архитектура процессора 8086


Скачать 0.81 Mb.
Название Архитектура процессора 8086
страница 3/7
Тип Документы
rykovodstvo.ru > Руководство эксплуатация > Документы
1   2   3   4   5   6   7

4.5. Приоритеты операций
При вычислении значения выражения операции выполняются в соответствии со следующим списком приоритетов (в порядке убывания):

  1. LENGTH, SIZE, WIDTH, MASK, (), [], <>.

  2. Оператор имени поля структуры (.).

  3. Оператор переключения сегмента (:).

  4. PTR, OFFSET, SEG, TYPE, THIS.

  5. HIGH, LOW.

  6. Унарные + и -.

  7. *, /, MOD, SHR, SHL.

  8. Бинарные + и -.

  9. EQ, NE, LT, LE, GT, GE.

  10. NOT.

  11. AND.

  12. OR, XOR.

  13. SHORT, .TYPE.

(Некоторые операции не были рассмотрены выше ввиду довольно редкого их использования)

4.6. Ссылки вперед
Хотя ассемблер и допускает ссылки вперед (т.е. к еще необъявленным объектам программы), такие ссылки могут при неправильном использовании приводить к ошибкам. Пример ссылки вперед:

JMP MET

...

MET: ...

Всякий раз, когда ассемблер обнаруживает неопределенное имя на 1-м проходе, он предполагает, что это ссылка вперед. Если указано только имя, ассемблер делает предположения о его типе и используемом регистре сегмента, в соответствии с которыми и генерируется код. В приведенном выше примере предполагается, что MET – метка типа NEAR и для ее адресации используется регистр CS, в результате чего генерируется инструкция JMP, занимающая 3 байта. Если бы, скажем, в действительности тип ссылки оказался FAR, ассемблеру нужно было бы генерировать 5-байтовую инструкцию, что уже невозможно, и формировалось бы сообщение об ошибке. Во избежание подобных ситуаций рекомендуется придерживаться следующих правил:

  1. Если ссылка вперед является переменной, вычисляемой относительно регистров ES, SS или CS, следует использовать оператор переключения сегмента. Если он не использован, делается попытка вычисления адреса относительно регистра DS.

  2. Если ссылка вперед является меткой инструкции в команде JMP и отстоит не далее, чем на 128 байтов, можно использовать оператор SHORT. Если этого не делать, метке будет присвоен тип FAR, что не вызовет ошибки, но на 2-м проходе ассемблер для сокращения размера содержащей ссылку инструкции вынужден будет вставить дополнительную и ненужную инструкцию NOP.

  3. Если ссылка вперед является меткой инструкции в командах CALL или JMP, следует использовать оператор PTR для определения типа метки. Иначе ассемблер устанавливает тип NEAR, и, если в действительности тип метки окажется FAR, будет выдано сообщение об ошибке.


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

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

  • скалярные данные, представляющие собой единичное значение или набор единичных значений;

  • записи, позволяющие манипулировать с данными на уровне бит;

  • структуры, отражающие некоторую логическую структуру данных.


4.7.1. Скалярные данные
Директивы определения скалярных данных приведены в таблице.

Таблица 4.2. Директивы определения скалярных данных.

Формат

Функция

[[имя]] DB значение,...

определение байтов

[[имя]] DW значение,...

определение слов

[[имя]] DD значение,...

определение двойных слов

[[имя]] DQ значение,...

определение квадрослов

[[имя]] DT значение,...

определение 10 байтов

Директива DB обеспечивает распределение и инициализацию 1 байта памяти для каждого из указанных значений. В качестве значения может кодироваться целое число, строковая константа, оператор DUP (см. ниже), абсолютное выражение или знак «?». Знак «?» обозначает неопределенное значение. Значения, если их несколько, должны разделяться запятыми. Если директива имеет имя, создается переменная типа BYTE с соответствующим данному значению указателя позиции смещением.

Если в одной директиве определения памяти заданы несколько значений, им распределяются последовательные байты памяти. В этом случае, имя, указанное в начале директивы, именует только первый из этих байтов, остальные остаются безымянными. Для ссылок на них используется выражение вида имя+k, где k – целое число.

Строковая константа может содержать столько символов, сколько помещается на одной строке. Символы строки хранятся в памяти в порядке их следования, т.е. 1-й символ имеет самый младший адрес, последний - самый старший.

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

счетчик DUP (значение,...)

Указанный в скобках список значений повторяется многократно в соответствии со значением счетчика. Каждое значение в скобках может быть любым выражением, имеющим значением целое число, символьную константу или другой оператор DUP (допускается до 17 уровней вложенности операторов DUP). Значения, если их несколько, должны разделяться запятыми.

Оператор DUP может использоваться не только при определении памяти, но и в других директивах.

Синтаксис директив DW, DD, DQ и DT идентичен синтаксису директивы DB.

Примеры директив определения скалярных данных:

integer1 DB 16

string1 DB 'abCDf'

empty1 DB ?

contan2 DW 4*3

string3 DD 'ab'

high4 DQ 18446744073709551615

high5 DT 1208925819614629174706175d

db6 DB 5 DUP(5 DUP(5 DUP(10)))

dw6 DW DUP(1,2,3,4,5)

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

  • объявление шаблона или типа записи директивой RECORD;

  • объявление собственно записи.

Формат директивы RECORD:

имя_записи RECORD имя_поля:длина[[=выражение]],...

Директива RECORD определяет вид 8- или 16-битовой записи, содержащей одно или несколько полей. Имя_записи представляет собой имя типа записи, которое будет использоваться при объявлении записи. Имя_поля и длина (в битах) описывает конкретное поле записи. Выражение, если оно указано задает начальное (умалчиваемое) значение поля. Описания полей записи в директиве RECORD, если их несколько, должны разделяться запятыми. Для одной записи может быть задано любое число полей, но их суммарная длина не должна превышать 16 бит.

Длина каждого поля задается константой в пределах от 1 до 16. Если общая длина полей превышает 8 бит, ассемблер выделяет под запись 2 байта, в противном случае – 1 байт. Если задано выражение, оно определяет начальное значение поля. Если длина поля не меньше 7 бит, в качестве выражения может быть использован символ в коде ASCII. Выражение не должно содержать ссылок вперед. Пример:

item RECORD char:7='Q',weight:4=2

Запись item будет иметь следующий вид:




char

weight

0000

1010001

0010

При обработке директивы RECORD формируется шаблон записи, а сами данные создаются при объявлении записи, которое имеет следующий вид:

[[имя]] имя_записи <[[значение,...]]>

По такому объявлению создается переменная типа записи с 8- или 16-битовым значением и структурой полей, соответствующей шаблону, заданному директивой RECORD с именем имя_записи. Имя задает имя переменной типа записи. Если имя опущено, ассемблер распределяет память, но не создает переменную, которую можно было бы использовать для доступа к записи.

В скобках <> указывается список значений полей записи. Значения в списке, если их несколько, должны разделяться запятыми. Каждое значение может быть целым числом, строковой константой или выражением и должно соответствовать длине данного поля. Для каждого поля может быть задано одно значение. Скобки <> обязательны, даже если начальные значения не заданы. Пример:

table item 10 DUP(<'A',2>)

Если для описания шаблона записи использовалась директива RECORD из предыдущего примера, то по этому объявлению создается 10 записей, объединенных именем table.


4.7.3. Структуры
Структура представляет собой набор полей байтов, объединенных одним именем. Объявление структуры, аналогично объявлению записи, включает в себя 2 действия:

  • объявление шаблона или типа структуры;

  • объявление собственно структуры.

Формат объявления типа структуры:

имя STRUC

описания_полей

имя ENDS

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

table STRUC

count DB 10

value DW 10 DUP(?)

tname DB 'font'

table ENDS

При обработке директив STRUC и ENDS формируется шаблон структуры, а сами данные создаются при объявлении структуры, которое имеет следующий вид:

[[имя]] имя_структуры <[[значение,...]]>

Значения полей в объявлении структуры аналогично значению полей при объявлении записи.
4.8. Директива эквивалентности
Константы в языке Ассемблера описываются с помощью директивы экви­валентности EQU, имеющей следующий синтаксис:

<�имя> EQU <�операнд>

Здесь обязательно должно быть указано имя и только один операнд. Директивой EQU автор программы заявляет, что указанному операнду он дает указанное имя, и требует, чтобы все вхождения этого имени в текст программы ассемблер заменял на этот операнд. Директиву EQU можно ставить в любое место программы.
4.9. Структура программы на языке Ассемблера
Как было указано выше, исходный программный модуль – это последовательность предложений. Различают два типа предложений: инструкции процессора и директивы ассемблера. Инструкции управляют работой процессора, а директивы указывают ассемблеру и редактору связей, каким образом следует объединять, инструкции для создания модуля, который и станет работающей программой.

Инструкция процессора на языке ассемблера состоит не более чем из четырех поле и имеет следующий формат:

[[метка:]] мнемоника [[операнды]] [[;комментарии]]

Единственное обязательное поле – поле кода операции (мнемоника), определяющее инструкцию, которую должен выполнить микропроцессор. Поле операндов определяется кодом операции и содержит дополнительную информацию о команде. Каждому коду операции соответствует определенное число операндов. Метка служит для обозначения какого-то определенного места в памяти, т. е. содержит в символическом виде адрес, по которому храниться инструкция. Преобразование символических имен в действительные адреса осуществляется программой ассемблера. Часть строки исходного текста после символа «;» (если он не является элементом знаковой константы или строки знаков) считается комментарием и ассемблером игнорируется. Комментарии вносятся в программу как поясняющий текст и могут содержать любые знаки до ближайшего символа конца строки. Для создания комментариев, занимающих несколько строк, может быть использована директива COMMENT. Пример:

Метка Код операции Операнды ;Комментарий

MET: MOVE AX, BX ;Пересылка

Структура директивы аналогична структуре инструкции. Второе поле – код псевдооперации определяет смысловое содержание директивы. Как и у инструкции, у директивы есть операнды, причем их может быть один или несколько и они отделяются друг от друга запятыми. Допустимое число операндов в директиве определяется кодом псевдооперации. Пример:

ARRAY DB 0, 0, 0, 0, 0

END START

Директива может быть помечена символическим именем и содержать поле комментария. Символическое имя, стоящее в начале директивы распределения памяти, называется переменной. В отличие от метки команды после символического имени директивы двоеточие не ставиться. Комментарий записывается также как и в случае команды и может занимать целую строку.

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

Каждый модуль также разбивается на отдельные части директивами сегментации, определяющими начало и конец сегмента. Каждый сегмент начинается директивой начала сегмента – SEGMENT и заканчивается директивой конца сегмента – ENDS. В начале директив ставится имя сегмента. Оператор SEGMENT может указывать выравнивание сегмента в памяти, способ, которым он объединяется с другими сегментами, а также имя класса. Существует два типа выравнивания сегмента: тип PARA, когда сегмент будет расположен начиная с границы параграфа, и тип BYTE, когда сегмент расположен начиная с любого адреса. Различные виды взаимной связи сегментов определяют параметры сборки, например, при модульном программировании. Объявление PUBLIC вызывает объединение всех сегментов с одним и тем же именем в виде одного большого сегмента. Объявление AT с адресным выражением располагает сегмент по заданному абсолютному адресу.

Каждый сегмент может быть также разбит на части. В общем случае информационные сегменты SS, ES и DS состоят из определений данных, а программный сегмент CS – из инструкций и директив, группирующих инструкции в блоки. Программный сегмент может разбиваться на части директивами определения процедур – некоторых выделенных блоков программы. Как и для определения сегмента, имеются две директивы определения процедуры (подпрограммы) – директива начала PROC и директива конца ENDP. Процедура имеет имя, которое должно включаться в обе директивы. В сегменте процедуры могут располагаться последовательно одна за другой или могут быть вложенными одна в другую.
4.9.1. Директива ASSUME
С помощью директивы ASSUME ассемблеру сообщается информация о соответствии между сегментными регистрами, и программными сегментами. Директива имеет следующий формат:

ASSUME <�пара>[[, <�пара>]]

ASSUME NOTHING

где <�пара> - это <�сегментный регистр> :<�имя сегмента>

либо <�сегментный регистр> :NOTHING

Например, директива

ASSUME ES:A, DS:B, CS:C

сообщает ассемблеру, что для сегментирования адресов из сегмента А выбирается регистр ES, для адресов из сегмента В – регистр DS, а для адресов из сегмента С – регистр CS.

Таким образом, директива ASSUME дает право не ука­зывать в командах (по крайней мере, в большинстве из них) префиксы – опущенные префиксы будет самостоятельно восстанавливать ассемблер.

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

Если в директиве ASSUME указано несколько пар с одним и тем же сегментным регистром, то последняя из них «отменяет» предыдущие, т. к. каждому сегментному регистру, можно поставить в соответствие только один сегмент. В то же время на один и тот же сегмент могут указывать разные сегментные регистры. Если в директиве ASSUME в качестве второго элемента пары задано служебное слово NOTHING (ничего), например, ASSUME ES: NOTHING, то это означает, что с данного момента сегментный регистр не указывает ни на какой сегмент, что ассемблер не должен использовать этот регистр при трансляции команд.

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

Загрузка производится следующим образом. Пусть регистр DS необходимо установить на начало сегмента В. Для загрузки регистра необходимо выполнить присваивание вида DS:=B. Однако сделать это командой MOV DS,B нельзя, поскольку имя сегмента – это константное выражение, т. е. непосредственный операнд, а по команде MOV запрещена пересылка непосредственного операнда в сегментный регистр (см. ниже). Поэтому такую пересылку следует делать через другой, несегментный регистр, например, через АХ:

MOV АХ,В

MOV DS,AX ;DS:=B

Аналогичным образом загружается и регистр ES.

Регистра CS загружать нет необходимости, так как к началу выполнения программы этот регистр уже будет указывать, на начало сегмента кода. Такую загрузку выполняет операционная система, прежде чем передает управ­ление программе.

Загрузить регистр SS можно двояко. Во-первых, его можно загрузить в самой программе так же, как DS или ES. Во-вторых, такую загрузку можно поручить операционной системе. Для этого в директиве SEGMENT, открывающей описание сегмента стека, надо указать специальный параметр STACK, например:

S SEGMENT STACK

...

S ENDS

В таком случае загрузка S в регистр SS будет выполнена автоматически до начала выполнения программы.
1   2   3   4   5   6   7

Похожие:

Архитектура процессора 8086 icon Представление содержимого регистров
Цель работы: изучить назначение регистров процессора 8086 и основные принципы использования регистров для управления работой процессора....
Архитектура процессора 8086 icon Тема Архитектура предприятия Исторические аспекты архитектуры предприятия....
Ения. Комплекс проектов совершенствования деятельности. Пути развития архитектуры предприятия. Типичные пользователи. Архитектура...
Архитектура процессора 8086 icon 4. Литература. Введение в архитектуру intel
Однако, первым настоящим процессором в семействе ia является 8086, и выпущенный вслед за ним более дешевый процессор 8088. Объектный...
Архитектура процессора 8086 icon Полноэкранный отладчик afdpro
Лабораторная работа предназначена для того, чтобы вы получили наглядные представления об архитектуре процессора на примере микропроцессора...
Архитектура процессора 8086 icon Конспект лекций
Архитектурная организация процессора ЭВМ. Структура машинной команды. Способы адресации. Особенности архитектур микропроцессоров....
Архитектура процессора 8086 icon Определения
Код процессора это численно-буквенная маркировка процессора, принятая производителем cpu
Архитектура процессора 8086 icon Управление ит-инфраструктурой
Понятие «информационно-технологическая инфраструктура», связь с понятиями «архитектура предприятия», «архитектура информационной...
Архитектура процессора 8086 icon Реферат удк 681 06 Пояснительная записка к курсовой работе содержит...
Ключевые слова: архитектура предприятия, бизнес-процесс, бизнес-архитектура, бизнес-модель, модель предприятия
Архитектура процессора 8086 icon Столлингс В. Структурная организация и архитектура компьютерных систем. 5-е издание
Гуров В. В. Архитектура микропроцессоров: Учебное пособие. – М интернет-Университет Информационных Технологий: бином. Лаборатория...
Архитектура процессора 8086 icon Федеральное государственное бюджетное образовательное учреждение...
Архитектура финансов: иллюзии глобальной стабилизации и перспективы экономического роста
Архитектура процессора 8086 icon Программа по дисциплине «Архитектура ЭВМ и систем»
Учебная программа по дисциплине «Архитектура ЭВМ и систем» составлена в соответствии с требованиями гос впо. Предназначена для студентов...
Архитектура процессора 8086 icon Лекция Язык sql 46 вставка одного запроса внутрь другого 68 как работает...
Эти базы данных создаются и функционируют под управлением специальных программных комплексов, называемых системами управления базами...
Архитектура процессора 8086 icon Лабораторная работа Изучение принципов функционирования простейшей микроэвм и процессора
Лабораторная работа Изучение принципов функционирования простейшей микроэвм и процессора I8085A при реализации программы
Архитектура процессора 8086 icon 1. Показать развитие и классификацию однопроцессорных архитектур...
Архитектура общая функциональная и структурная организация машины, определяющая методы кодирования данных, состав, назначение, принципы...
Архитектура процессора 8086 icon Замена батареи и лампы подсветки, сброс процессора

Архитектура процессора 8086 icon Программа дисциплины Архитектура вычислительных систем для направления...
Программа предназначена для преподавателей, ведущих данную дисциплину, учебных ассистентов и студентов направления 09. 03. 04 "Программная...

Руководство, инструкция по применению




При копировании материала укажите ссылку © 2024
контакты
rykovodstvo.ru
Поиск