- •Федеральное агентство связи
- •Регистры общего назначения.
- •Сегментные регистры.
- •Регистры состояния и управления.
- •Формат команд.
- •Создание программы на ассемблере.
- •Отладчик Turbo Debugger.
- •Структура программы на ассемблере.
- •Методические указания по выполнению лабораторных работ.
- •Лабораторная работа №1 Изучение пакета tasm и организация ввода данных с клавиатуры.
- •Лабораторная работа №2 Система адресования и последовательность выполнения основных команд пересылки.
- •Лабораторная работа №3 Программирование арифметических операций.
- •Лабораторная работа №4 Программирование логических операций
- •Лабораторная работа №5 Запись и выполнение программ пересылки данных между информационными массивами.
- •Лабораторная работа №6 Программирование ветвящихся вычислительных процессов.
- •Лабораторная работа №7 Программирование итеративных циклических вычислительных процессов.
- •Лабораторная работа №8 Программирование и контроль регулярных циклических вычислительных процессов.
- •Лабораторная работа №9 Программа и стек.
- •Лабораторная работа № 10 Программирование вычислительных процессов с использованием стандартных подпрограмм.
Лабораторная работа №3 Программирование арифметических операций.
Цель работы.
Изучение арифметических команд микропроцессора семейства Intel х86 и выполнение программ арифметических операций.
Задание.
Предварительная часть.
Изучить содержание, форму записи и последовательность выполнения целочисленных арифметических команд микропроцессора семейства Intel х86, в т.ч. INC, DEC, ADD, ADC, SUB, SBB, NEG пo [1,2].
Ознакомиться со структурой и функциями регистра флагов в микропроцессоре семейства Intel х86 по [1].
Разработать детальную схему алгоритма сложения двух чисел X и Y размером в двойное слово, используя команды ADD и ADC. Предполагается, что сумма не превышает 232-1 = 4294967295, т.е. также составляет двойное слово. Числа X и Y для каждой бригады приведены в таблице 3.
Разработать детальную схему алгоритма получения разности X-Y используя команды SUB и SBB.
Таблица 3
Номер бригады |
X |
Y |
K |
1 |
21AF03B516 |
21AEFE6616 |
22010 |
2 |
111FABC816 |
111F984016 |
15010 |
3 |
3CC5763116 |
3CC49B3216 |
38010 |
4 |
12586B3816 |
1258694416 |
9010 |
5 |
24811D6716 |
248119A516 |
27110 |
6 |
3361DF1916 |
3361DA3916 |
8610 |
7 |
1F7C8AA316 |
1F7C892616 |
11010 |
8 |
178118DA16 |
17810ED116 |
27010 |
9 |
3C8A6F1116 |
3C8A674416 |
1110 |
10 |
22ADCF9616 |
22ADC24E16 |
30910 |
Экспериментальная часть.
Написать программу на языке ассемблер в текстовом редакторе «Блокнот» реализующую следующие подпункты:
Исследование команд INC и DEC. Для этого в регистр DL записать число F16. Посредством команды INC увеличить значение DL на 1, затем уменьшить на 1 с помощью команды DEC. Фиксировать значения всех используемых в программе регистров на каждом шаге выполнения программы. Фиксировать значения флагов AF и PF.
Исследовать команду ADD. Используя регистры АХ и DX сложить два числа 463210 и 283910. Сложить числа 1276110 и -1554810. Сложить числа – 1238910 и -2018010. Фиксировать значения всех используемых в программе регистров на каждом шаге выполнения программы, также фиксировать значения флагов CF, AF, PF, SF.
Исследовать команду ADC. Сложить два числа размером в двойное слово. Для этого взять числа X и Y в таблице 3 согласно номеру бригады. Условно разбиваем (переопределяем тип) каждое число на два слова с помощью оператора PTR. Сначала складываем младшие (правые) части исходных чисел используя команду ADD. Старшие части чисел нужно складывать по команде ADC. Использовать регистры АХ, BX, DX, СХ. Фиксировать значения всех используемых в программе регистров на каждом шаге выполнения программы, также фиксировать значения флагов CF, PF.
Исследовать команду SUB. Вычесть из числа -1554810 число -2018010. Из полученного числа вычесть число 463210. Число -1554810 записать в регистр АХ, остальные числа использовать как непосредственные операнды. Фиксировать значения всех используемых в программе регистров на каждом шаге выполнения программы, также фиксировать значения флагов AF, PF, ZF.
Исследовать команду SBB. Вычесть из числа X число Y. Для этого эти числа условно разбиваются на слова. Вначале вычитаются младшие части с помощью команды SUB, затем старшие части с помощью команды SBB. Результат разместить по адресу начального числа X. Использовать регистры АХ, DX, ВХ, СХ. Фиксировать значения всех используемых в программе регистров на каждом шаге выполнения программы, также фиксировать значения флагов CF, OF, SF, PF, AF, ZF.
Исследовать команду NEG. С помощью команды NEG произвести вычитание из числа 40010 (непосредственный операнд - константа) числа К, взятого из таблицы 3. Использовать регистр АХ. Фиксировать значения всех используемых в программе регистров на каждом шаге выполнения программы, также фиксировать значения флагов CF, SF, AF.
Произвести компоновку полученной программы, т.е. создать загрузочный модуль с опциями для tasm.exe - [/zi], а для tlink.exe - [/v].
Загрузить отладчик TD и исследовать в нем работу программы в пошаговом режиме, нажимая клавишу F7.
Содержание отчета.
Список целочисленных арифметических команд микропроцессора семейства Intel х86.
Детальная схема алгоритма вычислений для пунктов 2.2.3. и 2.2.5.
Текст программы на языке ассемблер.
Таблица состояния РОН и регистра флагов процессора на каждом шаге выполнения программы.
Выводы.
Контрольные вопросы.
Какие целочисленные арифметические команды вы знаете?
Что такое регистр флагов и зачем он нужен?
Что такое дополнительный код?
Как выполнять целочисленные арифметические операции над операндами большой размерности? Пояснить на примере.
С какой целью в пункте 2.2.6. используется команда NEG ?