Мегаобучалка Главная | О нас | Обратная связь


Структура программы на Ассемблере



2018-07-06 413 Обсуждений (0)
Структура программы на Ассемблере 0.00 из 5.00 0 оценок




Февраля. Лекция 1

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

Выделяют основные две сферы применения языков низкого уровня:

- разработка системных программ, входящие в операционные системы(драйверы);

- накопление и обработка информации в больших информационных вычислительных системах(управление баз данными, составными системами).

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

Архитектура ПК

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

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

х – количество устройств которые подключены к процессору. Если таких устройств меньше 8ми, то один алгоритм обработки.

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

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

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

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

Существуют различные типы прерываний:

- внешние

- внутренние

- маскируемые или не маскируемые (можно ли это прерывание маскировать, то есть заблокировать на некоторое время)

У прерываний существуют различные приоритеты. Для организации работы прерываний в структуру архитектуры включается контролер прерываний (каскадный в случае если прерываний > 8).

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

Процессоры семейства intel совместимы снизу-вверх, то есть это значит, что программа написанная для младшего процессора, может выполняться на процессоре старшего поколения.

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

Начиная с Intel 386 программисту доступны16 основных регистров, 11 регистров для работы с сопроцессором и мультимедийными приложениями и в реальном режиме доступны еще некоторые режимы управления и некоторые специальные регистры.

Регистры

В 16 регистров входит 4 регистра общего назначения.

Общие регистры:

При работе с 32 разрядными данными используются EAX, EBX, ECX, EDX. При работе с 16 разрядными данными используются регистры AX, BX, CX, DX. И при работе с байтами - используются AL, AH, BL, BH, CL, CH, DH, DL.

 

Эти регистры имеют собственные имена, отражающие их специальные назначения:

AX – аккумулятор, в который чаще всего записываются результат;

BX – база, используется для сложной адресации операндов данных, участвующих в операции;

CX – счетчик, используется в организации циклов, при работе со строками;

DX – регистр данных.

Регистры индексов и указателей:

Регистры указателей и индексов имеют специальные назначения. Регистры SI и DI используются для сложной адресации операндов, где SI – индекс источника, а DI – индекс приемника, а указатели SP, BP – используются для работы со стеком (BasePointer и StackPointer).

Процессор может работать с оперативной памятью как с одним непрерывным массивом байтов, а может работать с памятью, разбитой на участки, называемые сегментами, это сегментированная память. Для организации работы с сегментированной памятью в процессоре предусмотрены 6 сегментных регистров. С каждым из этих сегментных регистров – DS, ES, GS, FS, CS, SS, - С каждым сектором связан программно недоступный регистр, называемый дескриптором, а сегментный регистры называются селекторами, с которыми связан программно недоступный дескриптор, в котором хранится информация о сегменте: размер сегмента, и некоторая специальная информация – адрес сегмента, размер сегмента. Это справедливо для защищенного режима работы. В реальном режиме процессор может работать с 1 Мбайтом памяти.

Адрес сегмента кратен 16. В 16 системе счисления он может быть записан в виде XXXХO16, где старшие четыре числа хранятся в сегментных регистрах. При этом программа хранится в кодовом сегменте, а ее адрес содержится в сегменте CS, адрес стека хранится в регистре SS, для сегмента данных предусмотрено 4 сегментных регистра: DS, ES, FS, GS.

Кодовый сегмент только один, но это не значит, что программа может занимать только один сегмент оперативной памяти. В любой момент программист может изменить содержимое сегментного регистра, таким образом попасть на другой участок оперативной памяти. В реальном режиме работы размер сегмента фиксирован и равен 64Кб. XXXXO16 – адрес в реальном режиме, а в защищенном режиме размер сегмента может достигать 4Гб.

Сегмент стека

Сегмент организован специальным образом: адрес начала сегмента операционная система автоматически записывает в регистр SS, а указатель на вершину стека содержится в регистре SP. При добавлении элемента в стек содержимое указателя SP уменьшается. Это значит, что стек растет от максимально возможного значения, которое содержится в SS, вниз. Такая организация стека необходима для работы с памятью в режиме плат.

Тогда стек размещается в старших адресах, а программа в младших адресах.

Стек используется для временного хранения данных, для передачи параметров в подпрограммы, для организации работы с подпрограммами, в том числе рекурсивных. Для того, чтобы стек можно было использовать и для фактических параметров, и для локальных - после передачи параметров фактических в подпрограмму содержимое регистра SP(вершина стека) можно сохранить в регистре BP, а потом загружать локальный параметр. И обращаться и к фактически, и к локальным можно, используя регистр BP:

BP + k – обращение к фактическим;

BP – n – обращение к локальным;

Где k и n - определяются количеством параметров и их размером.

Регистр указатель команд или счетчик команд

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

Регистр флагов FLAGS

Это 32-х разрядный регистр, в котором 1,3,5,15,19-31 разряды не используются.

Регистр флагов определяет состояние программы и процессора в каждый текущий момент времени.

Используются в реальном и защищенном режиме:

1. CF - перенос

2. PF - четность

3. AF - полуперенос

4. ZF - флаг нуля

5. SF - флаг знака

6. TF - флаг трассировки

7. IF - флаг прерывания

8. DF - флаг направления

9. OF - флаг переполнения

Используются только в защищенном режиме:

1. AC - флаг выравнивания операндов

2. VM - флаг виртуальных машин

3. RF - флаг маскирования прерывания

4. NT - флаг вложенной задачи

5. IOPL - уровень привилегий ввода/вывода. (2 разряда занимает 12 и 13)

Есть флаги, которые определяют состояние программы, а есть которые определяют состояние процессора.

1. CF устанавливается (то есть автоматически) в 1, если в результате выполнения текущей команды произошел перенос в разрядной сетке (например, сложение, вычитание);

2. PF устанавливается в 1, если в младшем байте результата окажется четное количество единиц. (определяет правильность работы с памятью);

3. AF устанавливается в 1, если например, при сложении происходит перенос из третьего байта в четвертый, а при вычитании заем – из четвертого в третий;

4. ZFустанавливается в 1, если результат выполнения команд равен нулю;

5. SFвсегда равен старшему разряду результата;

6. TFустановленный в 1, переведет процессор в режим пошаговой отладки программы;

7. IF используется для маскирования на некоторое время прерывания

8. DFиспользуется при работе со строками, установленный в 1 определяет обработку строки от старших адресов к младшим, а установленный в 0 – иначе;

9. OFустанавливается в 1, если ряд операций превышает максимально допустимое значение для данной разрядной сетки. Например, при сложении произошел перенос из старшего цифрового разряда в знаковый, а из знакового не было переноса и наоборот.

10. AC установлен в 1, то процессор будет выдавать сообщения об ошибках – следит за кратностью адресов операндов(слова, двойного слова);

11. VMпозволяет перейти из защищенного режима в режим виртуальных машин;

12. RF позволяет маскировать некоторые прерывания процессора;

13. NT определяет режим работы вложенных задач;

14. IOPL = 1, если уровень привилегии текущей программы меньше значения этого флажка, то выполнение команды ввод/вывод для этой программы запрещен.

Февраля. Лекция 2

Оперативная память

ОП состоит из байтов, а байты состоят из битов. Байты состоят из 8-ми информационных разрядов с 0 – 3 байт - цифровая часть байта, с 4 – 7 зонная часть байта.

32-ух разрядный процессор может работать с оперативной памятью размером до 4-х Гб. Поэтому адреса байтов изменяются от нуля до 232 – 1, что в 16 системе счисления представляется от 00000000 до FFFFFFFF. Байты могут объединяться в поля переменной и фиксированной длины. Поля фиксированной длины имеют собственные имена. Слово состоит из 2-х байтов, а двойное слово из 4-х. Длина поля – это количество входящих в него байтов. Адрес поля – это адрес младшего входящего байта в поля. Адрес поля может быть любым. Если флаг АС установлен в 1, то адрес слова должен быть кратен 2-ум, а двойного слова - 4-м.

Оперативная память может использоваться как непрерывный массив байтов или как режим сегментированной памяти.

 

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

 

Сегмент : Смещение

или

Физический адрес = Адрес сегмента + Исполняемый адрес

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

В защищенном режиме программа может определить, а значит и использовать, до 16383 сегментов размером до 4Гбайт. Таким образом, может работать до 64Тбайт виртуальной памяти. А для реального режима адрес определяется сегментным регистром, но для получения 20-ти разрядного двоичного адреса байта, для получения физического адреса нужно содержимое сегментного регистра сместить на 4 разряда влево и к нему прибавляются 16-ти разрядное смещение ( то есть исполняемый адрес), которое формируется в команде.

Физический адрес следующей исполняемой команды = содержимое CS + содержимое IP(указатель команд)

Например, адрес следующей исполняемой команды:

ФА = (CS) + (IP)

(CS) = 7A1516 = 011110100001010100002,

(IP) = C7D916 = 11000111110110012.

ФА = 8692916 = 100001101001001010012

Формат данных

Рассматриваемый процессор может работать с:

- Целыми двоичными без знака;

- Целыми двоичными со знаком;

- Действительными с плавающей точкой;

- Двоично-десятичными;

- Строками и указателями.

Двоичные десятичные без знака может занимать байт, слово или двойное слово и принимать значения от:

0..255 (для байта);

0..65535 (для слова);

0..4294967295 (для двойного слова).

Двоичное со знаком, тоже могут занимать байт, слово или двойное слово. Они хранятся в дополнительном коде и формат у них такой: 7, 15, 31 – знаковый разряд; а остальные - цифровые.

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

X = 10n - |X|, где n – разрядность числа.

Например, представим в слове отрицательное 16-ричное

число -AC716

104 - AC7 = F539.

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

Например, - 12 в байте:

1) 12 = 000011002,

2) инверсия – 111100112,

3) дополнительный код – 111101002.

В машине вычитание заменяется сложением числа с дополнительным кодом, поэтому удобно вычислить:

Например: 65 – 42 = 23.

1) 65 = 010000012,

2) 42 = 001010102,

3) - 42 = 110101102,

4) 65 - 42 = 000101112 = 20 + 21 + 22 + 24 = 1+2+4+16=23

Числа с плавающей точкой могут занимать 32 бита или 64 бита или 80 бит, и называются короткое вещественное, длинное вещественное, рабочее вещественное. Формат числа с плавающей точкой состоит из трех полей:

<знак числа>, <машинной порядок>, <мантисса>.

короткое вещественное 1+ 8 + 23 - 10±32 - + 10±32

длинное вещественное 1+ 11 + 52 - 10±308 - + 10±308

рабочее вещественное 1+ 15 + 64 - 10±4932 - + 10±4932.

Машинный порядок (Пм) включает в себя неявным образом знак порядка и связан с истинным порядком (Пи) формулой:

Пм = Пи + 12710 (102310, 1638310).

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

Пример, 306010 представить в виде числа с плавающей точкой, занимающего 4 байта.

1) 306010 = BF416 £ |M| <1

 

 

2) нормализуем число 0. BF4*10316

3) получим машинный порядок Пм = 316 + 7F16 = 8216

4) запишем в разрядную сетку в 2-ичной системе счисления:

0 1000 0010 011 1111 0100 0000 0000 00002

Или в 16-ричном виде: 413F400016.

0100 0001 0 011 1111 0100 0000 0000 00002

Двоично-десятичные данные - процессором могут обрабатываться 8-ми разрядные в упакованном и неупакованном формате, и сопроцессором могут обрабатываться 80-ти разрядные данные в упакованном формате. Упакованный формат предполагает хранение двух цифр в байте, а неупакованный – хранит одну цифру в цифровой части байта.

Строки

Строки – это последовательности бит, байтов, слов или двойных слов. Каждому символу отводится один байт и представляется в ASCII-коде.

Указатели

Указатели могут быть двух типов:

- Длинный указатель, занимающий 48 бит: селектор(16разрядов) + смещение(32разряда);

- Короткий указатель, занимающий 32 бита – только смещение(32 разряда).

Форматы команд

Команда – это последовательность двоичных кодов, разделенная на две подпоследовательности: (операционная часть) одна говорит процессору, что нужно сделать, то есть определяет операцию, а вторая (адресная часть) – где взять данные и куда отправить данные.

Рассматриваемый процессор может работать с безадресными командами, одно-, двух- и трехадресными командами. При этом данные могут находится в регистрах, в оперативной памяти или непосредственно в команде. Команда в памяти может занимать в памяти различное количество байт в памяти от 1 до 15 байт и длина команды зависит от кода операции, количества и места расположения операндов. Наиболее часто используются двухадресные команды. Одноадресные команды могут работать с операндами, расположенными в памяти и регистрах, для двухадресных команд существует много форматов, такие, как:

R-R M-M R-M M-R R-D M-D,

где R – регистр, M – память, D – данные.

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

<база><индекс><смещение>, например, [BX] [SI] M.

Существуют различные способы адресации операндов, такие как:

1.регистровая

2.непосредственная

3.прямая

4.косвенно-регистровая

5.по базе со смещением

6.прямая с индексированием

7.по базе с индексированием

8.косвенная адресация с масштабированием

9.базово-индексная с масштабированием

10.базово-индексная с масштабированием и смещением.

Адресации с 8 по 10 используются только в защищенном режиме.

Машинный формат двухадресной команды, для которой один операнд находится всегда в регистре, а второй –в регистре или памяти можно представить следующим образом:

“dispH/dispL” – “старшая / младшая часть смещения.

Поля “код операции” и иногда “reg” определяют выполняемую операцию.

Поле “d” определяет место хранения первого операнда.

Поле “w” определяет с какими данными работают: с байтами, или словами. Если w = 0, команда работает с байтами, w = 1 - со словами.

reg” - определяет один операнд, хранимый в регистре.

Поля “mod”, “disp H” и “disp L” определяют второй операнд, который может храниться в регистре или в памяти.

Если mod = 11, то второй операнд находится в регистре, он определяется полем “r/m”, а “disp H/disp L” – отсутствует, команда будет занимать 2 байта в памяти, если mod<> 11, то второй операнд находится в памяти.

Значение поля “mod” определяет как используется смещение:

mod

 

Поля “reg” и “r/m” определяют регистры:

reg /r/m
w = 0 AL CL DL BL AH CH DH BH
w = 1 AX CX DX BX SP BP SI DI

Физический адрес определяется так:

r/m ИА ФА
(BX) + (SI) + disp + (DS)
(BX) + (DI) + disp + (DS)
(BP) + (SI) + disp + (SS)
(BP) + (DI) + disp + (SS)
(SI) + disp + (DS)
(DI) + disp + (DS)
(BP) + disp + (SS)
(BX)+ disp + (DS)

Примеры команд с различной адресацией операндов:

В командах на Ассемблере результат всегда пересылается по адресу первого операнда.

1) Регистровая. Операнд находится в регистре.

MOVAX, BX ; (BX) ®AX (содержимое BX пересылается в AX)

Машинный формат: 1001 0011 1100 0011

“код операции” 100100

“d” = 1

“w” = 1

“mod” = 11

“reg” = 000

“r/m” = 011

2) Непосредственная, то есть операнд содержится непосредственно в команде.

MOVAX, 25; 25 ®AX

CONSTEQU34h; именованная константа CONST

MOV AX, CONST; 34h ® AX

3) Прямая

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

MOVAX, ES : 0001;

ES – регистр сегмента данных, 0001 – смещение внутри сегмента.

Содержимое двух байтов, начиная с адреса (ES) + 0001 пересылаются в AX - ((ES) + 0001) ®AX.

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

DW – слово,

DD – двойное слово.

Если в сегменте ES содержится директива Var_p DW, тогда по команде

MOV AX, ES :Var_p; ((ES) + Var_p) ®AX.

Например, если команда имеет вид:

MOV AX,Var_p;((DS) + Var_p) ®AX.

4) Косвенно-регистровая

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

MOVAX, [SI];

Могут использоваться регистры:

SI, DI, BX, BP, EAX. EBX, ECX, EDX, EBP, ESI, EDI.

Не могут использоваться: AX, CX, DX, SP, ESP.

5) По базе со смещением

MOVAX, [BX]+2; ((DS) + (BX) + 2) ®AX.

ºMOVAX, [BX + 2];

ºMOVAX, 2[BX];косвенно-регистровая адресация со смещением по умолчанию берем регистр DS прибавляем к нему содержимое регистра BX и еще прибавляется 2 и пересылается глобально с этого адреса в регистр АХ.

MOV AX, [BP + 4]; ((SS) + (BP) + 4) ®AX.

6) Прямаясиндексированием

MOV AX, MAS[SI] ; ((DS) + (SI) + MAS) ®AX

MAS – адрес в области памяти.

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

7) По базе с индексированием

MOVAX, Arr[BX][DI] ; ((DS) + (BX) + (DI) + Arr) ®AX. – физический адрес двух байтов

DI идем по строке, то есть от одного элемента к другому в строке, BX осуществляет переход от одной строки к другой.

Эта адресация используется для работы с двумерными массивами (например, с массивами структур). Символическое имя определяет начало массива, с помощью базового регистра осуществляется переход от одной строки матрицы к другой, а с помощью индексного регистра - переход от одного элемента к другому внутри строки. Программист сам определяет содержимое индексного регистра на 1, 2, 4 в зависимости от желаемого типа байта, слова, двойного слова, а содержимое базового регистра на – количество элементов строки, умноженное на размерность элемента массива.

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

1.Нельзя пересылать информацию из одной области памяти в другую; (можно через команды работы со строками)

2.Нельзя пересылать информацию из одного сегментного регистра в другой;(использование стека в качестве промежуточного хранения)

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

MOV DX, 100h

MOV DS, DX

4. Нельзя изменять командой MOV содержимое регистра CS.

5. Данные в памяти хранятся в «перевернутом» виде, а в регистрах в «нормальном» виде, и команда пересылки учитывает это, например,R DW 1234h

В байте с адресом R будет 34h, в байте с адресом R+1 будет 12h.

MOV AX, R ;12h ® AH, 34h ® AL.

6. Размер передаваемых данных определяется типом операндов в команде.

XDB ?; Х - адрес одного байта в памяти.

YDW ?; Y определяет поле в 2 байта в памяти.

MOVX, 0; очищение одного байта в памяти.

MOVY, 0; очищение двух байтов в памяти.

MOVAX, 0 ; очищение двух байтов регистра

MOV [SI], 0; сообщение об ошибке.

В последнем случае необходимо использовать специальный оператор PTRдляопределение типа операнда.

<тип>PTR<выражение>

Выражение может быть константным или адресным, а тип это:

BYTE, WORD, DWORD ит.д.

bytePTR 0 ;0 воспринимается как байт

wordPTR 0 ;0 воспринимается как слово

bytePTRop1 ;один байт в памяти начиная с этого адреса

MOV byte PTR [SI], 0;

ºMOV [SI], byte PTR 0;

ºMOV [SI], word PTR 0; 0® ((DS) +(SI))

7. Если тип обоих операндов в команде определяется, то эти типы должны соответствовать друг другу.

MOVAH, 500; сообщение об ошибке.

MOVAX, X; ошибка, Х – 1байт, АХ – 2 байта.

MOV AL, R; ошибка

MOV AL, byte PTR R; (AL) = 34h

MOV AL, byte PTR R+1; (AL) = 12h

К командам пересылки относят команду обмена значений операндов.

XCHG OP1, OP2; r«rÚr«m

MOV AX, 10h;

MOV BX, 20h;

XCHG AX, BX; (AX) = 20h, (BX) = 10h

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

(EAX) = 12345678h

BSWOP EAX; (EAX) = 78563412h

Марта. Лекция 3

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

- Команды конвертирования:

CBW ; безадресная команда, (AL) ®AX.

CWD ;( AX) ®DX:AX

CWE ; ( AX) ®EAX (для i386 и выше)

CDF ; (EAX) ®EDX:EAX (для i386 и выше)

- КомандыусловнойпересылкиCMOVxx

CMOVL AL, BL;если (AL) < (BL), то (BL) ® (AL)

- Загрузка адреса.

LEAOP1, OP2; вычисляет адрес OP2 и пересылает первому операнду, который может быть только регистром.

LEA BX, M[DX][DI]

Структура программы на Ассемблере

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

Этапы:

I этап - преобразование исходного модуля в объектный – ассемблирование. Исходных модулей может быть один или несколько.

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

III этап – выполнение программы, то есть файл может быть выполнен.

Существует два типа исполняемых модулей (исполняемых файлов): exe-файл (<имя>.exe) и com-файл (<имя>.com). В результате выполнения второго этапа получается исполняемый exe-файл, чтобы получить com-файл, необходимо выполнить еще один этап обработки - преобразование exe-файла в com-файл, если удовлетворяет определенным требованиям.

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

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

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

Поля отделяют друг от друга хотя бы одним пробелом.

В квадратных скобках указаны необязательные поля, все поля, кроме <код операции>, могут отсутствовать.<имя> - символическое имя Ассемблера. Имя используется в качестве метки для обращения к этой команде, передачи управления на данную команду.

[:] после имени означает, что метка является внутренней (на эту команду можно передать управление только из этого кодового сегмента, в котором она содержится).

<код операции>определяет какое действие должен выполнить процессор.

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

[;комментарии]Комментарии отделяются кроме пробела еще и ";" и могут занимать всю строку или часть строки.

Например:

JMPM1

;команда безусловной передачи управления на команду с меткой M1.

------------/-------/------------

M1: MOVAX, BX

;пересылка содержимого регистраBXв регистрAX.

В комментарии будем записывать в виде (BX)®AX

-----------/--------/------------

Директива, как и команда, состоит из четырех полей:

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

Здесь <имя> - символическое имя Ассемблера,

<код псевдооперации> - определяет назначение директивы.

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

Например:

M1 DB 1, 0, 1, 0, 1 ;директива DB определяет 5 байтов памяти и заполняет их 0 или 1 соответственно, адрес первого байта – М1.

M2 DB ?,?,?; директива DBопределяет три байта памяти ничем их не заполняя, адрес первого – M2.

Proc ; директива начала процедуры,

endp ; директива конца процедуры,

Segment ; директива начала сегмента,

ends ; директива конца сегмента.

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

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

Sseg Segment…

-----/-------

Sseg ends

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

Dseg Segment…

-----/-------

Dseg ends

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

Cseg Segment…

-----/-------

Cseg ends

Endstart

Каждый сегмент начинается директивой начала сегмента - Segment и заканчивается директивой конца сегмента - ends, в операндах директивы Segment содержится информация о назначении сегмента.

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

В кодовом сегменте специальная директива

ASSUMESS:SSeg, DS:DSeg, CS:CSeg, ES:DSeg;

на DSeg ссылаются и DS, и ES.

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

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

Cseg Segment…



2018-07-06 413 Обсуждений (0)
Структура программы на Ассемблере 0.00 из 5.00 0 оценок









Обсуждение в статье: Структура программы на Ассемблере

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (413)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.012 сек.)