Вы находитесь на странице: 1из 42

Республика Молдова

Министерство Образования, Культуры и Исследования


Образцово-показательный Центр в Энергетике и Электронике
Кафедра: Компьютеры
Предмет: Менеджмент и маркетинг

ОТЧЕТ
По практической работе
На тему: “Рынок предприятий и товарный рынок. ”

Выполнила: Уч-ся гр. С-142


Лищенко А.

Проверила: Преподаватель по специальности


Мурса Н.

Кишинев 2018
Республика Молдова
Министерство Образования, Культуры и Исследования
Образцово-показательный Центр в Энергетике и Электронике
Кафедра: Компьютеры
Предмет: Язык ассемблера

РЕФЕРАТ
На тему: “Команды пересылки данных в ассемблере.
Арифметические инструкции. Логические инструкции.”

Выполнила: Уч-ся гр. С-142


Лищенко А.

Проверила: Преподаватель по специальности


Чурарь М.

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

Большинство проблемных программ пишется на языках высокого


уровня, поскольку они в известном смысле проще для использования и
требуют гораздо менее детального изучения конкретной вычислительной
установки, чем язык ассемблера. С другой стороны, в связи с большой
эффективностью использования языка ассемблера и тесной связи системных
программ с конкретной ЭВМ, большинство этих программ пишется на языке
ассемблера. В дальнейшем мы увидим, что знание языка ассемблера
совершенно необходимо системным программистам и так же достаточно
полезно и тем, кто пишет проблемные программы.
КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ И АРИФМЕТИЧЕСКИЕ
КОМАНДЫ
 Инструкция MOV в ассемблере самая простая. Синтаксис этой
команды такой: MOV ПРИЁМНИК, ИСТОЧНИК.

С помощью этой команды можно переместить значение


из ИСТОЧНИКА в ПРИЁМНИК. То есть по сути команда MOV копирует
содержимое ИСТОЧНИКА и помещает это содержимое в ПРИЁМНИК.
Никакие флаги при этом НЕ изменяются. При использовании этой команды
следует учитывать, что имеются некоторые ограничения. А именно,
инструкция MOV не может:

 Записывать данные в регистры CS и IP.


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

ИСТОЧНИКОМ может быть один из следующих:

 Область памяти (MEM)


 Регистр общего назначения (REG)
 Непосредственное значение (например, число) (IMM)
 Сегментный регистр (SREG)

ПРИЁМНИКОМ может быть один из следующих:

 Область памяти (MEM)


 Регистр общего назначения (REG)
 Сегментный регистр (SREG)
Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды
делают вычисления. Их можно узнать многие из них по их названиям: add
(addition - добавление), sub (substraction - вычитание), mul (multiply -
умножение), div (divide - деление).

Опкод add имеет следующий синтаксис:

add приемник, источник

Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемни
источник пример
к
регистр регистр add ecx, edx
регистр память add ecx, dword ptr [104h] / add ecx, [edx]
регистр значение add eax, 102
память значение add dword ptr [401231h], 80
память регистр add dword ptr [401231h], edx

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


значению приемника и помещает результат в приемник. Другие
математические команды:

sub приемник, источник (приемник = приемник - источник)

mul множимое, множитель (множимое = множимое * множитель)

div делитель (eax = eax / делитель, edx = остаток)

Поскольку регистры могут содержать только целочисленные значения


(то есть числа, не, с плавающей запятой), результат деления разбит на
частное и остаток. Теперь, в зависимости от размера источника, частное
сохраняется в eax, а остаток в edx:
размер источника деление частное в... остаток в...
BYTE (8-bits) ax / делитель AL AH
WORD (16-bits) dx:ax* / делитель AX DX
DWORD (32-bits) edx:eax* / делитель EAX EDX

* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax


- значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax -
значение quadword (64 бита), где старшее dword в edx и младшее в eax.

Источник операции деления может быть:

1. 8-бит регистр (al, ah, cl,...)


2. 16-бит регистр (ax, dx, ...)
3. 32-бит регистр (eax, edx, ecx...)
4. 8-бит значение из памяти (byte ptr [xxxx])
5. 16-бит значение из памяти (word ptr [xxxx])
6. a 32-бит значение памяти (dword ptr [xxxx])

Источник не может быть непосредственным значением, потому что


тогда процессор не сможет определить размер исходного операнда.

Увеличение/Уменьшение - INC/DEC. Есть 2 очень простые команды,


DEC и INC. Эти команды увеличивают или уменьшают содержимое памяти
или регистра на единицу. Просто поместите:

inc регистр ; регистр = регистр + 1

dec регистр ; регистр = регистр - 1

inc dword ptr [103405] ; значение в [103405] будет увеличено на 1.

dec dword ptr [103405] ; значение в [103405] будет уменьшено на 1.


ЛОГИЧЕСКИЕ КОМАНДЫ
Методики условных вычислений на самом нижнем (двоичном) уровне
основаны на четырех основных операциях двоичной алгебры: И, ИЛИ,
ИСКЛЮЧАЮЩЕЕ ИЛИ и НЕ. Эти операции положены в основу работы
логических схем компьютера, а также его программного обеспечения. В
системе команд процессоров семейства x86 предусмотрены команды AND,
OR, XOR, NOT, TEST и ВT, выполняющие перечисленные выше булевы
операции между байтами, словами и двойными словами.

Логические команды процессора:

Команда Описание
AND Выполняет операцию логического И между двумя операндами
OR Выполняет операцию логического ИЛИ между двумя
операндами
XOR Выполняет операцию исключающего ИЛИ между двумя
операндами
NOT Выполняет операцию логического отрицание (НЕ)
единственного операнда
TEST Выполняет операцию логического И между двумя операндами,
устанавливает соответствующие флаги состояния процессора,
но результат операции не записывается вместо операнда
получателя данных

Команда AND выполняет операцию логического И между


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

Существуют следующие варианты команды AND:

AND reg, reg

AND reg, mem


AND reg, imm

AND mem, reg

AND mem, imm

Команда AND может работать с 8-, 16- или 32-разрядными операндами,


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

Команда OR выполняет операцию логического ИЛИ между


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

В команде OR используются аналогичные команде AND типы


операндов:

OR reg, reg

OR reg, mem

OR reg, imm

OR mem, reg

OR mem, imm

Команда OR может работать с 8-, 16- или 32-разрядными операндами,


причем длина у обоих операндов должна быть одинаковой. При выполнении
операции поразрядного логического ИЛИ значение результата будет равно 1,
если хотя бы один из битов пары операндов равен  1.
Команда XOR выполняет операцию ИСКЛЮЧАЮЩЕГО ИЛИ между
соответствующими парами битов операндов команды и помещает результат
на место операнда получателя данных: XOR получатель, источник.

В команде XOR используются аналогичные командам AND и OR типы


операндов:

XOR reg, reg

XOR reg, mem

XOR reg, imm

XOR mem, reg

XOR mem, imm

Команда XOR может работать с 8-, 16- или 32-разрядными операндами,


причем длина у обоих операндов должна быть одинаковой. При выполнении
операции поразрядного ИСКЛЮЧАЮЩЕГО ИЛИ значение результата будет
равно 1, если значения битов пары операндов различны, и 0 — если значения
битов равны. 

Команда NOT позволяет выполнить инверсию всех битов операнда, в


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

NOT reg

NOT mem

Команда TEST выполняет операцию поразрядного логического И


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

ЗАКЛЮЧЕНИЕ
Ассемблер является символическим аналогом машинного языка. По
этой причине программа, написанная на ассемблере, должна отражать все
особенности архитектуры микропроцессора: организацию памяти, способы
адресации операндов, правила использования регистров и т. д. Из-за
необходимости учета подобных особенностей ассемблер уникален для
каждого типа микропроцессоров. Когда-то ассемблер был языком, без знания
которого нельзя было заставить компьютер сделать что-либо полезное.
Постепенно ситуация менялась. Появлялись более удобные средства
общения с компьютером. Но в отличие от других языков ассемблер не
умирал, более того, он не мог сделать этого в принципе. По-настоящему
решить проблемы, связанные с аппаратурой (или, даже более того, зависящие
от аппаратуры, как, к примеру, повышение быстродействия программы),
невозможно без знания ассемблера.

Программист или любой другой пользователь могут использовать


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

ЛИТЕРАТУРА
1. Финогенов К.Г. Основы языка Ассемблера. – М.: Радио и связь,2000.
2. Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3. Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4. Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.: Питер, 2000.

Республика Молдова
Министерство Образования, Культуры и Исследования
Образцово-показательный Центр в Энергетике и Электронике
Кафедра: Компьютеры
Предмет: Язык ассемблера

РЕФЕРАТ
На тему: “Система прерываний в языке ассемблера. ”

Выполнила: Уч-ся гр. С-142


Лищенко А.

Проверила: Преподаватель по специальности


Чурарь М.

Кишинев 2018

ВВЕДЕНИЕ
Прерывание представляет собой операцию, которая приостанавливает
выполнение программ для специальных системных действий. Необходимость

прерываний обусловлено двумя основными причинами: преднамеренный


запрос таких действий, как операции ввода-вывода на различные устройства
и

непредвиденные программные ошибки (например, переполнение при


делении).

Система BIOS (Basic Input/Output System) находится в ROM и


управляет

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

некоторые прерывания для вывода на экран дисковых операций ввода-


вывода и печати. В этой главе описаны различные BIOS- и DOS-прерывания,
резидентные программы и команды IN и OUT.
СИСТЕМА ПРЕРЫВАНИЯ ПРОГРАММ
Одним из принципиальных отличий компьютера от любой другой
машины, является то, что ПК способен реагировать на непредсказуемые
события в процессе работы. Эта способность обеспечивается с помощью
особого свойства компьютера - аппарата прерываний,

Прерывание позволяет компьютеру приостановить любое свое


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

Способность к прерыванию разрешает, казалось бы, сложнейшую


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

Микропроцессор нашего ПК имеет “ врожденную” способность


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

Каждая часть компьютера, которой может потребоваться внимание


микропроцессора, получает свой собственный номер, так что всякий раз,
когда мы нажимаем клавишу, (а вернее, когда мы её отпускаем после
нажатия), микропроцессор узнает об этом благодаря появлению
прерываний. Внутренний таймер ПК также обладает способностью
прерываться для того, чтобы дать возможность хронометрирующей
программе “ слышать” каждый “удар” часов - таймера, который
повторяется 18 раз/с. Все это кажется нам сплошным прерыванием,
особенно эти 18 прерываний за секунду, которые, как может показаться,
способны “до смерти” загнать наш бедный компьютер. Однако
микропроцессор может выполнить десятки тысяч команд за промежуток
времени между двумя ударами часов, так что прерывания таймера не
отнимают у него много времени. Дисководы и принтеры также имеют
присвоенные им собственные номера прерываний. Дисководы
пользуются ими, чтобы сообщить о завершении определенной работы,
порученной им программой; принтеры сигнализируют о том, что у них
кончилась бумага.

Может показаться любопытным, что прерывания вначале не


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

Иногда при выполнении программы может что-нибудь случиться


или с самой программой, или с содержащимися в ней данными. Это
происходит примерно так же, как если бы вы, читая эти строки,
натолкнулись на бессмысленный набор букв, абсолютно ничего не
означающий - “ксеьптръу фмуохэь ъый”. То же самое может, хотя и не
должно, случиться с компьютером. Микропроцессор может наткнуться
на абсолютно бессмысленные для него команды, или данные, от
которых ему просто “стало бы плохо” (например, попытка разделить
число на нуль). Когда это всё-таки происходит, микропроцессор
осуществляет так называемое прерывание в особой ситуации.

Последняя категория прерываний в отличие от других не возникает


неожиданно. Вся идея прерываний настолько эффективна, что
позволяет программам посылать сигнал о том, что им нужна помощь со
стороны другой программы. Такой вид прерывания называется
программным прерыванием. Мы уже упоминали, что наши ПК
оснащены встроенными программами ПЗУ - базовой системой ввода -
вывода. Выполнение нашим компьютером любой программы требует
возможности запросить услуги базовой системы ввода - вывода, и
программное прерывание обеспечивает такую возможность. Программные
прерывания функционируют точно так же, как другие виды прерываний.
Единственное, что отличает их, - это причина прерываний. В данном
случае вместо неожиданной остановки программное прерывание
умышленно вызывается нашими программами. В языке ассемблера
существует специальная команда с именем INT, которая используется в
программах для реализации прерывания.

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


прерывания, используется таблица векторов прерываний, занимающая
первый килобайт оперативной памяти - адреса от 0000:0000 до 0000:
03FF. Таблица состоит из 256 элементов - FAR - адресов обработчиков
прерываний. Эти элементы называются векторами прерываний. В первом
слове элемента таблицы записано смещение, а во втором - адрес
сегмента обработчика прерывания.

Прерыванию с номером 0 соответствует адрес 0000:0000,


прерыванию с номером 1 - 0000:0004 и т.д.

Инициализация таблицы происходит частично BIOS после


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

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


Приведём назначение некоторых наиболее важных векторов:

ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ


Номе Описание
р

0 Ошибка деления. Вызывается автоматически после


выполнения команд DIY или IDIY, если в результате
деления происходит переполнение (например, при делении
на 0). DOS обычно при обработке этого прерывания
выводит сообщение об ошибке и останавливает
выполнение программы. Для процессора 8086 при этом
адрес возврата указывает на следующую после команды
деления команду, а в процессоре 80286 - на первый байт
команды, вызвавшей прерывание.
1 Прерывание пошагового режима. Вырабатывается после
выполнения каждой машиной команды, если в слове
флагов установлен, бит пошаговой трассировки TF.
Используется для отладки программ. Это прерывание не
вырабатывается после выполнения команды MOY в
сегментные регистры или после загрузки сегментных
регистров командой POP .
2 Аппаратное немаскируемое прерывание. Это прерывание
может использоваться по-разному в разных машинах.
Обычно вырабатывается при ошибке четности в
оперативной памяти и при запросе прерывания от
сопроцессора.
3 Прерывание для трассировки. Генерируется при
выполнении однобайтовой машиной команды с кодом
CCh и обычно используется отладчиками для установки
точки прерывания
4 Переполнение. Генерируется машинной командой INTO при
флаге OF. Если флаг не установлен, то команда INTO
выполняется как NOP. Это прерывание используется для
обработки ошибок при выполнении арифметических
операций
5 Печать копии экрана. Генерируется при нажатии на
клавиатуре клавиши PrtScr. Обычно используется для
печати образа экрана. Для процессора 80286 генерируется
при выполнении машинной команды BOUND, если
проверяемое значение вышло за пределы заданного
диапазона
6 Неопределенный код операции или длина команды
больше 10 байт (для процессора 80286)
7 Особый случай отсутствия математического сопроцессора
(процессор 80286)
8 IRQO - прерывание интервального таймера, возникает 18,2
раза в секунду
9 IRQ1 - прерывание от клавиатуры. Генерируется при
нажатии и при отжатии клавиши. Используется для
чтения данных от клавиатуры
А IRQ2 - используется для каскадирования аппаратных
прерываний в машинах класса АТ
В IRQ3 - прерывание асинхронного порта СОМ2. Это и
следующее прерывания особенно важны для нас, т.к. они
используются при работе последовательными портами
(модемами)
С IRQ4 - прерывание асинхронного порта СОМ1
D IRQ5 - прерывание от контроллера жесткого диска для
ХТ
Е IRQ6 - прерывание генерируется контроллером флоппи-
диска после завершения операции

F IRQ7 - прерывание принтера. Генерируется принтером,


когда он готов к выполнению очередной операции.
Многие адаптеры принтера не используют это прерывание.
В некоторых случаях можно использовать это прерывание
для работы с последовательными портами
10 Обслуживание видеоадаптера
11 Определение конфигурации устройств в системе
12 Определение размера оперативной памяти в системе
13 Обслуживание дисковой системы
14 Последовательный ввод - вывод
15 Расширенный сервис для АТ - компьютеров
16 Обслуживание клавиатуры
17 Обслуживание принтера
18 Запуск BASIC в ПЗУ, если он есть
19 Загрузка операционной системы
1А Обслуживание часов
1В Обработчик прерывания Сtr1 - Break
1С Прерывание возникает 18,2 раза в секунду, вызывается
программно обработчиком прерывания таймера
1D Адрес видео таблицы для контроллера видеоадаптера 6845
1Е Указатель на таблицу параметров дискеты
1F Указатель на графическую таблицу символов с кодами
ASCII 128-255
20-5F Используется DOS или зарезервировано для DOS
60-67 Прерывания, зарезервированные для пользователя
68-6F Не используются
70 IRQ8 - прерывание от часов реального времени
71 IRQ9 - прерывание от контроллера ЕGА
72 IRQ10 - зарезервировано
73 IRQ11 - зарезервировано
74 IRQ12 - зарезервировано
75 IRQ13 - прерывание от математического сопроцессора
76 IRQ14 - прерывание от контроллера жесткого диска
77 IRQ15 - зарезервировано
78-7F Не используются
80-85 Зарезервированы для BASIC
86-F0 Используются интерпретатором BASIC
F1-FF Не используются
IRQO- Это аппаратные прерывания, о них будет рассказано
IRQ15 позже.

РАБОТА МЕХАНИЗМА ПРЕРЫВАНИЯ


Каждое определённое прерывание идентифицируется своим номером
(смотри таблицу). Например, таймер и клавиатура и принтер имеют каждый
свой собственный номер прерывания. Что касается базовой системы
ввода/вывода, то её сервисные программы подразделяются на группы,
причём за всеми программами группы закрепляется один номер прерывания.

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


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

Программа обработки прерываний начинает работу, приняв


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

После завершения своих операций программа обработки прерываний может


снова привести в действие другие типы прерываний и выполнять
необходимую работу. Когда операции прерывания заканчиваются, программа
обработки прерываний восстанавливает исходное состояние машины, в
котором она находилась до прерывания, и компьютер продолжает
прерванную работу.
МАСКИРОВКА ПРЕРЫВАНИЙ
Часто при выполнении критических участков программы для того, чтобы
гарантировать выполнение определённой последовательности команд
целиком, приходится запрещать прерывания. Это можно сделать командой
CLI. Её надо поместить в начало критической последовательности команд, а
в конце расположить команду STI, разрешающую процессору воспринимать
прерывания. Команда CLI запрещает только маскируемые прерывания,
немаскируемые всегда обрабатываются процессором.

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


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

ЗАКЛЮЧЕНИЕ
Программы обработки прерываний (или попросту обработчики
прерываний) относятся к важнейшим программным средствам персональных
компьютеров. Запросы на обработку прерываний могут иметь различную
природу. Прежде всего, различают аппаратные прерывания от периферийных
устройств или других компонентов системы и программные прерывания,
вызываемые командой int, которая используется, в частности, для
программного обращения к функциям DOS и BIOS. Сигналы, возбуждающие
аппаратные прерывания, могут инициироваться цепями самого процессора,
например, при попытке выполнения операции деления на ноль (такие
прерывания называются внутренними, или отказами), а могут приходить из
периферийного оборудования (внешние прерывания). Внешние аппаратные
прерывания вызываются, например, сигналами микросхемы таймера,
сигналами от принтера или контроллера диска, нажатием или отпусканием
клавиши. Таким образом, можно говорить о прерываниях трех типов:
внутренних, внешних и программных. Независимо от источника, действия
процессора по обслуживанию поступившего прерывания всегда
выполняются одинаково, как для аппаратных, так и для программных
прерываний. Эти действия обычно называют процедурой прерывания.

ЛИТЕРАТУРА
1. Финогенов К.Г. Основы языка Ассемблера. – М.: Радио и связь,2000.

2. Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3. Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4. Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.: Питер, 2000.


Республика Молдова
Министерство Образования, Культуры и Исследования
Образцово-показательный Центр в Энергетике и Электронике
Кафедра: Компьютеры
Предмет: Язык ассемблера

РЕФЕРАТ
На тему: “Макроинструкции и процедуры. ”

Выполнила: Уч-ся гр. С-142


Лищенко А.

Проверила: Преподаватель по специальности


Чурарь М.

Кишинев 2018

ВВЕДЕНИЕ
Процедура (подпрограмма) — это основная функциональная единица
декомпозиции (разделения на несколько частей) некоторой задачи.
Процедура представляет собой группу команд для решения конкретной
подзадачи и обладает средствами получения управления из точки вызова
задачи более высокого приоритета и возврата управления в эту точку. В
простейшем случае программа может состоять из одной процедуры.
Процедуру можно определить и как правильным образом оформленную
совокупность команд, которая, будучи однократно описана, при
необходимости может быть вызвана в любом месте программы.

Функция – процедура, способная возвращать некоторое значение.


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

Процедура (подпрограмма) — это основная функциональная единица


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

Функция – процедура, способная возвращать некоторое значение.

Процедуры  ценны тем, что могут быть активизированы в любом месте


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

Для описания последовательности команд в виде процедуры в языке


ассемблера используются две директивы: PROC и ENDP.

Синтаксис описания процедуры:

ИмяПроцедуры PROC язык расстояние
; тело процедуры
ИмяПроцедуры ENDP

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


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

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


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

в начале программы (до первой исполняемой команды);

в конце (после команды, возвращающей управление операционной


системе);

промежуточный вариант — тело процедуры располагается внутри


другой процедуры или основной программы;

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

Объединение процедур, расположенных в разных модулях

Особого внимания заслуживает вопрос размещения процедуры в


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

Для того чтобы объявить о видимых извне объектах, программа должна


использовать две директивы MASM: extern и public.

Директива extern предназначена для объявления некоторого имени


внешним по отношению к данному модулю. Это имя в другом модуле
должно быть объявлено в директиве public. Директива public предназначена
для объявления некоторого имени, определенного в этом модуле и видимого
в других модулях. Синтаксис этих директив следующий:

extern имя:тип, ..., имя:тип

public имя, ..., имя

Здесь имя — идентификатор, определенный в другом модуле. В


качестве идентификатора могут выступать:
имена переменных;

имена процедур;

имена констант.

Тип определяет тип идентификатора. Указание типа необходимо для


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

ЗАКЛЮЧЕНИЕ
Процедура (подпрограмма) — это основная функциональная единица
декомпозиции (разделения на несколько частей) некоторой задачи.
Процедура представляет собой группу команд для решения конкретной
подзадачи и обладает средствами получения управления из точки вызова
задачи более высокого приоритета и возврата управления в эту точку. В
простейшем случае программа может состоять из одной процедуры.
Процедуру можно определить и как правильным образом оформленную
совокупность команд, которая, будучи однократно описана, при
необходимости может быть вызвана в любом месте программы.

Функция – процедура, способная возвращать некоторое значение.


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

ЛИТЕРАТУРА
1. Финогенов К.Г. Основы языка Ассемблера. – М.: Радио и связь,2000.

2. Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3. Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4. Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.: Питер, 2000.


Республика Молдова
Министерство Образования, Культуры и Исследования
Образцово-показательный Центр в Энергетике и Электронике
Кафедра: Компьютеры
Предмет: Язык ассемблера

РЕФЕРАТ
На тему: “Сегментация памяти в ассемблере. ”

Выполнила: Уч-ся гр. С-142


Лищенко А.

Проверила: Преподаватель по специальности


Чурарь М.

Кишинев 2018

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

Каждая программа содержит 3 типа сегментов:

Сегмент  кодов – содержит машинные команды для выполнения.


Обычно первая выполняемая команда находится в начале этого сегмента, и
операционная система передает управление по адресу данного сегмента  для
выполнения программы. Регистр сегмента кодов (CS) адресует данный
сегмент.
Сегмент данных – содержит данные, константы и рабочие  области,
необходимые программе. Регистр сегмента данных (DS) адресует данный
сегмент.

Сегмент стека - содержит адреса возврата как для программы (для


возврата в операционную систему), так и для  вызовов подпрограмм (для
возврата в главную программу), а также используется для передачи
параметров в процедуры. Регистр сегмента стека (SS) адресует данный
сегмент. Адрес текущей вершины стека задается регистрами SS:ESP.

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


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

Каждая программа содержит 3 типа сегментов:

Сегмент  кодов – содержит машинные команды для выполнения.


Обычно первая выполняемая команда находится в начале этого сегмента, и
операционная система передает управление по адресу данного сегмента  для
выполнения программы. Регистр сегмента кодов (CS) адресует данный
сегмент.
Сегмент данных – содержит данные, константы и рабочие  области,
необходимые программе. Регистр сегмента данных (DS) адресует данный
сегмент.

Сегмент стека - содержит адреса возврата как для программы (для


возврата в операционную систему), так и для  вызовов подпрограмм (для
возврата в главную программу), а также используется для передачи
параметров в процедуры. Регистр сегмента стека (SS) адресует данный
сегмент. Адрес текущей вершины стека задается регистрами SS:ESP.

Функциональное назначение сегмента несколько шире, чем простое


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

Упрощенные директивы сегментации

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


упрощенными директивами:

.CODE - для указания начала сегмента кода;

.DATA - для указания начала сегмента данных;

.STACK - для указания начала сегмента стека.

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


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

Стандартные директивы сегментации


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

ИмяСегмента SEGMENT align combine dim 'class'


...
ИмяСегмента ENDS

Директива ENDS определяет конец сегмента.

Атрибут выравнивания сегмента (тип выравнивания) align сообщает


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

BYTE — выравнивание не выполняется. Сегмент может начинаться с


любого адреса памяти;

WORD — сегмент начинается по адресу, кратному двум, то есть


последний (младший) значащий бит физического адреса равен 0
(выравнивание на границу слова);

DWORD — сегмент начинается по адресу, кратному четырем, то есть


два последних (младших) значащих бита равны 0 (выравнивание по границе
двойного слова);

PARA — сегмент начинается по адресу, кратному 16, то есть последняя


шестнадцатеричная цифра адреса должна быть 0h (выравнивание по границе
параграфа);

PAGE — сегмент начинается по адресу, кратному 256, то есть две


последние шестнадцатеричные цифры должны быть 00h (выравнивание по
границе страницы размером 256 байт);
MEMPAGE — сегмент начинается по адресу, кратному 4 Кбайт, то есть
три последние шестнадцатеричные цифры должны быть 000h (адрес
следующей страницы памяти размером 4 Кбайт);

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


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

PRIVATE — сегмент не будет объединяться с другими сегментами с


тем же именем вне данного модуля;

PUBLIC — заставляет компоновщик соединить все сегменты с


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

COMMON — располагает все сегменты с одним и тем же именем по


одному адресу. Все сегменты с данным именем будут перекрываться и
совместно использовать память. Размер полученного в результате сегмента
будет равен размеру самого большого сегмента;

AT xxxx — располагает сегмент по абсолютному адресу параграфа


(параграф — объем памяти, кратный 16, поэтому последняя
шестнадцатеричная цифра адреса параграфа равна 0). Абсолютный адрес
параграфа задается выражением хххx. Компоновщик располагает сегмент по
заданному адресу памяти (это можно использовать, например, для доступа к
видеопамяти или области ПЗУ), учитывая атрибут комбинирования.
Физически это означает, что сегмент при загрузке в память будет
расположен, начиная с этого абсолютного адреса параграфа, но для доступа к
нему в соответствующий сегментный регистр должно быть загружено
заданное в атрибуте значение. Все метки и адреса в определенном таким
образом сегменте отсчитываются относительно заданного абсолютного
адреса;

STACK — определение сегмента стека. Заставляет компоновщик


соединить все одноименные сегменты и вычислять адреса в этих сегментах
относительно регистра SS. Комбинированный тип STACK (стек) аналогичен
комбинированному типу PUBLIC, за исключением того, что
регистр SS является стандартным сегментным регистром для сегментов
стека. Регистр SPустанавливается на конец объединенного сегмента стека.
Если не указано ни одного сегмента стека, компоновщик выдаст
предупреждение, что стековый сегмент не найден. Если сегмент стека создан,
а комбинированный тип STACK не используется, программист должен явно
загрузить в регистр SS адрес сегмента (подобно тому, как это делается для
регистра DS).

Атрибут размера сегмента dim. Для процессоров i80386 и выше


сегменты могут быть 16- или 32-разрядными. Это влияет прежде всего на
размер сегмента и порядок формирования физического адреса внутри него.
Атрибут может принимать следующие значения:

USE16 — это означает, что сегмент допускает 16-разрядную


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

USE32 — сегмент будет 32-разрядным. При формировании


физического адреса может использоваться 32-разрядное смещение. Поэтому
такой сегмент может содержать до 4 Гбайт кода или данных. В модели
памяти FLAT используется по умолчанию именно это значение атрибута
размера сегмента
Атрибут класса сегмента (тип класса) 'class' — это заключенная в
кавычки строка, помогающая компоновщику определить соответствующий
порядок следования сегментов при сборке программы из сегментов
нескольких модулей. Компоновщик объединяет вместе в памяти все
сегменты с одним и тем же именем класса (имя класса, в общем случае,
может быть любым, но лучше, если оно будет отражать функциональное
назначение сегмента). Типичным примером использования имени класса
является объединение в группу всех сегментов кода программы (обычно для
этого используется класс 'code'). С помощью механизма типизации класса
можно группировать также сегменты инициализированных и
неинициализированных данных.

Все сегменты сами по себе равноправны, так как


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

ASSUME CS:FLAT,
DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR

Регистры FS и GS программами не используются, поэтому для них


указывается атрибут ERROR.
ЗАКЛЮЧЕНИЕ
Физически сегмент представляет собой область памяти, занятую
командами и (или) данными, адреса которых вычисляются относительно
значения в соответствующем сегментном регистре.

Каждая программа содержит 3 типа сегментов:

Сегмент  кодов – содержит машинные команды для выполнения.


Обычно первая выполняемая команда находится в начале этого сегмента, и
операционная система передает управление по адресу данного сегмента  для
выполнения программы. Регистр сегмента кодов (CS) адресует данный
сегмент.

Сегмент данных – содержит данные, константы и рабочие  области,


необходимые программе. Регистр сегмента данных (DS) адресует данный
сегмент.

Сегмент стека - содержит адреса возврата как для программы (для


возврата в операционную систему), так и для  вызовов подпрограмм (для
возврата в главную программу), а также используется для передачи
параметров в процедуры. Регистр сегмента стека (SS) адресует данный
сегмент. Адрес текущей вершины стека задается регистрами SS:ESP.
ЛИТЕРАТУРА
1. Финогенов К.Г. Основы языка Ассемблера. – М.: Радио и связь,2000.

2. Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3. Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4. Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.: Питер, 2000.