Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр12.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
31.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 12

ИЗУЧЕНИЕ И ИСПОЛЬЗОВАНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ (ЧАСТЬ 1)

Цель работы:

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

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

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

План занятия

  1. Изучите теоретический материал.

  1. Выполните практическую часть лабораторной работы.

  2. Запишите ответы на контрольные вопросы.

  3. Оформите отчёт по лабораторной работе.

  4. Предъявить работающие программы и отчёт преподавателю для защиты.

Приборы и оборудование

  1. ПЭВМ

  1. ОС MS-DOS

  2. Программный пакет TASM

Инструкция по ТБ

При работе с ПЭВМ следует соблюдать правила эксплуатации электроустановок до 1000В.

Шнуры, вилки, розетки, корпуса блоков ПЭВМ должны быть без повреждений.

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

Краткие теоретические сведения

Сложение целых чисел

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

inc операнд – операция инкремента, то есть увеличение значения операнда на 1;

add операнд1,операнд2 – команда сложения с принципом действия: операнд1=операнд1+операнд2;

adc операнд1,операнд2 команда сложения с учетом флага переноса cf с принципом действия: операнд1 = операнд1 + операнд2 + cf.

Специальных команд сложения десятичных чисел нет. Объясняется это тем, что микропроцессор все операнды интерпретирует как двоичные числа и складывает их по правилам сложения двоичных чисел. Операндами могут быть как 8-ми битовые, так и 16-ти битовые двоичные числа. Если результат операции не помещается в приемник, микропроцессор фиксирует ситуацию переполнения, устанавливая в 1 флаг переноса. Действия программы в этой ситуации могут быть следующими:

  • прекратить выполнение программы по переполнению разрядной сетки;

  • увеличить разрядность операндов.

Рассмотрим второй вариант. Положим, складываются 8-миразрядные операнды из al и bl

add al, bl ;результат можем превысить диапазон ;представления 8-ми разрядных чисел

jnc m1 ;проверяем наличие переноса и при отсутствии переход на м1

adc ah,0 ;расширяем разрядную сетку, добавив в результат ah, теперь расширенный результат сложения помещается в 16-битовом ax

m1: …

В этом фрагменте программы можно было опустить команду условного переноса и сразу после add выполнить команду adc, однако следует учесть, что после метки м1 результат нужно выбирать из регистра ах.

Аналогично можно складывать числа большей, чем 16 бит разрядности. Так, для сложения 32-битовых операндов (двойное слово) одно слагаемое можно поместить в регистры ax и bx, а второе - в dx и cx:

slag1 dd 4bf8ff31h

slag2 dd a5244986h

mov ax, slag1 ;младшая часть

mov bx, slag1+2 ;старшая часть

mov cx, slag2

mov dx, slag2+2

add ax, cx

adc bx, dx

Команды add и adc могут воздействовать на 6 флагов:

  • флаг переноса cf – устанавливается в 1, если результат сложения не помещается в операнде-приемнике, и противном случае cf=0;

  • флаг четности pf=1, если результат имеет четное число битов со значением 1, и противном случае pf=0;

  • вспомогательный флаг переноса af=1, если результат сложения десятичных чисел требует коррекции, в противном случае он равен 0;

  • флаг нуля zf=1, если результат сложения равен 0;

  • флаг знака sf=1, если сумма отрицательна (старший бит числа со знаком равен 1), в противном случае sf=0;

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

Сложение десятичных чисел

Рассмотрим такой пример: сложим числа 26 и 55 в упакованном виде:

0010 0110

0101 0101

0111 1011

Полученный результат 7B не является десятичным упакованным числом. Поэтому результат должен быть скорректирован для представления в десятичном виде. Для этих в ассемблере есть две операции корректировки результата сложения:

ааа – корректировка результата для представления в кодах ASCII;

daa – корректировка результата для представления в упакованном десятичном формате.

Обе команды не имеют операндов и по умолчанию корректируют значение из регистра al.

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

add al, bl ;сложить неупакованные цифры, находящиеся в регистрах al и bl

aaa ;и преобразовать результат в правильное десятичное число.

Если результат операции превышает 9, то команда ааа добавляет 1 к содержимому регистра ah и устанавливает в 1 флаг cf, в противном случае флаг устанавливается в 0. Поскольку для дальнейшего анализа имеет значение только состояние флага cf, остальные флаги нужно считать неопределенными (иначе говоря, их значения после команды ааа нельзя использовать для анализа – команд условного перехода).

Команда daa преобразует содержимое регистра al в две правильные упакованные десятичные цифры. Она используется в следующем контексте:

add al, bl ; сложить упакованные bcd-числа в регистрах al и bl

daa ;и преобразовать результат в упакованное число

Если результат превышает предельное значение для упакованных BCD-чисел, то daa добавляет 1 к содержимому регистра ah и устанавливает в 1 флаг cf, в противном случае флаг устанавливается в 0. Замечание относительно остальных флагов для команды daa такие же, как и для команды ааа.

Вычитание целых чисел

Микропроцессор не имеет устройства вычитания, а имеет только устройство сложения (сумматор). Вычитание на таком устройстве осуществляется в 2 этапа:

  1. меняется знак у вычитаемого - 2-го операнда или источника (иначе говоря, вычитаемое обращается);

  2. складываются уменьшаемое и обращенное вычитаемое.

Для обращения операнда в системе команд имеется самостоятельная команда:

neg приемник.

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

Команды вычитания sub и sbb аналогичны соответствующим командам сложения, только при вычитании флаг cf понимается как признак заема.

К командам вычитания относятся следующие:

dec операнд – операция декремента, то есть уменьшения операнда на 1;

sub операнд1,операнд2 – команда вычитания с принципом действия: операнд1=операнд1–операнд2;

sbb операнд1,операнд2 – команда вычитания с принципом действия: операнд1=операнд1–операнд2– сf.

Как и в случае сложения, команда sub вычитает числа размером в байт или слово, а также младшие байты чисел повышенной точности. Совокупность команд sub и sbb позволяет вычитать операнды повышенной точности (двойное слово), например:

per1 dd 4bf8ff31h

per2 dd a5244986h

mov ax, per1 ;младшая часть

mov bx, per1+2 ;старшая часть

mov cx, per2

mov dx, per2+2

sub ax, cx

sbb bx, dx

Здесь 32-битовое число из регистров cx и dx вычитается из 32-битового числа, помещенного в регистры ax и bx. Ограничение при вычитании – нельзя вычесть значение регистра или ячейки памяти из константы, поскольку, например, команда sub 100, al недопустима. Однако, если заменить недопустимую операцию 2-мя следующими

neg al

add al, 100

то вычитание из непосредственного значения будет выполнено и результат получен в al.