
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Волгоградский государственный технический университет»
В.С. Поляков
Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
ВОЛГОГРАД 2014
УДК 681.324 (075)
Рецензенты:
заведующий кафедрой «Прикладная математика и вычислительная техника» ВолГАСУ канд. тех. наук, доцент А.В. Игнатьев;
канд. тех. наук, доцент ПЦК Информационных технологий ГБОУ СПО «Волгоградский экономико-технологический колледж» Р.В. Литовкин.
Печатается по разрешению редакционно-издательского совета
Волгоградского государственного технического университета
Поляков, В.С.
Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям / составил В.С. Поляков. – Волгоград: ИУНЛ ВолгГТУ, 2014. – 57 с.
ISBN
В данном руководстве содержатся основные сведения о работе языка низкого уровня Ассемблер. Показаны сильные и слабые стороны машинно ориентированного языка, приведены области его наиболее эффективного применения.
Руководство предназначено для студентов высших учебных заведений технических специальностей, которым необходимы знания в области программирования на машинно-ориентированных языках, алгоритмизации, а также в области архитектуры ЭВМ, сетей и телекоммуникаций..
.
Ил. 2, Таблиц 6, Библиогр. 5 назв.
Волгоградский государственный
технический университет,2014
Поляков В.С.
ВВЕДЕНИЕ
Целью работ является изучение основ работы языка низкого уровня Ассемблер, используя для этого вначале программу-эмулятор, а потом и полноценную оболочку.
Ассемблер – язык низкого уровня. Является по своей шути машинно-ориентированным языком, где каждая бинарная команда процессора для простоты программирования заменена именем (мнемоникой).
Ранее, в методическом указании «Изучение машинно-ориентированного языка Ассемблер для DOS и Windows» были подробно рассмотрены особенности работы ассемблера, его эмулятора и показаны несколько примеров, связанных с методами адресации и командами пересылки данных. Ра рисунках 1 и 2 показаны основной экран эмулятора и его рабочие экраны.
Рис. 1. Вид эмулятора при запуске
Рис. 2. Рабочие экраны эмулятора, показывающие процесс выполнения ассемблерных программ
Поскольку в предыдущей методичке были разобраны регистры, флаги, методы адресации и частично команды пересылки данных, то начнем теоретический обзор с арифметических, логических и сдвиговых команд, после них перейдя к другим разделам..
1. Арифметические команды
При рассмотрении арифметических команд следует отметить, что, исключая умножение и деление, все они при выполнении способны изменять флаги переполнения (OF), знака (SF), нуля (ZF), четности (PF), основного и дополнительного переноса (AF, CF).
Начнем с команды сложения ADD. Она предназначена для сложения операндов и записывается следующим образом
ADD операнд1, операнд2
Здесь мы к первому операнду прибавляем второй, а результат записывается в первый. В дальнейшем будем называть операнд, из которого берутся данные, источником, а тот, в которые данные поступают – приемником. Тогда формат команды ADD можно представить в виде:
ADD приемник, источник
Логика тут следующая: приемник=приемник+источник.
Необходимо знать, что источник может быть числом, регистром или переменной, в то время как приемник – лишь регистром (исключая сегментный регистр кода CS) или переменной. Это естественно, так как невозможно записать в собственно число иную информацию.
Вместе с тем недопустимо, чтобы и приемник и источник были переменными одновременно. К примеру, правильные записи:
ADD AX, 4;
ADD BX, DL
ADD CX, perem1
ADD perem2, AX
Недопустимыми записями являются следующие:
ADD 5, AX
ADD perem1, perem2
Напоминаем, что арифметические команды как правило сами по себе не различают числа со знаком и без, для этого используются соответствующие флаги.
Разобрав простейшую команду сложения, перейдем к ее разновидностям. Также отметим, что вышеуказанные правила и форматы команд будут идентичны. Если же возникнут отличия, об этом будет упомянуто отдельно.
Сложение с переносом ADC во многом аналогично ADD, выполняя сложение приемника, источника и флага переноса CF.
Логика: приемник=приемник+источник+CF.
В качестве примере приведем следующее:
ADC AX, CX
Пусть AX=5, CX=3. Тогда AX=AX+CX+CF=5+3+0=8 в случае CF=0 или AX=AX+CX+CF=5+3+1=9 в случае CF=1.
Инкрементация INC. По сути инкрементация – прибавление к единственному операнду (приемнику) данной команды единицы. Требует меньше машинного времени на выполнение, более эффективен, чем классическое сложение с единицей.
Логика: приемник = приемник +1
Пример:
INC AX
Также упомянем довольно экзотическую команду XADD, которая выполняет сложение, помещает содержимое приемника в источник, – сумму операндов – в приемник. Источник всегда регистр, приемник может быть регистром и переменной.
Перейдем к командам вычитания, начиная с простейшей SUB, которая вычитает источник из приемника, записывая результат обратно в приемник. Приемник может быть регистром или переменной, источник может быть числом, регистром или переменной, но нельзя использовать переменную одновременно и для источника, и для приемника.
Логика: приемник = приемник -источник
Пример:
SUB AX, CX
Команда вычитания с заемом SBB во многом аналогична ADC по причине использования флага переноса CF. Разница лишь в том, что он используется для вычитания, а не для сложения.
Логика: приемник=приемник-источник-CF.
В качестве примере приведем следующее:
SBB AX, CX
Пусть AX=5, CX=3. Тогда AX=AX-CX-CF=5-3-0=2 в случае CF=0 или AX=AX-CX-CF=5-3-1=1 в случае CF=1.
Декрементация DEC. По сути декрементация – вычитание из единственного операнда (приемнику) данной команды единицы. Требует меньше машинного времени на выполнение, более эффективно, чем классическое вычитание единицы из приемника.
Логика: приемник = приемник-1
Пример:
DEC AX
От простейших арифметических действий переходим к более сложным, а именно к вычитанию и делению. Отметим, что два этих действия могут выполняться с учетом знака или без него, для чего ассемблер использует разные команды.
Умножение без учета знака реализовано при помощи команды MUL, использующей единственный операнд источник (множитель), являющийся регистром или переменной. Если, к примеру, мы встречаем в тексте программы строку
MUL BX
Логика имеет следующий вид:
- AX=AL*множитель, если операнд множитель является байтом;
- DX:AX= AХ*множитель, если операнд множитель является словом.
Если же используем расширенные регистры, к примеру
MUL ЕBX
Логика имеет следующий вид: EDX:EAX=EAХ*множитель.
В случае, если при умножении необходимо учитывать знак, используем команду IMUL. Она выделяется среди прочих тем, что имеет три варианта использования операндов, а именно:
IMUL источник
IMUL приемник, источник
IMUL приемник, источник1, источник2
По сути принцип действия мало чем отличается от команды MUL. Первый вариант и вовсе ей идентичен, за исключением учета знака.
При втором способе источник (число, регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.
При третьем - источник 1 (регистр или переменная) умножается на источник 2 (число), и результат заносится в приемник (регистр).
Для выполнения операции деления ассемблер использует команды IDIV(целочисленное деление с учетом знака) и DIV (без учета знака). Данные команды имеют более сложную логику, поскольку, в отличе от умножения, необходимо не только вычислить результат, но и учитывать остаток. Это происходит следующим образом. Формат команды IDIV имеет вид:
IDIV источник; причем источник здесь является делителем.
Логика имеет следующий вид:
- AL=AX/делитель, а в AH помещается остаток, если операнд множитель является байтом;
- AХ=DX:AX/делитель, а в DX помещается остаток, если операнд множитель является словом;
Если же используем расширенные регистры, к примеру
IDIV ЕBX
Логика имеет следующий вид: EAX=EDX:EAХ/делитель, а остаток в EDX.
Отметим, что результат всегда округляется в сторону нуля, знак остатка всегда совпадает со знаком делимого, абсолютное значение остатка всегда меньше абсолютного значения делителя.
Механизм работы команды DIV аналогичен команде IDIV.
Закончив с четырьмя основными арифметическими действиями и их вариациями, перейдем к более специфическим командам. И начнем с команды изменения знака NEG. Имеет формат
NEG приемник
Логика: приемник=0-приемник
К примеру, если у нас AX=5, то строка
NEG AX
даст AX=0-AX=0-5=-5. В случае же отрицательного числа двойной минус дает плюс, что известно еще с начальной школы.
Команды CBW и CWD относятся к командам преобразования. Первая из них конвертирует байт в слово, а вторая – слово в двойное слово. CBW расширяет бит знака младшей части аккумулятора (AL) в старшую часть (AH). Ну а CWD – бит знака аккумулятора AX на регистр данных DX. При этом флаги меняться не будут.