Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

1. 6 префиксы замены сегментов. Контрольные вопросы. Задания. 2. Директивы языка ассемблера, структура ассемблерной программы для МП 8086, управление размещением кодов и данных в программах на ассемблере




1. 6 Префиксы замены сегментов

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

< имя_сегментного_регистра>: [адресное_выражение]

 

Имя сегментного регистра – это CS, DS, ES или SS. Адресное выражение – это запись одного из способов адресации памяти, рассмотренных выше. Например, индексная адресация со смещением и использованием сегментного регистра SS может быть записана как SS: [SI + 5], а команда, использующая такой вид адресации, может выглядеть так: MOV AX, SS: [SI + 5].

 

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

1. Что такое регистр микропроцессора?

2. На какие группы можно разделить все регистры микропроцессора?

3. Для чего используется сегментирование адресов?

4. Как организована память микропроцессора?

5. Какая адресация используется чаще всего и почему?

6. На какие группы можно разбить все команды микропроцессора?

7. Являются ли команды процессора одноадресными?

8. Что такое программный сегмент?

9. Для чего используется директива Segment?

10. Как записывается префикс замены сегмента?  

 

 

Задания

1. Вычислить значение адреса, по которому процессор обращается к памяти, если имеется пара сегмент: смещение:

а) 0016h: 0267h

б) 0127h: 0648h

в) 0015h: 0142h

г) 0346h: 0573h

2. Выписать все пары сегмент: смещение, которые соответствуют адресам 0045h, 0126h, 0073h, 0345h.

3. Найдите смещение и напишите сегментный регистр, используемый по умолчанию при базово-индексной адресации, если известно, что:

а) значения регистра BX=0136h, SI=0327h;

б) значения регистра BP=0054h, SI=0277h;

в) значения регистра BX=0158h, DI=0227h;

г) значения регистра BX=0096h, DI=0187h.

4. Опишите программный сегмент SEG, в котором в регистры AX и DX записываются значения ячеек 0026h и 0132h.

 

 

2. ДИРЕКТИВЫ ЯЗЫКА АССЕМБЛЕРА, СТРУКТУРА АССЕМБЛЕРНОЙ ПРОГРАММЫ ДЛЯ МП 8086, УПРАВЛЕНИЕ РАЗМЕЩЕНИЕМ КОДОВ И ДАННЫХ В ПРОГРАММАХ НА АССЕМБЛЕРЕ

 

2. 1 Директивы языка ассемблера

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

1. Директивы управления размещением данных;

2. Директивы связи модулей программы;

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

4. Директивы условной компиляции;

5. Прочие директивы.

Директивы управления размещением данных позволяют определить ячейки памяти программы, их тип, количество и задать начальные значения. Например: a DB 5, f DD 1345h.

Директивы связи модулей программы предназначены для управления связыванием различных модулей в одну программу. Используются, в основном, при написании больших программ или библиотек. Например: TITLE, SUBTTL, PAGE.

Директивы создания элементов программы позволяют создавать такие элементы программы, как программные сегменты, структуры, процедуры и макросы. Эти директивы используются в любой программе написанной на языке ассемблера. Например: SEGMENT, PROC, STRUC.

Директивы условной компиляции предназначены для обозначения фрагментов программы, обрабатываемых транслятором в зависимости от определенных условий. Например: IF, IFNDEF, IFDEF

Все директивы ассемблера записываются в виде символьных операторов. Некоторые директивы могут располагаться в любом месте программы, другие – только в определенных местах или между определенными директивами. Директива не преобразуется в машинную команду процессора, а лишь влияет на трансляцию программы и определяет параметры трансляции. В табл. 3 представлены все директивы языка ассемблера.

Директива имеет следующий синтаксис:

[< имя> ]< название директивы> [< операнды> ][; < комментарий> ]

где имя – это, как правило, имя константы или переменной, описываемой данной директивой;

операнды (если они есть) записываются через запятую;

комментарий – пояснение к командам, которое не надо выполнять.

 

Таблица 3

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

ASSUME END EXTRN IFNB LOCAL PURGE
COMMENT ENDIF GROUP IFNDEF MACRO RECORD
DB ENDM IF IF1 NAME REPT
DD ENDP IFB IF2 ORG SEGMENT
DQ ENDS IFDEF INCLUDE OUT STRUC
DT EQU IFDIF IRP PAGE SUBTTL
DW EVEN IFE IRPC PROC TITLE
ELSE EXITN IFIDN LABEL PUBLIC  

 

 

2. 2 Структура ассемблерной программы для МП 8086

Любая ассемблерная программа для МП 8086 состоит не менее чем из одного программного сегмента. Каждый программный сегмент может включать в себя команды или данные. Одни сегменты могут содержать только команды, другие – только данные, третьи – и данные и команды. Содержание конкретного программного сегмента зависит только от программиста. Общая структура программы выглядит следующим образом:

< директивы>

< сегмент_1> SEGMENT < параметры>

< имя_метки>:

< предложение>

       . . .

< предложение>

< сегмент_1> ENDS

 

< сегмент_2> SEGMENT < параметры>

< предложение>

       . . .

< предложение>

< сегмент_2> ENDS

.

.

.

< сегмент_N> SEGMENT < параметры>

< предложение>

       . . .

< предложение>

< сегмент_N> ENDS

END < имя_метки>

 

Директива END указывает так называемую точку входа в программу (program entry point), определяющую первую команду, с которой должна начинаться программа. Точка входа в программу определяется меткой, которая может располагаться внутри какого-либо программного сегмента в любом его месте. Директива END также сообщает транслятору о конце текста программы, и транслятор игнорирует любые предложения после директивы END.

Все команды и данные в программе на ассемблере должны находиться внутри какого-либо программного сегмента. Вне сегментов могут находиться только некоторые директивы языка ассемблера. Следует отметить, что текст программы на языке ассемблера можно писать как прописными, так и строчными буквами – транслятор Turbo Assembler не чувствителен к регистру.

 

 

2. 3 Управление размещением кодов и данных
в программах на ассемблере

Особенностью МП 8086 является то, что и коды команд и данные хранятся в одной области памяти размером 1 Мб. Не существует способа определить, является ли какая-либо последовательность байт командой процессора или данными программы. Если в программном сегменте среди команд располагаются и данные, то процессор при выполнении команд может дойти до данных и попытаться «выполнить» эти данные, так как интерпретирует их как команды. Поэтому при размещении данных в одном сегменте с командами следует избегать передачи управления процессора с команд на данные. Это можно выполнить несколькими способами:

1. Перед данными поставить команду безусловного перехода так, чтобы управление передавалось на следующую после данных команду – таким образом, процессор как бы «обходит» данные и приступает к выполнению следующей команды.

< имя_сегмента> SEGMENT < параметры>

< команда>

. . .

< команда>

< команда_безусловного_перехода> < метка>

< данные>

. . .

< данные>

< метка>:

< команда>

. . .

< команда>

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

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

2. Разместить данные в конце программного сегмента, а перед ними поставить вызов какой-либо функции DOS, завершающей выполнение программы.

< имя_сегмента> SEGMENT < параметры>

< команда>

. . .

< команда>

< вызов_функции_завершения_программы>

< данные>

. . .

< данные>

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

 

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

Можно разместить данные в отдельном программном сегменте, тогда не придется использовать способы «обхода» данных, описанные выше.

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

< имя_сегмента> SEGMENT < параметры>

< имя_переменной> < директива> < начальное_значение>

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

В табл. 4 представлены все директивы определения данных и типы данных, которые они задают.

В качестве начального значения могут указываться числа из табл. 4 или знак вопроса (‘? ’) - неинициализированная переменная. Если неинициализированные переменные располагаются в конце программы (т. е. после них нет команд и данных), они не занимают место на диске в исполняемом файле программы. После директивы определения данных может указываться несколько начальных значений, перечисленных через запятую – таким образом можно определить несколько однотипных переменных, расположенных в памяти последовательно. Пример: A DW 1, 2, 3, 4, 5. При этом при обращении к переменной с именем “A” будет происходить обращение к ячейке со значением 1. К следующему значению можно обратиться путем прибавления числа 2 (DW – слово, состоящее из 2 байт).

 

Таблица 4

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

Директива Размер переменной в байтах Диапазон целочисленных значений Диапазон вещественных значений
DB От 0 до 255 От –128 до +127
DW От 0 до 65535 От –32768 до +32767
DD От 0 до 4294967295 от –2147483648 до +2147483647 от ±3. 4E-38 до ±3. 4E+38
DQ От 0 до 18446744073709551615 от –9223372036854775808 до +9223372036854775807 от ±1. 7E-308 до ±1. 7E+308
DT от ±3. 4E-4932 до ±3. 4E+4932

 

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

Можно определять большие массивы переменных с одинаковым начальным значением. Для этого служит директива DUP. Формат использования директивы:

< имя_переменной> < директива> < размер_массива> DUP (< значение> )

 

Размер массива – это число, которое определяет количество переменных, расположенных в памяти последовательно. Пример: A DB 10 DUP (0) – одномерный массив, состоящий из 10 элементов, которые равны 0. Можно определять и неинициализированные массивы переменных: B DD 100 DUP (? ).

При обращении к переменным в программе указывается их имя. При трансляции это имя преобразуется в смещение относительно начала сегмента – это прямая адресация. Например, команда MOV AX, A записывает в регистр AX значение переменной A, определенной как слово (директива DW).

В командах можно указывать и непосредственные числовые значения, например команда MOV AX, 5 записывает в регистр AX значение 5. Непосредственные значения должны соответствовать типу той переменной или регистра, в которые они записываются. Например, если переменная определена директивой DB, то непосредственные значения, записываемые в эту переменные должны находиться в пределах от 0 до 255 (для беззнаковых чисел) или от –128 до +127 (для знаковых чисел). Непосредственные значения могут задаваться в четырех системах счисления: двоичной, восьмеричной, десятичной, шестнадцатеричной. По умолчанию, непосредственные значения задаются в десятичной системе счисления.

Все непосредственные значения могут также задаваться как результат арифметических действий над другими непосредственными значениями. Например команда MOV AX, (5 + 7) * 2 / 3 записывает в регистр AX число 8.

Следует отметить, что при определении переменных имя переменной можно опускать. Такое определение создает безымянную переменную, к которой можно обратиться не по ее имени, а по ее адресу, т. е. смещению относительного того сегмента, в котором она определена. Для указания в командах вместо имен переменных непосредственные адреса нужно обязательно использовать префикс замены сегмента, за которым следует в числовой форме смещение относительно начала сегмента. При этом смещение не может быть отрицательным, как в рассмотренных выше способах адресации. Например, команда MOV AX, DS: 5 записывает в регистр AX значение из ячейки памяти, адрес которой определяется значением сегментного регистра DS и смещением 5. В языке ассемблера имеются директивы, которые позволяют определить сегмент и смещение указанной переменной. Директива OFFSET преобразует имя указываемой переменной в смещение, а директива SEG преобразует имя указываемой переменной в сегментный адрес (номер сегмента). Форматы вызова директив:

OFFSET < имя_переменной>

SEG < имя_переменной>

 

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

A DB?

. . .

MOV AX, OFFSET A

MOV BX, SEG A

 

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

< имя_структуры> STRUC

< имя_поля> < директива_определения_данных> < значение>

. . .

< имя_поля> < директива_определения_данных> < значение>

< имя_структуры> ENDS

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

< имя_переменной> < имя_структуры> < начальные_значение>

 

Начальные значения для полей задаются в формате

< нач_знач1, нач_знач2, . . . , нач_значN>

 

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

MyStruc STRUC

X DW?

Y DW?

Z DW?

MyStruc ENDS

 

MyVar MyStruc < 1, , 3>

MyVar – это имя переменной. Если начальные значения для полей не указываются, то определение переменной выглядит следующим образом:

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...