Программы на ассемблере

Изучение архитектуры персонального компьютера на примере микропроцессора фирмы Intel. Регистры общего назначения. Оперативная память; форматы данных и команд. Команд пересылки с различными способами адресации операндов. Структура программы на Ассемблере.

Рубрика Программирование, компьютеры и кибернетика
Вид курс лекций
Язык русский
Дата добавления 03.05.2014
Размер файла 506,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Введение

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

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

1) разработка системных программ, включаемых в состав операционных систем (ОС), например, драйверы устройств;

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

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

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

К классу системных программ относят специальные программы, обеспечивающие автоматизированную разработку программ и выполнение любых программ. При развитии вычислительных систем (ВС) часто употребляемые функции типовых проблемных программ поднимают на уровень системных программ для использования их в различных приложениях, а в дальнейшем наиболее распространенные и критичные по временным затратам - на уровень частичной или полной аппаратной реализации. Такой путь прошли в последние десятилетия средства управления многопрограммным защищенным режимом в процессорах фирмы Intel - от программной до частично аппаратной реализации. А путь от прикладных до системных управляющих прошли, например, средства управления диалоговым взаимодействием с пользователем, реализованных в объектно-ориентированных графических программных оболочках (например, Windows).

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

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

Язык Ассемблер используется везде, где необходима максимальная производительность и эффективность, и будет использоваться до тех пор, пока проводятся исследовательские работы в области развития и создания новых архитектур ЭВМ.

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

К недостаткам Ассемблера относят следующие:

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

* Программы на Ассемблере трудночитаемые, но и программы на любом языке будут трудночитаемыми, если они плохо документированы.

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

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

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

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

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

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

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

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

2. Архитектура микропроцессора фирмы Intel (ix86)

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

Совокупность программно-доступных средств процессора называется архитектурой процессора (с точки зрения программиста). Начиная с 386 процессора программисту доступны 16 основных регистров, 11 регистров для работы с сопроцессором и мультимедийными приложениями, и в реальном режиме доступны некоторые регистры управления и некоторые специальные регистры. Регистр - это набор из n устройств, способных хранить n-разрядное двоичное число.

3. Регистры общего назначения

32-х разрядные регистры общего назначения без ограничения могут использоваться для временного хранения команд, адресов и данных. Обращение к ним осуществляется по именам EAX, EBX, ECX, EDX при работе с 32-х разрядными данными, по именам AX, BX, CX, DX, при работе со словами - 16-ти разрядными данными, при работе с байтами могут использоваться восемь 8-разрядных регистров: AL, AH, BL, BH, CL, CH, DL, DH.

Эти регистры имеют собственные имена, которые говорят о том, как они часто используются. АХ - аккумулятор, обычно используется для хранения результата. DX - регистр данных - в нем хранится старшая часть результата, если он не умещается в регистре AX. BX - регистр базы, используется для организации специальной адресации операндов по базе. СХ - счетчик, используется автоматически для организации циклов и при работе со строками.

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

Для получения адреса начала сегмента используются шестнадцатиразрядные сегментные регистры DS, ES, FS, GS, CS и SS, называемые селекторами. Операционные системы могут размещать сегменты в различных областях оперативной памяти и даже временно записывать на винчестер, если ОП не хватает. С каждым селектором связан программно-недоступный дескриптор, в котором содержится адрес сегмента, размер сегмента и некоторые его атрибуты. Это справедливо для защищенного режима работы. В реальном режиме размер сегмента фиксирован и составляет 64 Кбайта. Адрес сегмента кратен 16 и в 16-ой системе счисления может быть записан в виде XXXX016, четыре старшие цифры адреса сегмента содержатся в сегментном регистре. В защищенном режиме размер сегмента может изменяться до 4Гбайт.

DS, ES, FS, GS - 16-ти разрядные сегментные регистры, используемые для определения начала сегментов данных. CS - сегментный регистр кодового сегмента. SS - сегментный регистр для определения сегмента стека.

Сегментных регистров всего 6, но в любой момент пользователь может изменить содержимое этих регистров. Например,…..

Специальным образом реализуется и используется сегмент стека. Адрес начала сегмента стека определяется автоматически ОС с помощью регистра SS, а указатель на вершину стека - это регистр указателей SP (ESP). Cтек организован таким образом, что при добавлении элементов в стек содержимое указателя стека уменьшается. Стек растет вниз от максимального значения, хранящегося в SS (растет вниз головой). При добавлении в стек адреса уменьшаются. Такая организация необходима при использовании модели памяти flat. В этом случае программа размещается, начиная с младших адресов ОП, а стек размещается в старших адресах

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

Для того чтобы стек можно было использовать для хранения фактических и локальных параметров, после передачи фактических параметров значение указателя на вершину стека можно сохранить в регистре BP (EBP) и тогда к глобальным параметрам можно обращаться, используя конструкцию BP - k, а к локальным - BP + n, где k и n - определяются количеством параметров и их размером.

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

• CF - перенос

• PF - четность

• AF - полуперенос

• ZF - флаг нуля

• SF - флаг знака

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

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

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

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

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

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

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

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

– IOPL - уровень привилегий ввода/вывода.

Биты 1, 3, 5, 15, 19 - 31 - не используются, зарезервированы.

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

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

Назначение флажков:

CF устанавливается в 1, если при выполнении команд сложения осуществляется перенос за разрядную сетку, а при вычитании требуется заем.

PF = 1, если в младшем байте результата содержится четное количество единиц.

AF = 1, если в результате выполнения команды сложения (вычитания) осуществлялся перенос (заем) из 3-го разряда байта в 4-й ( из 4-го в 3-й).

ZF = 1, если результатом выполнения операции является ноль во всех разрядах результата.

SF всегда равен старшему биту результата.

TF = 1 прерывает работу процессора после каждой выполненной команды.

DF определяет направление обработки строк данных, если DF= 0 - обработка строк идет в сторону увеличения адресов, DF = 1 - в сторону уменьшения, это реализуется автоматическим увеличением или уменьшением содержимого регистров индексов SI (ESI) и DI(EDI).

OF = 1, если результат команды превышает максимально допустимый для данной разрядной сетки.

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

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

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

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

AC =1 приведет к сообщению об ошибке, если адреса операндов длиной в слово или двойное слово не будут кратны двум и четырем соответственно.

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

Оперативная память состоит из байтов, каждый байт состоит из 8 информационных битов.

32-х разрядный процессор может работать с ОП размером до 4Гбайт и, следовательно, адреса байтов изменяются от 0 до 232-1 (0000000016 - FFFFFFFF16).

Байты памяти могут объединяться в поля фиксированной и переменной длины. Фиксированная длина - слово (2 байта) или двойное слово (4 байта). Поля переменной длины могут содержать произвольное количество байтов. Адресом поля является адрес младшего входящего в поле байта. Адрес поля может быть любым. ОП может использоваться как непрерывная последовательность байтов, так и как сегментированная.

Физический адрес (ФА) байта записывается как <сегмент>:<смещение>, т.е. он может быть получен по формуле ФА=АС+ИА, где АС - адрес сегмента, ИА - исполняемый адрес, <смещение> формируется в команде различными способами в зависимости от способа адресации операндов. В защищенном режиме программа может определить до 16383 сегментов размером до 4 Гбайт, и таким образом может работать с 64 Тбайтами виртуальной памяти. Для реального режима АС определяется сегментным регистром и для получения двадцатиразрядного двоичного адреса байта необходимо к содержимому сегментного регистра, смещенного на 4 разряда влево, прибавить шестнадцатиразрядное смещение - ИА. Например, адрес следующей исполняемой команды:

ФА = (CS) + (IP)

(CS) = 7A1516 = 011110100001010100002,

(IP) = C7D916 = 11000111110110012.

ФА = 8692916 = 100001101001001010012

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

Процессор ix86 вместе с сопроцессором могут обрабатывать большой набор различных типов данных: целые числа без знака, целые числа со знаком, действительные числа с плавающей точкой, двоично-десятичные числа, символы, строки, указатели. Целые числа без знака могут занимать байт, слово, двойное слово и принимать значения из диапазонов: 0 - 255, 0 - 65535, 0 - 4294967295 соответственно.

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

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

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 бит, и называются короткое вещественное, длинное вещественное, рабочее вещественное соответственно. Формат числа с плавающей точкой состоит из трех полей.

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

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

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

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

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

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

1) 306010 = BF416 1 |M| <1

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

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

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

0100 0001 0 011 1111 0100 0000 0000 00002

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

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

Символьные данные - это символы в коде ASCII. Для любого символа отводится один байт.

Строковые данные - это последовательности бит, байт, слов или двойных слов.

Указатели. Существуют два типа указателей: длинный указатель, занимающий 48 бит (из них селектор -16 бит и смещение - 32 бита) и короткий указатель, занимающий 32 бита - только смещение.

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

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

Рассматриваемый процессор может работать с безадресными командами, одно-, двух- и трехадресными командами. Команда в памяти может занимать от 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 используются только в защищенном режиме.

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

disp H/disp L - старшая / младшая часть смещения.

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

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

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

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

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

Если mod = 11, то второй операнд находится в регистре, он определяется полем r/m, а disp H/disp - отсутствует, команда будет занимать 2 байта в памяти, если mod ? 11, то второй операнд находится в памяти, а значение поля mod определяет, как используется смещение:

reg и r/m

000

001

010

011

100

101

110

111

w = 0

AL

CL

DL

BL

AH

CH

DH

BH

w = 1

AX

CX

DX

BX

SP

BP

SI

DI

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

r/m

ИА

ФА

000

(BX) + (SI) + disp

+ (DS)

001

(BX) + (DI) + disp

+ (DS)

010

(BP) + (SI) + disp

+ (SS)

011

(BP) + (DI) + disp

+ (SS)

100

(SI) + disp

+ (DS)

101

(DI) + disp

+ (DS)

110

(BP) + disp

+ (SS)

111

(BX)+ disp

+ (DS)

7. Примеры команд пересылки с различными способами адресации операндов

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

1) Регистровая адресация - операнд находится в регистре:

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

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

код операции = 100100, d = 1, w = 1, mod = 11, reg = 000, r/m = 011.

2) Непосредственная адресация - операнд находится непосредственно в команде:

MOV AX, 25 ; 25 AX

CONST EQU 34h; именованная константа CONST

MOV AX, CONST; 34h AX

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

MOV AX, ES:0001 ; ((ES) + 0001) AX.

ES - регистр сегмента данных, 0001 - смещение внутри сегмента. Содержимое двух байтов, начиная с адреса (ES) + 0001 пересылаются в AX. Прямая адресация может быть записана с помощью символического имени, которое предварительно поставлено в соответствие некоторому адресу памяти, с помощью специальной директивы определения памяти, например, DB - байт, DW - слово, DD - двойное слово. Если в сегменте ES содержится директива Var_p DW, тогда по команде

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

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

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

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

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

MOV AX, [SI].

Для хранения адреса памяти могут использоваться регистры SI, DI, BX, BP, EAX. EBX, ECX, EDX, EBP, ESI, ED, но не могут использоваться AX, CX, DX, SP, ESP.

5) Адресация по базе со смещением:

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

MOV AX, [BX+2] MOV AX, 2[BX]

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

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

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

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

7) Адресация по базе с индексированием

MOV AX, Arr[BX][DI] ; ((DS)+(BX)+(DI)+Arr) AX.

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

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

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. Размер передаваемых данных определяется типом операндов в команде.

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

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

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

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

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

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

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

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

Выражение может быть константным или адресным, а тип - BYTE, WORD, DWORD и т.д.

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

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

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

MOV byte PTR [SI], 0

MOV [SI], byte PTR 0

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

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

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

MOV AX, X ; ошибка, Х - 1байт, АХ - 2 байта.

MOV AL, R ; ошибка

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

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

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

1) команду обмена значений операндов.

XCHG OP1, OP2 ; r r r " m

MOV AX, 10h

MOV BX, 20h

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

2) команду BSWOP для перестановки значений байтов внутри регистра. Например, если (EAX) = 12345678h, то после выполнения команды BSWOP EAX содержимое (EAX) = 78563412h.

3) команды конвертирования:

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

CWD ;( AX) DS:AX (для i386 и выше)

EWDE ; ( AX) EAX

CDF ; (EAX) EDX:EAX

4) команды условной пересылки CMOVxx:

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

5) команду загрузки адреса:

LEA OP1, OP2

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

LEA BX, M[DX][DI]

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

архитектура микропроцессор память ассемблер

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

I этап - преобразование исходного модуля в объектный - ассемблирование. Исходных модулей может быть 1 или несколько. II этап - с помощью программы редактора связей объектные модули объединяются в загрузочный, исполняемый модуль. III этап - выполнение программы.

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

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

Команда на Ассемблере состоит из четырех полей:

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

Поля отделяют друг от друга хотя бы одним пробелом. В квадратных скобках указаны необязательные поля, все поля, кроме <код операции>, могут отсутствовать. <имя> - символическое имя Ассемблера. Имя используется в качестве метки для обращения к этой команде, передачи управления на данную команду, [:] после имени означает, что метка является внутренней. Код операции определяет, какое действие должен выполнить процессор. Поле <операнды> содержит адреса данных, или данные, участвующие в операции, а также место расположения результатов операции. Операндов может быть от 1 до 3, они отделяются друг от друга запятой. Комментарии отделяются кроме пробела еще и ";" и могут занимать всю строку или часть строки.

Например:

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

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

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

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

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

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

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

Здесь <имя> - символическое имя Ассемблера, <код псевдооперации> - определяет назначение директивы. Операндов может быть различное количество и для одной директивы.

Например:

M1 DB 1, 0, 1, 0, 1

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

M2 DB ?,?,?

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

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

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

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

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

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

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

Sseg Segment…

----/-----

Sseg ends

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

Dseg Segment…

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

Dseg end

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

Cseg Segment…

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

Cseg end

end start

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

ASSUME SS:SSeg, DS:DSeg, CS:CSeg, CS:DSeg;

Здесь на DSeg ссылаются два сегментных регистра и DS, и CS, это значит, что содержимое этих сегментов будет одинаковым, т.е. адреса начала двух сегментов данных будут одинаковыми.

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

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

Cseg Segment…

ASSUME SS:SSeg, DS:DSeg, CS:CSeg, CS:DSeg

pr1 Proc

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

pr2 Proc

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

pr2 endp

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

pr1 endp

Cseg ends

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

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

; Prim1.ASM

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

Sseg Segment…

DB 256 DUP(?)

Sseg ends

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

Dseg Segment…

X DB `A'

Y DB `B'

Z DB `C'

Dseg ends

Cseg Segment…

ASSUME SS:SSeg, DS:DSeg, CS:CSeg

Start Proc FAR

Push DS

Push AX

MOV DX, DSeg

MOV DS, DX

CALL Main

Ret

Start endp

Main Proc NEAR

ADD AL, X

MOV AX, Y

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

ret

Main endp

Cseg ends

end Start

Строки 1, 5, 11 - это комментарии. Кодовый сегмент содержит две последовательные процедуры. Первая процедура - внешняя, об этом говорит параметр FAR в директиве proc.

Строки 15 -18 - реализуют связь с операционной системой и определяют адрес начала сегмента данных. Строка 19 - это обращение к внутренней процедуре Main, строка 20, команда Ret - возврат в ОС. Main - внутренняя процедура, о чем говорит параметр NEAR в директиве начала процедуры Proc. Директива end имеет параметр Start, определяющий точку входа в программу, т.е. команду, с которой должно начинаться выполнение программы. Внутренняя процедура это процедура, к которой можно обратиться только из того сегмента, в котором она содержится. К внешней процедуре можно обратиться из любого сегмента. По умолчанию (если в директиве начала процедуры параметр отсутствует) процедура является внутренней.

10. Алфавит, слова, константы, выражения, переменные

Алфавит языка Ассемблер состоит из символов трех категорий: букв латинского алфавита, арабских цифр и специальных символов.

Символические имена в Ассемблере могут состоять из строчных и прописных букв латинского алфавита, цифр от 0 до 9 и некоторых символов `_', `.', `?', строчные и прописные буквы не различаются, количество значимых символов в имени равно 31.

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

Целые двоичные - это последовательности 0 и 1 со следующим за ними символом `b', например, 10101010b или 11000011b.

Целые десятичные - это обычные десятичные числа, возможно заканчивающиеся буквой d, например, - 125 или 78d.

Целые шестнадцатеричные числа - должны начинаться с цифры и заканчиваются символом `h', если первая цифра шестнадцатеричного числа это - `A', `B', `C', `D', `E', `F', то перед ним необходимо поставить ноль, иначе они будут восприниматься как символические имена, например, 12ABh, 79CDh, 0AE5Ah.

Числа действительные с плавающей точкой представляются в виде мантиссы и порядка, например, - 34.751е+02 - это 3475.1 или 0.547е-2 - это 0.00547.

Символьные данные - это последовательности символов, заключенные в апострофы или двойные кавычки, например, 'abcd', 'a1b2c3', `567'.

Также, как и в языках высокого уровня, в Ассемблере могут использоваться именованные константы. Для этого существует специальная директива EQU. Например,

M EQU 27 ; директива EQU присваивает имени М значение 27.

Переменные в Ассемблере определяются с помощью директив определения данных и памяти, например,

v1 DB 0CFh

v2 DW 34

или с помощью директивы ` = '

v3 = 100

v3 = v3+1

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

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

Операнды - это константы или переменные. Операторы - это знаки операций: арифметических, логических, отношений и некоторых специальных.

Арифметические операции: `+', `-`, `*', `/', mod.

Логические операции: NOT, AND, OR, XOR.

Операции отношений: LT(<), LE(), EQ(=), NE(), GT(>), GE().

Операции сдвига: сдвиг влево(SHL), сдвиг вправо(SHR).

Специальные операции: offset и PTR.

offset <имя> - ее значением является смещение операнда, а операндом может быть метка или переменная;

PTR - определяет тип операнда, которым может быть:

BYTE = 1 байт,

WORD = 2 байт,

DWORD = 4 байт,

FWORD = 6 байт,

QWORD = 8 байт,

TWORD = 10 байт;

или тип вызова: NEAR - ближний, FAR - дальний.

Примеры выражений: 1) 10010101b+37d 2) OP1 LT OP2

3) (OP3 GE OP4) AND (OP5 LT OP6) 4) 27 SHL 3 ;

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

Общий вид директивы определения следующий:

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

где x - это один из символов: B - определить байт, W - определить слово, D - определить двойное слово, F - определить 6 байтов памяти, Q - определить 8 байтов памяти, T - определить 10 байтов памяти. В поле операндов может быть знак вопроса, одна или несколько констант, разделенных запятой. Имя, если оно есть, определяет адрес первого байта выделяемой области. Директивой выделяется указанное количество байтов, и указанные операнды заполняют соответствующие поля памяти. Если операндом является знак вопроса (?), то значением соответствующего поля будет случайная величина. Примеры:

1)R1 DB 0, 0, 0, 0 ; выделено 4 байта, заполненных 0.

Адрес первого байта - R1, второго R1+1, третьего - R1+2, четвертого - R1+3

2)R2 DB ?, ?, ? ; выделено 3 байта, заполненных случайными величинами.

3) Если операндом является символическое имя IM1, которое

соответствует смещению 03АС1h в сегменте, то после выполнения

M DD IM1

будет выделено 4 байта памяти, двойное слово с адресом - М. и значением - 03АС1h.

4) Если необходимо выделить 100 байтов памяти и заполнить их 1, то это можно сделать с помощью специального повторителя DUP.

D DB 100 DUP (1)

5) Определить одномерный массив слов с адресом первого

элемента массива, именем MAS и конкретными значениями можно так:

MAS DW 1, 7, 35, 75, 84

6) Определение двумерного массива ARR(3,4):

Выделили 100 байтов памяти, ничем не заполняя.

В директиве определения байта (слова) максимально допустимая константа - 255 (65535).

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

12. Команда прерывания, команды работы со стеком

С помощью команды прерывания приостанавливается работа процессора, управление передается DOC или BIOS и после выполнения какой-то системной обрабатывающей программы, управление передается команде, следующей за командой Int.

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

Например, чтобы вывести на экран символ восклицательный знак `!' необходимо выполнить три команды:

MOV AH, 6

MOV DL, `!'

Int 21h ;

Команда int с параметром 21h передает управление обработчику функций операционной системы, который по содержимому регистра AH определяет какую функцию следует выполнить. Функция с номером 6 - это вывод на экран символа, хранящегося в регистре DL. Процессор выполняет программу вывода на экран символа и возвращается к выполнению текущей программы, начиная с команды, следующей за int.

Для работы со стеком используются регистры SS, SP/ESP и BP/EBP.

Сегментный регистр SS содержит адрес начала сегмента стека. ОС сама выбирает этот адрес и пересылает его в регистр SS. Регистр SP указывает на вершину стека и при добавлении элемента в стек содержимое этого регистра уменьшается на длину операнда.

Добавить элемент в стек можно с помощью команды

PUSH <операнд>,

где операндом может быть как регистр, так и переменная.

Удалить элемент с вершины стека можно с помощью операции

POP <операнд>.

Для i186 и выше команды PUSHA/ POPA позволяют положить в стек, удалить из стека содержимое всех регистров общего назначения в последовательности AX, BX, CX, DX, SP, BP, SI, DI. Для i386 и выше команды PUSHAD/ POPAD позволяют положить в стек, удалить из стека содержимое всех регистров общего назначения в последовательности EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI.

Используя регистр указателя вазы BP, к любому элементу стека можно обратиться следующим образом:

MOV BP, SP; (SP)BP

MOV AX, [BP+6] ; (SS:(BP+6))AX.

Содержимое двух байтов памяти, начиная с адреса, определенного вторым операндом, пересылается в регистр AX.

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

TITLE Prom.ASM

Page , 120

; описание сегмента стека

SSeg Segment Para stack `stack'

DB 100h DUP (?)

SSeg ends

; описание сегмента данных

DSeg Segment Para Public `Data'

DAN DB '1', `3', `5', `7'

REZ DB 4 DUP (?)

DSeg endS

; кодовый сегмент оформлен как одна внешняя процедура

СSeg Segment Para Public `Сode'

ASSUME SS:SSeg, DS:DSeg, CS:CSeg

Start Proc FAR

PUSH DS; организация связи с ОС

XOR AX, AX

PUSH AX

MOV AX, DSeg; ; загрузка адреса сегмента данных в регистр DS

MOV DS, AX;

; пересылка данных в обратной последовательности с выводом на экран

MOV AH, 6

MOV DL, DAN

MOV REZ+3, DL

Int 21h

MOV DL, DAN+1

MOV REZ+2, DL

Int 21h

MOV DL, DAN+2

MOV REZ+1, DL

INT 21h

MOV DL, DAN+3

MOV REZ, DL

Int 21h

;

MOV AH, 4CH

INT 21h

Start endp

CSeg ends

End Start

Директива TITLE определяет заголовок листинга программы, может содержать до 60 символов. Директива NAME определяет количество строк на странице листинга -1-й параметр и количество символов на странице - 2-й параметр. Если какой-то из параметров отсутствует, то используется значение по умолчанию. Если отсутствуют оба параметра, то директива осуществляет переход на следующую страницу листинга.

Директива начала сегмента

Общий вид директивы:

<имя>Segment<ReadOnly> <выравнивание> <тип> <размер> <'класс'>

Любой из операндов может отсутствовать. Если <ReadOnly> есть, то будет выведено сообщение об ошибке при попытке записи в этот сегмент.

Операнд <выравнивание> определяет требования к адресу начала сегмента. Значениями этого операнда могут быть:

• BYTE - адрес начала сегмента может быть любым,

• WORD - адрес начала сегмента кратен 2,

• DWORD - адрес начала сегмента кратен 4,

• Para - адрес начала сегмента кратен 16 - по-умолчанию,

• Page - адрес начала сегмента кратен 256.

Операнд <тип> определяет тип сегмента. В сегменте стека указывается stack, для остальных сегментов - Public. Если такой параметр присутствует, то все сегменты с одним именем и различными классами объединяются в последовательность в порядке их записи. Значение `Common', говорит, что сегменты с одним именем объединены, но не последовательно, а с одного и того же адреса так, что общий размер сегмента будет равен не сумме, а максимуму из них. Значение `Private' означает, что этот сегмент ни с каким другим объединяться не должен.

Точечные директивы

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

.MODEL - директива, определяющая модель, размер выделяемой памяти для программы.

Модель определяется параметром директивы, которым может быть:

tiny - под всю программу выделяется 1 сегмент памяти,

small - под данные и под программу выделяются по одному сегменту,

medium - под данные выделяется один сегмент, под программу выделяется n сегментов,

compact - под программу выделяется один сегмент, под данные выделяется n сегментов,

large - под данные и под программу выделяется по n сегментов,

huge - позволяет использовать сегментов больше, чем позволяет ОП.

Пример использования точечных директив в программе на Асс-ре.

.MODEL

.STACK

.DATA

St1 DB `Line1', `$'

St2 DB `Line2', `$'

St3 DB `Line3', `$'

.CODE

begin: MOV AH, 9; номер функции вывода строки на экран

MOV DX, offset St1; адрес, который содержится в регистре DX

Int 21h

MOV DX, offset St2

Int 21h

MOV AH, 4CH

Int 21h

end begin

`$'определяет конец строки, которую необходимо вывести на экран в результате выполнения программы на экране будет:

Line1 Line2 Line3.

Если необходимо вывести результат в три строки

Line1

Line2

Line3,

то в сегмент данных необходимо внести изменения

St1 DB `Line1', 13, 10, `$'

St2 DB `Line2', 0Dh, 0Ah, `$'

St3 DB `Line3', `$'

Здесь константы 13 и 10, или в шестнадцатеричном формате 0Dh и 0Ah осуществляют перевод строки и возврат каретки, т.е. переход в начало следующей строки.

Com-файлы

После обработки исходного текста программы компилятором и редактором связей будет получен исполняемый exe-файл, который содержит блок начальной загрузки, размером не менее 512 байт. Однако, существует возможность создания другого вида исполнительного файла, который может быть получен на основе exe-файла с помощью системной обрабатывающей программы EXE2BIN.com или его можно создать с помощью специальной среды разработки. Но не из всякого exe-файла можно создать com-файл. Исходный файл, для которого можно создать com-файл, должен удовлетворять определенным требованиям. Отличия exe-файла от com-файла:

• В com-файлах отсутствует блок начальной загрузки и, следовательно, занимает меньше места, чем exe-файл. exe-файл может занимать произвольный объем ОП., com-файл может занимать только один сегмент памяти.

• Стек создается автоматически ОС, поэтому у пользователя нет необходимости выделять для него место.

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

Так как вся программа содержится в одном сегменте, перед выполнением программы все сегментные регистры содержат в качестве значения адрес префикса программного сегмента, блока PSP

PSP - 256 байтный блок, который содержится как в exe-файле, так и в com-файле, и так как адрес первой исполняемой команды отстоит на 256 байтов от адреса начала сегмента (100h), то сразу после директивы ASSUME используется специальная директива

org 100h, осуществляющая обход префикса программного сегмента .

Примеры программы, удовлетворяющей требованиям создания исполняемого com-файла.

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

TITLE Prim Сom-файл

Page 60 , 85

СSeg Segment Para `Сode'

ASSUME SS:CSeg, DS:CSeg, CS:CSeg

Org 100h

Start: JMP Main

St1 DB `String1', 13, 10, `$'

St2 DB `String2', `$'

Main Proc

MOV AH, 9

LEA DX, St1

INT 21h

LEA DX, St2

Int 21h

MOV AH, 4CH

Int 21h

Main endp

CSeg ends

End Start

2) С использованием точечных директив сегментации, данные размещены перед программой:

.Model tiny

.Code

JMP Met

St1 DB `String1', `$'

Met: MOV AH, 09h

LEA DX, St1

Int 21h

MOV AH, 4Ch

Int 21h

End Met

3) Фрагмент исходного текста программы для создания com-файла, когда данные размещены после программы:

Beg Proc

MOV AH, 9

LEA DX, St1

Int 21h

MOV AH, 4Ch

Int 21h

Beg endp

St1 DB `String1', `$'

end beg

Замечания:

• Не каждый исходный файл удовлетворяет требованиям com-файла.

• Небольшие по объему программы рекомендуется оформлять как com-файл.

• Исходный файл, написанный как com-файл, не может быть выполнен как EXE-файл

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

Сложение (вычитание) беззнаковых чисел выполняется по правилам аналогичным сложению (вычитанию) по модулю 2k , принятым в математике. В математике k+1 разряд теряется, отбрасывается, а в информатике, если в результате более k разрядов, то флаг CF устанавливается в 1.

X+Y = (X+Y) mod 2k = X+Y, CF = 0, если X+Y<2k

X+Y = (X+Y) mod 2k = X+Y-2k, CF = 1, иначе

Пример: в байте

250 + 10 = (250+10) mod 28 = 260 mod 256 = 4

260 = 1000001002, CF = 1, результат 000001002 = 4

X - Y = (X-Y) mod 2k = X-Y, CF = 0, если X>Y

X+Y = (X+Y) mod 2k = X+2k -Y, CF = 1, иначе

Пример: в байте

1 - 2 = 1 - 28 - 2 = 275 - 2 = 255, CF = 1

Сложение (вычитание) знаковых чисел сводится к сложению (вычитанию) с использованием дополнительного кода.

X = 10n - |X|

В байте:

-1 = 256 - 1 = 255 = 111111112

-3 = 256 - 3 = 253 = 111111012

3 + (-1) = ( 3 + (-1)) mod 256 = 258 mod 256 = 2

1 + (-3) = (1 + (-3)) mod 256 = 256 - 254 = 111111102 = -2

13. Команды сложения и вычитания в Ассемблере

В Ассемблере команды сложения:

1) ADD OP1, OP2; OP1+OP2OP1

2) ADC OP1, OP2; OP1+OP2+CFOP1

3) XADD OP1, OP2; для i486 и выше OP1"OP2 и затем OP1+OP2OP1

4) INC OP1; OP1+1OP1

В Ассемблере команда вычитания:

1) SUB OP1, OP2; OP1-OP2OP1

2) SBB OP1, OP2; OP1-OP2-CFOP1

3) DEC OP1; OP1 - 1OP1.

Примеры:

X = 1234AB12h, Y = 5678CD34h,

X + Y =

MOV AX, 1234h

MOV BX, AB12h

MOV CX, 5678h

MOV DX, CD34h

ADD BX, DX

ADC AX, CX

X - Y = SUB BX, DX

SBB AX, CX

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

OF, CF, SF, ZF, AF, PF.

Пример1:

MOV AL, 95h

ADD AL, 82h

95h + 82h = 117h

95 = 100101012 82 = 100000102

100101012+100000102=1000101112,

CF = 1, OF = 1, SF = 0, ZF = 0, AF = 0, PF = 1.

Пример2:

MOV AL, 9h

SUB AL, 5h

9 - 5 = 4 5 = 00000101 -5 = 11111011 9 = 00001001

9 + (-5) = 11111011 + 00001001 = 100000100

CF = 1, OF = 0, SF = 0, ZF = 0, AF = 1, PF = 0.

Умножение и деление в Ассемблере

Умножение беззнаковых чисел.

MUL OP2 ; OP2*(AL) (AX) (EAX) AX DX:AX EAX.

Умножение знаковых чисел.

IMUL OP2; аналогично MUL

IMUL OP1, OP2

OP1 - это всегда регистр, OP2 - непосредственный операнд, регистр или память.

При умножении результат имеет удвоенный формат по отношению к сомножителям. Иногда точно известно, что результат может уместиться в формат сомножителей, тогда его можно извлекать из AL, AX, EAX.

Размер результата можно выяснить с помощью флагов OF и CF.

Если OF = CF = 1, то результат занимает двойной формат,

и OF = СF = 0 в противном случае. Остальные флаги не изменяются.

Деление беззнаковых чисел:

DIV OP2 ; OP2 это r m

Деление знаковых чисел.

IDIV OP2 ; OP2 это r m

В результате выполнения этих команд содержимое регистров

(AX) (DX:AX) (EDX:EAX) делится на указанный операнд и результат помещается в AL AX EAX, остаток помещается в AH DX EDX. Значение флагов не меняется, но может наступить деление на ноль, или переполнение, например:

MOV AX, 600

MOV BH, 2

DIV BH ; 300 не умещается в AL, будет сообщение об ошибке

Приведем пример программы с использованием команд деления: цифры целого беззнакового байтового числа N записать в байты памяти, начиная с адреса D как символы.

Если цифры трехзначного числа обозначить буквами a, b, c - N(abc), то получить их можно по формулам:

c = N mod 10

b = (N div 10) mod 10

a = (N div 10) div 10

Перевести цифру в символ можно так: код(i) = код (`0') + I, тогда фрагмент программы может быть таким:

------------------

MOV BL, 10 ; делитель

MOV AL, N ; делимое

MOV AH, 0 ; расширяем делимое до слова

; или CBW AH конвертируем до слова

DIV BL ; A L = ab, AH = c

MOV D + 2, AH

ADD AH, 0

DIV BL ; AL = a, AH = b

ADD AL, `0'

MOV D, AL

ADD AH, `0'

MOV D+1, AH

Директивы внешних ссылок

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

PUBLIC <имя>[, <имя>,…,<имя>] -

определяет указанные имена как глобальные величины, к которым можно обратиться из других модулей. Имена это имена меток и переменных, определенных с помощью директивы `=' и EQU.

Если некоторое имя определено в модуле А как глобальное и к нему нужно обратиться из других модулей В и С, то в этих модулях должна быть директива вида

EXTRN <имя>:<тип>[,<имя>:<тип>…]

Здесь имя тоже, что и в Public, а тип определяется следующим образом: если <имя> - это имя переменной, то типом может быть:

BYTE, WORD, DWORD, FWORD, QWORD, TWORD;

если <имя> - это имя метки, то типом может быть NEAR, FAR.

Директива EXTRN говорит о том, что перечисленные имена являются внешними для данного модуля.

Пример:

Пусть в модуле А содержится:

Public TOT

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

TOT DW 0;

Чтобы обратиться из В и С к переменной TOT, в них должна быть директива EXTRN TOT:WORD

В Ассемблере есть возможность подключения на этапе ассемблирования модулей, расположенных в файлах на диске с помощью директивы INCLUDE <имя файла>

Пример:

INCLUDE С:\WORK\Prim.ASM

Файл Prim.ASM, расположенный в указанной директории, на этапе ассемблирования записывается на место этой директивы.

Команды управления

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

Команда безусловной передачи управления имеет вид JMP <имя>,

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

JMP M1 ; по умолчанию М1 имеет тип NEAR

Если метка содержится в другом сегменте, то в том сегменте, в который передается управление, должна быть директива Public M1, а в том сегменте из которого передается управление должна быть директива - EXTRN M1:FAR. Кроме того, передачу можно осуществлять с использованием прямой адресации (JMP M1) или с использованием косвенной адресации (JMP [BX]). Команда, осуществляющая близкую передачу, занимает 3 байта памяти, а дальнюю - 5 байтов. Но если передача осуществляется не далее чем на -128 или 127 байтов, то можно использовать команду безусловной передачи управления JMP Short <метка>, занимающую 1 байт памяти.


Подобные документы

  • Ассемблер как символический аналог машинного языка. Архитектура микропроцессора: организация памяти, способы адресации операндов, правила использования регистров. Текст программы. Этапы программирования на ассемблере, алгоритмы выполнения задач.

    контрольная работа [515,1 K], добавлен 20.01.2016

  • Внутренняя архитектура микропроцессора Intel 486. Формат данных и команд. Регистры общего назначения. Программная модель устройства FPU, регистр флагов. Разработка структуры и микропрограммы микропроцессора, управляющего автомата с жесткой логикой.

    курсовая работа [1,6 M], добавлен 27.05.2013

  • Изучение базовых команд ПК на базе МП i286 и их форматов. Изучение прямых способов адресации данных. Наработка практических навыков работы с командами. Разработка регистровой модели выполнения операций передачи данных. Программа реализации команд.

    контрольная работа [42,2 K], добавлен 12.03.2011

  • Функциональная схема микропроцессора Intel 8086 (i8086). Формирование физического адреса памяти, выборка команд из памяти и запись их в очередь команд. Система команд процессора. Суть защищенного режима, переход из защищенного режима в реальный режим.

    практическая работа [93,3 K], добавлен 24.03.2013

  • Типы команд, синтаксис ассемблера и код операции, по которому транслируется команда. Команды вычисления и непосредственной пересылки данных между регистрами. Поле для определения операции вычисления. Управление последовательностью выполнения программы.

    реферат [29,1 K], добавлен 13.11.2009

  • Краткий обзор процессоров фирмы intel. Основные характеристики i80286: режим реальной адресации, режим защиты, сопроцессор i80287, условия программирования i80287. Основные характеристики i80386: 32-битная архитектура, способы адресации.

    курсовая работа [29,9 K], добавлен 23.06.2007

  • Модель целочисленного MMX-расширения и особенности работы сопроцессора. Отображение ММХ-регистров на регистры стека сопроцессора. Система команд MMX: команды пересылки, сложения и вычитания, сравнения, логических операций, сдвига, упаковки и распаковки.

    презентация [240,3 K], добавлен 11.12.2013

  • Изучение элементов структуры микропроцессора i80386 и алгоритмов выполнения множества команд. Разработка проекта структуры АЛУ и структуры микро-ЭВМ на базе гипотетического процессора. Описание и создание программы эмуляции по выполнению заданных команд.

    курсовая работа [484,4 K], добавлен 07.09.2012

  • Характеристика регистров памяти как устройств временного хранения данных. Различия между прерываниями и исключениями команд, их обработка. Вычисление производительности ЭВМ. Программа с использованием отложенного запуска команд. Виды компьютерных сетей.

    контрольная работа [24,9 K], добавлен 09.11.2010

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

    дипломная работа [213,9 K], добавлен 02.04.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.