Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВС сети и телекомм-практикум.doc
Скачиваний:
45
Добавлен:
01.07.2025
Размер:
613.89 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

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

«Волгоградский государственный технический университет»

В.С. Поляков

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

ВОЛГОГРАД 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. При этом флаги меняться не будут.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]