.RU

Лекция 3. Структура программы на ассемблере (2 пары) - Конспект лекций Системное программирование (семестр 2) Возле...


^ Лекция 3. Структура программы на ассемблере (2 пары)
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.

Предложения ассемблера бывают четырех типов:
^ Синтаксис ассемблера
Предложения, составляющие программу, могут представлять собой синтаксическую конструкцию, соответствующую команде, макрокоманде, директиве или комментарию. Для того чтобы транслятор ассемблера мог распознать их, они должны формироваться по определенным синтаксическим правилам. Для этого лучше всего использовать формальное описание синтаксиса языка наподобие правил грамматики. Наиболее распространенные способы подобного описания языка программирования — синтаксические диаграммы и расширенные формы Бэкуса—Наура. Для практического использования более удобны синтаксические диаграммы. К примеру, синтаксис предложений ассемблера можно описать с помощью синтаксических диаграмм, показанных на следующих рисунках.



Рис. 1. Формат предложения ассемблера



Рис. 2. Формат директив



Рис. 3. Формат команд и макрокоманд

На этих рисунках:

^ Как использовать синтаксические диаграммы?

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

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

  1. все латинские буквы: A—Z, a—z. При этом заглавные и строчные буквы считаются эквивалентными;

  2. цифры от 0 до 9;

  3. знаки ?, @, $, _, &;

  4. разделители , . [ ] ( ) { } + / * % ! ' " ? \ = # ^.

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

Лексемами являются:

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

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

Их можно определить так:

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

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

Возможно провести следующую классификацию операндов:

· постоянные, или непосредственные, операнды

· адресные операнды

· перемещаемые операнды

· счетчик адреса

· регистровый операнд

· базовый и индексный операнды

· структурные операнды

· Записи

Рассмотрим подробнее характеристику операндов из приведенной классификации:



Рис. 4. Синтаксис описания адресных операндов

К примеру:

 

        mov     ax,0000h

        mov     ds,ax

        mov     ax,ds:0000h     ;записать слово в ax из области памяти по

                                        ;физическому адресу 0000:0000

        

Здесь третья команда mov имеет адресный операнд. 

К примеру:

  

data    segment

mas_w   dw      25 dup (0)



code    segment



        lea     si,mas_w        ;mas_w - перемещаемый операнд

 

В этом фрагменте mas_w — символьное имя, значением которого является начальный адрес области памяти размером 25 слов. Полный физический адрес этой области памяти будет известен только после загрузки программы в память для выполнения. 

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

  

 jmp $+3 ;безусловный переход на команду mov

 cld ;длина команды cld составляет 1 байт

 mov al,1

  

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

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

Выражения представляют собой комбинации операндов и операторов, рассматриваемые как единое целое.

Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение.

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

· Арифметические операторы

· Операторы сдвига

· Операторы сравнения

· Логические операторы

· Индексный оператор

· Оператор переопределения типа

· Оператор переопределения сегмента

· Оператор именования типа структуры

· Оператор получения сегментной составляющей адреса выражения

· Оператор получения смещения выражения

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

Эти операторы расположены на уровнях приоритета 6, 7, 8 в табл. 2. Например,

    

tab_size equ 50 ;размер массива в байтах

size_el equ 2 ;размер элементов



;вычисляется число элементов массива и заносится в

регистр cx

 mov cx,tab_size / size_el ;оператор “/”



Рис. 5. Синтаксис арифметических операций



Рис. 12. Синтаксис оператора получения сегментной составляющей



Рис. 13. Синтаксис оператора получения смещения

Например,

 

.data

pole    dw      5

...

.code

...

        mov     ax,seg  pole

        mov     es,ax

        mov     dx,offset       pole    ;теперь в паре es:dx полный адрес pole

 

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

Оператор

Приоритет

length, size, width, mask, (, ), [, ],

1

.

2

:

3

ptr, offset, seg, type, this

4

high, low

5

+, - (унарные)

6

*, /, mod, shl, shr

7

+, -, (бинарные)

8

eq, ne, lt, le, gt, ge

9

not

10

and

11

or, xor

12

short, type

13
^ Директивы сегментации
В ходе предыдущего обсуждения мы выяснили все основные правила записи команд и операндов в программе на ассемблере. Открытым остался вопрос о том, как правильно оформить последовательность команд, чтобы транслятор мог их обработать, а микропроцессор — выполнить.

При рассмотрении архитектуры микропроцессора мы узнали, что он имеет шесть сегментных регистров, посредством которых может одновременно работать:

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

Синтаксическое описание сегмента на ассемблере представляет собой конструкцию, изображенную на рис. 14:



Рис. 14. Синтаксис описания сегмента

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

Рассмотрим их подробнее.

По умолчанию тип выравнивания имеет значение ^ PARA.

По умолчанию атрибут комбинирования принимает значение ^ PRIVATE.

Все сегменты сами по себе равноправны, так как директивы ^ SEGMENT и ENDS не содержат информации о функциональном назначении сегментов. Для того чтобы использовать их как сегменты кода, данных или стека, необходимо предварительно сообщить транслятору об этом, для чего используют специальную директиву ASSUME, имеющую формат, показанный на рис. 15. Эта директива сообщает транслятору о том, какой сегмент к какому сегментному регистру привязан. В свою очередь, это позволит транслятору корректно связывать символические имена, определенные в сегментах. Привязка сегментов к сегментным регистрам осуществляется с помощью операндов этой директивы, в которых имя_сегмента должно быть именем сегмента, определенным в исходном тексте программы директивой SEGMENT или ключевым словом nothing. Если в качестве операнда используется только ключевое слово nothing, то предшествующие назначения сегментных регистров аннулируются, причем сразу для всех шести сегментных регистров. Но ключевое слово nothing можно использовать вместо аргумента имя сегмента; в этом случае будет выборочно разрываться связь между сегментом с именем имя сегмента и соответствующим сегментным регистром (см. рис. 15).



Рис. 15. Директива ASSUME 

На уроке 3 мы рассматривали пример программы с директивами сегментации. Эти директивы изначально использовались для оформления программы в трансляторах MASM и TASM. Поэтому их называют стандартными директивами сегментации.

Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить ее описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами (хотя явно инициализировать ds все равно придется).

В листинге 1 приведен пример программы с использованием упрощенных директив сегментации:

 

        Листинг 1. Использование упрощенных директив сегментации

;---------Prg_3_1.asm-------------------------------

masm                    ;режим работы TASM: ideal или masm

model   small           ;модель памяти

.data                   ;сегмент данных

message db      'Введите две шестнадцатеричные цифры,$'

.stack                  ;сегмент стека

        db      256     dup ('?')       ;сегмент стека

.code                   ;сегмент кода

main    proc            ;начало процедуры main

        mov     ax,@data        ;заносим адрес сегмента данных в регистр ax

        mov     ds,ax   ;ax в ds

;далее текст программы (см. сегмента кода в листинге 3.1 книги)

        mov     ax,4c00h        ;пересылка 4c00h в регистр ax

        int     21h             ;вызов прерывания с номером 21h

main    endp            ;конец процедуры main

end     main            ;конец программы с точкой входа main

Синтаксис директивы MODEL показан на рис. 16.



Рис. 16. Синтаксис директивы MODEL

Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упомянутыми нами ранее упрощенными директивами описания сегментов. Эти директивы приведены в табл. 3.
^ Таблица 3. Упрощенные директивы определения сегмента

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

(режим MASM)

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

(режим IDEAL)

Назначение

.CODE [имя]

CODESEG[имя]

Начало или продолжение сегмента кода

.DATA

DATASEG

Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near

.CONST

CONST

Начало или продолжение сегмента постоянных данных (констант) модуля

.DATA?

UDATASEG

Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near

.STACK [размер]

STACK [размер]

Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека

.FARDATA [имя]

FARDATA [имя]

Начало или продолжение сегмента инициализированных данных типа far

.FARDATA? [имя]

UFARDATA [имя]

Начало или продолжение сегмента неинициализированных данных типа far

Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимость с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.

При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (см. табл. 5). Перечислим эти идентификаторы и их значения (табл. 4).
^ Таблица 4. Идентификаторы, создаваемые директивой MODEL

Имя идентификатора

Значение переменной

@code

Физический адрес сегмента кода

@data

Физический адрес сегмента данных типа near

@fardata

Физический адрес сегмента данных типа far

@fardata?

Физический адрес сегмента неинициализированных данных типа far

@curseg

Физический адрес сегмента неинициализированных данных типа far

@stack

Физический адрес сегмента стека

Если вы посмотрите на текст листинга 1, то увидите пример использования одного из этих идентификаторов. Это @data; с его помощью мы получили значение физического адреса сегмента данных нашей программы.

Теперь можно закончить обсуждение директивы MODEL. Операнды директивы MODEL используют для задания модели памяти, которая определяет набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров. В табл. 5 приведены некоторые значения параметра модель памяти директивы MODEL. 
^ Таблица 5. Модели памяти

Модель

Тип кода

Тип данных

Назначение модели

TINY

near

near

Код и данные объединены в одну группу с именем DGROUP. 

Используется для создания программ формата .com.

SMALL

near

near

Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. 

Эту модель обычно используют для большинства программ на ассемблере

MEDIUM

far

near

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

Все ссылки на передачу управления — типа far. 

Данные объединены в одной группе; все ссылки на них — типа near

COMPACT

near

far

Код в одном сегменте; 

ссылка на данные — типа far

LARGE

far

far

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

Параметр модификатор директивы MODEL позволяет уточнить некоторые особенности использования выбранной модели памяти (табл. 6).
^ Таблица 6. Модификаторы модели памяти

Значение модификатора

Назначение

use16

Сегменты выбранной модели используются как 16-битные (если соответствующей директивой указан процессор i80386 или i80486)

use32

Сегменты выбранной модели используются как 32-битные (если соответствующей директивой указан процессор i80386 или i80486)

dos

Программа будет работать в MS-DOS

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

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

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


interesnie-pamyatniki-naberezhnih-chelnov-chast-2.html
interfaks-httpwwwinterfaxru-06092006-00000-boris-grizlov-monitoring-smi-7-sentyabrya-2006-g.html
interfaks-moskva-17032009-kazahstan-na-realizaciyu-strategii-zanyatosti-naseleniya-potratit-pochti-200-mlrd-tenge.html
interfaks-moskva-19112008-kazahstan-razrabativaet-plan-pervoocherednih-mer-po-podderzhaniyu-socialno-ekonomicheskoj-stabilnosti-prezident.html
interfaks-moskva-26012009-strahovshiki-kazahstana-v-2008g-sokratili-sbor-premij-na-94.html
interfejsi-atm-chast-5.html
  • books.largereferat.info/centr-planirovaniya-semi-i-reprodukcii-otkrilsya-v-bryanske-gosduma-rf-monitoring-smi-21-23-iyunya-2008-g.html
  • zanyatie.largereferat.info/rezultati-golosovaniya-10-chas-35-min-10-sek-a-p-torshin-predsedatelstvuyushij.html
  • znaniya.largereferat.info/razdel-i-nalichie-istochnikov-teplosnabzheniya-ob-utverzhdenii-statisticheskogo-instrumentariya-dlya-organizacii-federalnogo.html
  • essay.largereferat.info/ekologicheskaya-situaciya-na-territorii-neneckogo-avtonomnogo-okruga-v-2010-g.html
  • institute.largereferat.info/ezhekvartalnij-otchet-otkritoe-akcionernoe-obshestvo-polyus-zoloto-kod-emitenta-stranica-14.html
  • literatura.largereferat.info/severnaya-vojna-i-shvedskoe-nashestvie-na-rossiyu-stranica-7.html
  • knowledge.largereferat.info/nejrolingvisticheskoe-rogrammirovanie-podborka-stranica-56.html
  • ucheba.largereferat.info/poslednyaya-rol-ranevskoj-pervaya-5-v-poiskah-radosti-5-chemu-i-u-kogo-ya-uchilsya-9.html
  • shpargalka.largereferat.info/uchebno-metodicheskij-kompleks-disciplini-gse-f-01-inostrannij-yazik-anglijskij-kod-i-nazvanie-disciplini-po-uchebnomu-planu-specialnosti-stranica-11.html
  • tetrad.largereferat.info/vidi-mishleniya-chast-4.html
  • laboratornaya.largereferat.info/raspisanie-zanyatij-aspirantov.html
  • control.largereferat.info/e-a-klimov-rassmatrival-individualnij-stil-deyatelnosti-isd-kak-svoeobraznuyu-sistemu-psihologicheskih-sredstv-k-kotorim-soznatelno-ili-stihijno-pribegaet-chelovek-v-celyah-nailuchshego-uravnoveshivaniya-svoej-in.html
  • uchebnik.largereferat.info/urok-po-informatike-kompyuter-i-zrenie.html
  • kontrolnaya.largereferat.info/razvitie-rebenka-v-doshkolnom-vozraste.html
  • nauka.largereferat.info/viyavlenie-skritih-defektov-rentgenoskopiej-zashita-korpusa-ot-korrozii.html
  • nauka.largereferat.info/v-m-bakusev-zam-predsedatelya-yu-v-bozhko-a-v-gofman-v-v-sapov-l-s-chibisenkov-predsedatel-perevod-s-nemeckogo-a-k-sudakova-nomer-stranici-predshestvuet-stranice-prim-skanirovshika-stranica-9.html
  • student.largereferat.info/2-kultura-strani-glava-osnovnaya-informaciya-po-strane-s-2.html
  • credit.largereferat.info/otchet-o-vipolnenii-osnovnih-napravlenij-razvitiya-arhivnogo-dela-v-respublike-kareliya-za-2008-god.html
  • ekzamen.largereferat.info/specialnost-03140165-kulturologiya-sosta-vgosudarstvennih-attestacionnih-komissij-gak-s-vklyucheniem-v-nih.html
  • turn.largereferat.info/pasport-vedomstvennoj-celevoj-programmi-murmanskoj-oblasti-naimenovanie-subekta-byudzhetnogo-planirovaniya-stranica-4.html
  • uchit.largereferat.info/tairibi-azastan-zhol-2050-br-masat-br-mdde-br-bolasha-masati.html
  • desk.largereferat.info/opisanie-produkcii-v-ramkah-proekta-biznes-plan-investicionnogo-proekta-po-organizacii-proizvodstva-rozliva-vodi.html
  • learn.largereferat.info/glava-14-tri-mushketera.html
  • lesson.largereferat.info/primernaya-osnovnaya-obrazovatelnaya-programma-obrazovatelnogo-uchrezhdeniya-stranica-33.html
  • urok.largereferat.info/prilozhenie-5-zayavka-1-v-i-druzhinin-rektor-instituta-povisheniya-kvalifikacii-i-perepodgotovki-rabotnikov-obrazovaniya.html
  • predmet.largereferat.info/sankt-peterburgskoj-gosudarstvennoj-konservatorii-im-n-a-rimskogo-korsakova.html
  • letter.largereferat.info/ministerstva-inostrannih-del-respubliki-kazahstan-strategicheskij-plan-ministerstva-inostrannih-del-respubliki.html
  • lektsiya.largereferat.info/programma-attestacionnih-ispitanij-po-napravleniyu-mezhdunarodnie-otnosheniya.html
  • upbringing.largereferat.info/makolkin-v-i-ovcharenko-si-vnutrennie-bolezni-uchebnik-5-e-izd-pererab-m16-i-dop-stranica-9.html
  • learn.largereferat.info/glava-29-garri-potter-i-angeli-smerti.html
  • essay.largereferat.info/doklad-o-rezultatah-stranica-4.html
  • textbook.largereferat.info/grizlov-i-mironov-dogovorilis-o-vzaimodejstvii-edinorossov-i-eserov.html
  • studies.largereferat.info/audit-raschetov-chast-13.html
  • abstract.largereferat.info/13-mesto-kursa-v-professionalnoj-podgotovke-vipusknika-uchebno-metodicheskij-kompleks-disciplini-teoriya-folklora-specialnost.html
  • otsenki.largereferat.info/regulirovanie-truda-rabotnikov-spravochnik-po-trudovomu-pravu-material-podgotovlen-s-ispolzovaniem-pravovih-aktov.html
  • © LargeReferat.info
    Мобильный рефератник - для мобильных людей.