Цель работы
Целью работы является изучение архитектуры сопроцессоров х86: регистров, системы команд, способов адресации, принципов написания программ. Изучение проводится на примере команд пересылки данных, арифметических, команд адресации и команд сопроцессора х86.
Ход работы:
1. Выбрать индивидуальный вариант задания в соответствии со списком
2. Вычислить значение выражения для заданных наборах значений
3. Перевести все используемые числа в 16-ричную систему с учётом разрядности и способа кодирования (прямой/дополнительный код)
4. Выбрать регистры для хранения входных и выходных значений, написать на языке ассемблера программу
5. Занести программу в отладчик
6. Выполнить программу, поочерёдно подавая на вход тестовые наборы, после каждого запуска убеждаясь, что результат программы совпадает с вычисленным вручную
7. Занести результаты вычислений в отчёт
Задание 1. Арифметические действия с целыми числами.
Написать на языке ассемблера программу, реализующую вычисления в целых числах по заданной формуле: (a-b) /c. Проверить корректность работы программы с помощью отладчика на заданных значениях.
Для хранения чисел a, b, c в 16-ричной системе счисления будут использоваться 32-разрядные регистры eax, ebx, ecx, несмотря на целочисленные значения, применяемые в работе. Использование данных регистров не повлияет на результат, т.к они всего лишь способны хранить более объёмную информацию, чем 16-разрядные регистры. Разрядность входных значений 16 бит. Результат программы будет находиться в регистре edx.
Последовательность выполнения работы:
1. Представим числа в 16-ричной системе счисления:
· 1910 = 1316
· 610 = 616
· 2810 = 1C16
|
2. Производим вычитание a-b, результат будет хранится в регистре eax.
3. Производим деление результата от разности (a-b)/c. При этом целая часть записывается в eax, а остаток – в edx.
4. Текст программы.
8) Mov eax,0;
9) Mov ebx,0
10) Mov ecx,0
11) Mov edx,0
12) Mov eax,0x13
13) Mov ebx,0x6
14) Mov ecx,0x1C
15) Sub eax,ebx
16) Div ecx
17) ret
Результат работы программы на наборах входных данных
№ строки | EAX | EBX | ECX | EDX |
? | ? | ? | ? | |
? | ? | ? | ||
? | ? | |||
? | ||||
Результат 0 – совпадает с вычислениями вручную.
Задание 2. Вычисления с плавающей точкой.
Написать на языке ассемблера программу, реализующую вычисления в числах с плавающей точкой по заданной формуле: (a-b) /c. Проверить корректность работы программы с помощью отладчика на заданных значениях. Ход работы и входные данные совпадают с таковыми для задания 1.
1. Для решения задачи будет использован сопроцессор и значения с плавающей точкой. Данные будут записаны в формате IEEE754.
Приведём значения тестового набора к формату IEEE754. Рассмотрим число 27. Первый бит отводится для обозначения знака числа: число 27 положительное значит первый бит равен 0. Следующие 8 бит (с 2-го по 9-й) отведены под экспоненту. Последние 23 бита под мантиссу. Переведём 27 в двоичную систему счисления – 11011. Сдвинем число на 4 разряда вправо. В результате мы получили основные составляющие экспоненциального нормализованного двоичного числа: мантиссу - 1.1011 и экспоненту – 4. Для определения знака экспоненты, чтобы не вводить ещё один бит знака, добавляют смещение к экспоненте в половину байта +127. Таким образом, наша экспонента = 4 + 127 = 131. Переведем экспоненту в двоичное представление: 131 = 10000011. Оставшиеся 23 бита отводят для мантиссы. У нормализованной двоичной мантиссы первый бит всегда равен 1. Мантисса = 10110000000000000000000.
|
Таким образом, после преобразования по стандарту IEEE754 число 27 будет иметь вид – 01000001110110000000000000000000. Переведём в hex = 0x41D80000.
Для представления в 16-ричной системе разделим число на 8 чисел по 4 цифры:
0100 0001 1010 0000 0000 0000 0000 0000. Тогда получим: 20=41D80000
2. Аналогично проделаем данные действия с числами 20, 2.
Получим: 20 = 41А00000; 2 =40000000
3. Входные значения хранятся в переменных a,b,c, результат в d и e.
4. Текст программы.
8) fld dword [a]
9) fld dword [b]
10) fsub
11) fst dword [d]
12).
13) fld dword [d]
14) fld dword [c]
15) fdiv
16) fst dword [e]
17) ret
18) SECTION.data
19) a dd 0x41D80000
20) b dd 0x41A00000
21) c dd 0x40000000
22) d dd 0h
23) e dd 0h
5. Результат работы программы с входными значениями
Для проверки результатов проведенной работы, были задействованы ячейки памяти.
6. Трассировочная таблица
№ строки | a | b | c | d | e |
? | ? | ||||
- | ? | ||||
- | - | ? | |||
- | - | ? | |||
- | - | ? | |||
14-16 | - | - | - | ||
- | - | - | - | 3,5 |
Результат 3,5 – совпадает с вычислениями вручную.