Задание 1. Выполнение арифметических действий с целыми числами.
Вычислить значение выражения a+b/c.
1. Для хранения чисел a, b, c в 16-ричной системе счисления используем регистры cl, al, bl соответственно, разрядность входных значение 8 бит.
2. Результат программы будет храниться в регистре.
3. Последовательность выполнения работы:
1) Представим числа в 16-ричной системе счисления:
· 510 = 516
· 610 = 616
· 2810 = 1C16
2) Произведем деление b/c, при этом целая часть записывается в al, а остаток от деления в ah
3) Складываем значение из регистра Cl и Al
4. Текст программы:
1) Mov eax,0; обнуляем все регистры
2) Mov ebx,0
3) Mov ecx,0
4) Mov edx,0
5) Mov al,06h; вносим все нужные значения
6) Mov bl,01Ch
7) Mov cl,5h
8) Div bl; делим число из регистра al на число из bl. В al целая часть, в ah остаток
9) add cl,al; складываем число cl с целой частью от деления
5. Результат работы программы на прописном наборе входных данных
№ строки | Al | Ah | Bl | Cl |
1-4 | ||||
5-7 | ||||
Результат 5 – совпадает с вычислениями вручную.
Часть 2. Вычисления с плавающей точкой.
Вычислить значение выражения a + b / c.
Выполнение:
1) Значения 2,31,26 будут храниться в 16-ричной системе счисления, разрядность входных значений 16. Для решения задачи необходим ввод значений с плавающей точкой, которые будут записаны в формате IEEE 754.
Приведём значения тестового набора к формату IEEE754. Рассмотрим число 2 (для других чисел алгоритм аналогичный). Для этого переведем число в двоичное представление: 210 = 102. Сдвинем число на 1 разряд вправо. В результате мы получили основные составляющие экспоненциального нормализованного двоичного числа: Мантисса М=1.00. Экспонента exp2 = 1. Первый бит отводится для обозначения знака числа. Поскольку число положительное, то первый бит равен 0
Следующие 8 бит (с 2-го по 9-й) отведены под экспоненту.
Для определения знака экспоненты, чтобы не вводить ещё один бит знака, добавляют смещение к экспоненте в половину байта +127. Таким образом, наша экспонента: 1 + 127 = 128
Переведем экспоненту в двоичное представление.
128 = 100000002
Оставшиеся 23 бита отводят для мантиссы. У нормализованной двоичной мантиссы первый бит всегда равен 1, так как число лежит в диапазоне 1 ≤ M < 2. Для экономии, единицу не записывают, а записывают только остаток от мантиссы: 00000000000000000000000
В результате число 2 представленное в IEEE 754 c одинарной точностью равно 01000000000000000000000000000000.
Переведем в шестнадцатеричное представление.
Получаем число:
0100 0000 0000 0000 0000 0000 0000 0000 2 = 4000000016
|
2) Аналогично проделаем данные действия с числами 31, 26.
Получим: 31 - 41F8000016 ; 26 – 41D0000016
3) Входные значения хранятся в переменных a,b,c, результат в х.
4) Текст программы.
1) fld dword [a]; берем переменные из стека
2) fld dword [b]
3) fld dword [c]
4) fdiv
5) fadd
6) fst dword [x]; вносим результат вычислений в переменную х
7) ret
8) section.data
9) a dd 40000000h
10) b dd 41F80000h
11) c dd 41D00000h
12) x dd 0
5) Результат работы программы с входными значениями
№ строки | a | b | c | x |
1-3 | ||||
3.1923076923076 |
Результат 3.1923076923076– совпадает с вычислениями вручную.
Часть 3. Условные переходы
Вычислить наибольшее расстояние между тремя точками a, b и c на числовой оси.
Выполнение:
1. Вводим значение точек a, b и c в 3 регистра ah, al, bh. Результат будет находиться в dh.
|
2. Поочередно сравниваем каждый регистр и наибольший из двух копируем в ch.
3. Поочередно сравниваем каждый регистр и наименьший из двух копируем в cl.
4. Далее находим разницу между наибольшим и наименьшим, копируем в dh.
5. Блок-схема(см. следующую страницу)
1. Трассировочная таблица для 1 набора входных данных
№ строки | ah | al | bh | ch | cl | dh |
1-4 | ||||||
5-11 | ||||||
13-12 | ||||||
24-27 | ||||||
Результат 1 – совпадает с вычислениями вручную для 1 набора входных данных. Для второго набора результат 9 тоже совпадает.
Результат работы.
Результатом данной работы является изучение команд языка Ассемблер и архитектуры сопроцессора x86, 3 написанные программы: целочисленные вычисления, вычисления с плавающей точкой и условные переходы.