Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
27.11.2024
Размер:
294.71 Кб
Скачать

АПРОБАЦИЯ

Министерство образования и науки Российской Федерации

Саратовский государственный технический университет

Балаковский институт техники, технологии и управления

АРИФМЕТИЧЕСКИЕ КОМАНДЫ АССЕМБЛЕРА

Методические указания к выполнению лабораторной работы по дисциплине «Архитектура ЭВМ и систем» для студентов очного

обучения специальности 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

Соседние файлы в папке 3к5с Архитектура информационных систем