
3к5с Архитектура информационных систем / МУ ПР 4
.pdfАПРОБАЦИЯ
Министерство образования и науки Российской Федерации
Саратовский государственный технический университет
Балаковский институт техники, технологии и управления
АРИФМЕТИЧЕСКИЕ КОМАНДЫ АССЕМБЛЕРА
Методические указания к выполнению лабораторной работы по дисциплине «Архитектура ЭВМ и систем» для студентов очного
обучения специальности 230201 и направления 230400.
Одобрено
редакционно-издательским советом
Балаковского института техники,
технологии и управления
Балаково 2011
Цель работы — изучение операций сложения, вычитания, умноже-
ния и деления чисел в различных системах счисления на языке Ассемблер.
ОСНОВНЫЕ ПОНЯТИЯ
Целочисленное вычислительное устройство поддерживает чуть больше десятка арифметических команд. Группа арифметических цело-
численных команд работает с двумя типами чисел:
целыми двоичными числами, которые могут иметь или не иметь знаковый разряд, то есть быть числами со знаком или без знака;
целыми десятичными числами.
Целое двоичное число — это число, закодированное в двоичной си-
стеме счисления. В архитектуре IA-32 размерность целого двоичного чис-
ла может составлять 8, 16 или 32 бита. Знак двоичного числа определяется тем, как интерпретируется старший бит в представлении числа. Среди арифметических команд есть всего две, которые действительно учитывают этот старший разряд как знаковый, — это команды целочисленного умно-
жения IMUL и деления IDIV. В остальных случаях ответственность за действия со знаковыми числами и, соответственно, со знаковым разрядом ложится на программиста.
Десятичные числа — специальный вид представления числовой ин-
формации, в основу которого положен принцип кодирования каждой деся-
тичной цифры числа группой из четырех битов. При этом каждый байт числа содержит одну или две десятичные цифры в так называемом двоич-
но-десятичном коде (Binary-Coded Decimal, BCD). Процессор хранит BCD-
числа в двух форматах.
В упакованном формате каждый байт содержит две десятичные циф-
ры. Десятичная цифра представляет собой двоичное значение в диапазоне от 0 до 9 размером четыре бита. При этом код старшей цифры числа зани-
мает старшие четыре бита. Следовательно, диапазон представления деся-
тичного упакованного числа в одном байте составляет от 00 до 99.
2
В неупакованном формате каждый байт содержит одну десятичную цифру в четырех младших битах. Старшие четыре бита имеют нулевое значение. Это так называемая зона. Следовательно, диапазон представле-
ния десятичного неупакованного числа в одном байте составляет от 0 до 9.
Процессор выполняет сложение операндов по правилам сложения двоичных чисел. Проблем не возникает до тех пор, пока значение резуль-
тата не превышает размерности поля операнда. Например, при сложении операндов размером в байт результат не должен превышать 255. Если это происходит, то результат оказывается неверен. К примеру, выполним сло-
жение: 254 + 5 = 259 в двоичном виде: 11111110 + 0000101 = 100000011.
Результат вышел за пределы восьми битов, и правильное его значе-
ние укладывается в 9 битов, а в 8-разрядном поле операнда осталось зна-
чение 3, что неверно. В процессоре подобный исход сложения прогнозиру-
ется, и предусмотрены специальные средства для фиксации подобных си-
туаций и их обработки. Так, для фиксации ситуации выхода за разрядную сетку результата, как в данном случае, предназначен флаг переноса CF. Он располагается в бите 0 регистра флагов EFLAGS/FLAGS. Именно уста-
новкой этого флага фиксируется факт переноса единицы из старшего раз-
ряда операнда.
В системе команд процессора имеются три команды двоичного сло-
жения:
команда инкремента, то есть увеличения значения операнда на 1: inc операнд
команда сложения (операнд_1 = операнд_1 + операнд_2): add операнд_1, операнд_2
команда сложения с учетом флага переноса CF (операнд_1 = опе-
ранд_1 + операнд_2 + значение_СР): adc операнд_1,операнд_2
3
Команда ADC является средством процессора для сложения длин-
ных двоичных чисел, размерность которых превосходит поддерживаемые процессором размеры стандартных полей.
Аналогично командам сложения группа команд вычитания состоит из минимально возможного набора:
Команда декремента выполняет уменьшения значения операнда на 1:
dec операнд
Команда вычитания (операнд_1 = операнд_1 - операнд_2): sub операнд_1,операнд_2
Команда вычитания с учетом заема, то есть флага CF (операнд_1 = операнд_1 - операнд_2 - значение_СР):
sbb операнд_1,операнд_2
Для умножения чисел без знака предназначена команда mul сомножитель_1
В команде указан всего лишь один операнд-сомножитель. Второй операнд-сомножитель задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Так как в общем случае результат умножения больше, чем любой из его сомножителей, то его размер и ме-
стоположение должны быть тоже определены однозначно. Варианты раз-
меров сомножителей и мест размещения второго операнда и результата приведены в табл. 1.
Таблица 1. Расположение операндов и результата при умножении
Первый |
Второй |
|
Результат |
|
сомножитель |
сомножитель |
|
||
|
|
|||
|
|
|
|
|
Байт |
AL |
16 |
битов в АХ: AL — младшая часть результата; АН |
|
— старшая часть результата |
||||
|
|
|||
|
|
|
|
|
Слово |
АХ |
32 |
бита в паре DX:AX: AX — младшая часть резуль- |
|
тата; DX — старшая часть результата |
||||
|
|
|||
|
|
|
|
|
Двойное слово |
ЕАХ |
64 |
бита в паре EDX:EAX: ЕАХ — младшая часть ре- |
|
|
|
|
|
|
|
|
|
4 |

зультата; EDX — старшая часть результата
Из таблицы видно, что произведение состоит из двух частей и в за-
висимости от размера операндов размещается в двух местах — на месте второго сомножителя (младшая часть) и в дополнительных регистрах АН,
DX, EDX (старшая часть).
Для умножения чисел со знаком предназначена команда imul операнд_1[,операнд_2,операнд_3]
Эта команда выполняется так же, как и команда MUL. Отличитель-
ной особенностью команды IMUL является только формирование знака.
Если результат мал и умещается в одном регистре (то есть если CF= OF=
0), то содержимое другого регистра (старшей части) является расширением знака — все его биты равны старшему биту (знаковому разряду) младшей части результата. В противном случае (если CF = OF = 1) знаком результа-
та является знаковый бит старшей части результата, а знаковый бит млад-
шей части является значащим битом двоичного кода результата.
Для деления чисел без знака предназначена команда div делитель
Делитель может находиться в памяти или в регистре и иметь размер
8, 16 или 32 бита. Местонахождение делимого фиксировано и так же, как в команде умножения, зависит от размера операндов. Результатом команды деления являются значения частного и остатка. Варианты местоположения и размеров операндов операции деления показаны в табл. 2.
Таблица 2. Расположение операндов и результата при делении
Делимое |
Делитель |
Частное |
Остаток |
|
|
|
|
|
|
Слово (16 бит) в реги- |
Байт в регистре или |
Байт в регистре AL |
Байт в регистре АН |
|
стре АХ |
в ячейке памяти |
|||
|
|
|||
|
|
|
|
|
Двойное слово (32 |
Слово (16 бит) в |
Слово (16 бит) в |
Слово (16 бит) в |
|
бита), в DX — стар- |
регистре или в |
|||
регистре АХ |
регистре DX |
|||
шая часть, в АХ — |
ячейке памяти |
|||
|
|
|||
|
|
|
|
|
|
5 |
|
|
младшая часть |
|
|
|
|
|
|
|
|
|
Учетверенное слово |
Двойное слово (32 |
Двойное слово (32 |
Двойное слово (32 |
|
(64 бит), в EDX — |
бита) в регистре |
|||
бита) в регистре |
бита) в регистре |
|||
старшая часть, в ЕАХ |
или в ячейке памя- |
|||
ЕАХ |
EDX |
|||
— младшая часть |
ти |
|||
|
|
|||
|
|
|
|
После выполнения команды деления содержимое флагов неопреде-
ленно, но возможно возникновение прерывания с номером 0, называемого
«деление на ноль». Этот вид прерывания относится к так называемым ис-
ключениям и возникает внутри процессора из-за некоторых аномалий в вычислительном процессе.
Прерывание 0 (деление на ноль) при выполнении команды DIV мо-
жет возникнуть по одной из следующих причин:
делитель равен нулю;
частное не входит в отведенную под него разрядную сетку.
Для деления чисел со знаком предназначена команда idiv делитель
Для этой команды справедливы все рассмотренные ранее рассужде-
ния, касающиеся команд и чисел со знаком. Отметим лишь особенности возникновения исключения 0 (деление на ноль) в случае чисел со знаком.
ТЕХНОЛОГИЯ РАБОТЫ
ЗАДАНИЕ 1. ОПЕРАЦИИ СЛОЖЕНИЯ И ВЫЧИТАНИЯ ДВОИЧНЫХ ЧИСЕЛ.
1.Перевести заданные двоичные числа в десятичные.
2.Сложить и вычесть десятичные числа.
3.Реализовать операции сложения и вычитания двоичных чисел с помошью языка Assembler, результат вывести в десятичном виде.
4.Выполнить проверку.
6
5. Сравнить полученные результаты.
Пример программы на языке Assembler (сложение двоичных чисел): #include "stdafx.h"
#include "conio.h" int main () {
int c; _asm {
mov eax, 1010b mov edx, 111b add eax, edx mov c, eax
}
printf("%i\n",c);
getchar();
}
ЗАДАНИЕ 2. ОПЕРАЦИИ СЛОЖЕНИЯ И ВЫЧИТАНИЯ
ВОСЬМЕРИЧНЫХ ЧИСЕЛ.
1.Перевести заданные восьмеричные числа в десятичные.
2.Сложить и вычесть десятичные числа.
3.Реализовать операции сложения и вычитания восьмеричных чисел
спомощью языка Assembler, результат вывести в десятичном виде.
4.Выполнить проверку.
5.Сравнить полученные результаты.
Пример программы на языке Assembler (вычитание восьмеричных
чисел):
#include "stdafx.h"
#include "conio.h"
int main () {
7
int c; _asm {
mov eax, 174o mov edx, 36o sub eax, edx mov c, eax
}
printf("%i\n",c);
getchar();
}
ЗАДАНИЕ 3. ОПЕРАЦИИ СЛОЖЕНИЯ И ВЫЧИТАНИЯ
ШЕСТНАДЦАТЕРИЧНЫХ ЧИСЕЛ.
1.Перевести заданные шестнадцатеричные числа в десятичные;
2.Сложить и вычесть десятичные числа;
3.Реализовать операции сложения и вычитания шестнадцатеричных чисел с помощью языка Assembler, результат вывести в десятичном виде;
4.Выполнить проверку.
5.Сравнить полученные результаты.
Пример программы на языке Assembler (вычитание шестнадцатерич-
ных чисел):
#include "stdafx.h" #include "conio.h" int main () {
int c; _asm {
mov eax, 0C8h mov edx, 0A5h
8

sub eax, edx mov c, eax
}
printf("%i\n",c);
getchar();
}
Вариант |
Задание 1 |
Задание 2 |
Задание 3 |
||||
|
|
|
|
|
|
||
Число 1 |
Число 2 |
Число 1 |
Число 2 |
Число 1 |
Число 2 |
||
|
|||||||
|
|
|
|
|
|
|
|
1 |
111000111 |
1111111 |
1025 |
500 |
6E7 |
373 |
|
|
|
|
|
|
|
|
|
2 |
111000110 |
1111110 |
1022 |
474 |
6E2 |
36D |
|
|
|
|
|
|
|
|
|
3 |
111000101 |
1111101 |
1017 |
470 |
6DD |
367 |
|
|
|
|
|
|
|
|
|
4 |
111000100 |
1111100 |
1014 |
464 |
6D8 |
361 |
|
|
|
|
|
|
|
|
|
5 |
111000011 |
1111011 |
1011 |
460 |
6D3 |
35B |
|
|
|
|
|
|
|
|
|
6 |
111000010 |
1111010 |
1006 |
454 |
6CE |
355 |
|
|
|
|
|
|
|
|
|
7 |
111000001 |
1111001 |
1003 |
450 |
6C9 |
34F |
|
|
|
|
|
|
|
|
|
8 |
111000000 |
1111000 |
1000 |
444 |
6C4 |
349 |
|
|
|
|
|
|
|
|
|
9 |
110111111 |
1110111 |
775 |
440 |
6BF |
343 |
|
|
|
|
|
|
|
|
|
10 |
110111110 |
1110110 |
772 |
434 |
6BA |
33D |
|
|
|
|
|
|
|
|
|
11 |
110111101 |
1110101 |
767 |
430 |
6B5 |
337 |
|
|
|
|
|
|
|
|
|
12 |
110111100 |
1110100 |
764 |
424 |
6B0 |
331 |
|
|
|
|
|
|
|
|
|
13 |
110111011 |
1110011 |
761 |
420 |
6AB |
32B |
|
|
|
|
|
|
|
|
|
14 |
110111010 |
1110010 |
756 |
414 |
6A6 |
325 |
|
|
|
|
|
|
|
|
|
15 |
110111001 |
1110001 |
753 |
410 |
6A1 |
31F |
|
|
|
|
|
|
|
|
|
16 |
110111000 |
1110000 |
750 |
404 |
69C |
319 |
|
|
|
|
|
|
|
|
|
17 |
110110111 |
1101111 |
745 |
400 |
697 |
313 |
|
|
|
|
|
|
|
|
|
18 |
110110110 |
1101110 |
742 |
374 |
692 |
30D |
|
|
|
|
|
|
|
|
|
19 |
110110101 |
1101101 |
737 |
370 |
68D |
307 |
|
|
|
|
|
|
|
|
|
20 |
110110100 |
1101100 |
734 |
364 |
688 |
301 |
|
|
|
|
|
|
|
|
ТРЕБОВАНИЯ БЕЗОПАСНОСТИ ТРУДА
При выполнении лабораторной работы необходимо соблюдать об-
щие правила техники безопасности:
9
использовать ПК только в соответствии с их назначением;
не размещать на корпусе ПК посторонние предметы (тетради,
книги, карандаши и т.п.);
оберегать ПК от толчков, ударов, сотрясений;
немедленно поставить в известность оператора ИВЦ об обна-
ружении задымления, загорания, пожара;
немедленно сообщить оператору ИВЦ обо всех неисправно-
стях в работе ПК.
СОДЕРЖАНИЕ ОТЧЕТА
Отчѐт по лабораторной работе выполняется на листах формата А4,
который должен содержать: цель работы и выполненные задания по лабо-
раторной работе, пример выполнения программы, вывод.
10