- •Машинное исполнение
- •1. Просмотр памяти.
- •2. Пример машинных кодов: непосредственные данные.
- •3. Пример машинных кодов: определение данных.
- •4. Пример машинных кодов: определение размера памяти.
- •5. Специальные средства отладчика.
- •6. Сохранение программы из отладчика.
- •Ассемблирование и выполнение программы
- •1. Ввод программы
- •2. Ассемблирование программы.
- •3. Компоновка программы.
- •4. Выполнение программы.
- •5. Ввод, ассемблирование, компоновка, выполнение и анализ листинга исходной программы.
- •Определение данных
- •1. Директивы определения данных.
- •2. Определение данных с числом повторений.
- •3. Директива определения байта (dв).
- •4. Директива определения слова (dw).
- •5. Директива определения двойного слова (dd).
- •6. Директива определения поля из четырех слов (dq).
- •7. Директива определения десяти байт (dt), директива equ.
- •Программы в com-файлах
- •1. Создание exe-файла.
- •2. Получение com-файла.
- •Логика и организация программы
- •1. Команда jmp.
- •2. Команда loop.
- •3. Сегмент стека.
- •4. Программа: расширение операции пересылки.
- •5. Программа: замена строчных букв на заглавные.
- •6. Команды сдвига и циклического сдвига.
- •7. Команды логических операций: and, or, xor, test, not.
- •Xor al,bl ;Логическое сравнение
- •Команды обработки строк
- •1. Rep: префикс повторения команды.
- •2. Программа: строковые операции.
- •3. Сканирование и замена.
- •4. Дублирование образца.
- •5. Программа: выравнивание справа при выводе на экран.
- •Арифметические операции 1: обработка двоичных данных
- •1. Сложение и вычитание.
- •2. Многословное сложение.
- •3. Умножение.
- •4. Повышение эффективности умножения.
- •5. Многословное умножение.
- •6. Сдвиг регистровой пары dx:ax.
- •7. Деление.
- •8. Деление вычитанием.
- •9. Преобразование знака.
- •Арифметические операции 2: обработка данных в форматах ascii и
- •1. Сложение в ascii-формате.
- •2. Вычитание в ascii-формате.
- •3. Умножение в ascii-формате.
- •4. Деление в ascii-формате.
- •5. Двоично-десятичный формат (bcd).
- •6. Преобразование ascii-формата в двоичный формат и наоборот.
- •Обработка таблиц
- •1. Прямой табличный доступ
- •2. Табличный поиск.
- •3. Табличный поиск с использованием сравнения строк.
- •4. Транслирующая команда xlat.
- •5. Программа: вывод шестнадцатиричных и ascii-кодов.
- •6. Программа: сортировка элементов таблицы.
- •Макрокоманды
- •If (условие)
- •If (условие)
- •1. Простое макроопределение.
- •2. Использование параметров в макрокомандах.
- •3. Комментарии в макрокомандах.
- •4. Использование макрокоманд внутри макроопределения.
- •5. Директива local.
- •6. Использование библиотек макроопределений.
- •7. Конкатенация (&).
- •8. Директивы повторения: rept, irp, irpc.
- •Inc ctr ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •9. Макрокоманды, использующие директивы if и ifndef.
- •10. Макрокоманды, использующие директиву ifidn.
- •Связь между подпрограммами
- •1. Программа: использование директив extrn и public для меток.
- •2. Программа: использование директивы public в кодовом сегменте.
- •3. Программа: общие данные в подпрограмме.
- •4. Передача параметров.
Арифметические операции 2: обработка данных в форматах ascii и
BCD
МЕТОДИЧЕСКИЕ УКАЗАНИЯ:
1. Для выполнения лабораторной работы вы должны войти в каталог группы из панели NORTON. Каждый студент должен иметь в каталоге группы свой личный каталог. Все программы должны создаваться и записываться в личном каталоге студента.
2. Ввод данных с клавиатуры и вывод информации на экран осуществляется в коде ASCII. Например, число 23 в двоичном представлении выглядит как 00010111 (17Н); в коде ASCII на каждый символ требуется один байт и число 23 в ASCII-коде имеет представление 3233 (два байта), буквы SAM имеют представление 53414D (три байта), число 1234 имеет представление 31323334 (четыре байта).
3. Арифметические операции над числами в ASCII-формате выполняются с помощью следующих ассемблерных команд:
AAA - коррекция для сложения ASCII-кода
AAD - коррекция для деления ASCII-кода
AAM - коррекция для умножения ASCII-кода
AAS - коррекция для вычитания ASCII-кода
Эти команды кодируются без операндов и выполняют автоматическую коррекцию в регистре АХ.
4. Сложение чисел 8 и 4 в ASCII-формате выполняется следующим образом:
38
34
--
6C
Полученная сумма неправильна ни для ASCII-формата, ни для двоичного формата. Однако, прибавляя левую цифру 6 к правой цифре С: С + 6 = 12, получим правильный результат в десятичном формате.
5. Команда ААА проверяет правую шестнадцатиричную цифру (4 бит) в регистре AL. Если эта цифра находится между A и F или флаг CF установлен в 1, то к регистру AL прибавляется 6, а к регистру АН прибавляется 1, флаг CF устанавливается в 1. Во всех случаях команда ААА устанавливает в 0 левую шестнадцатиричную цифру в регистре AL. Результат получается в регистре АХ (0102). Для получения окончательного ASCII-представления ставятся тройки на место левых шестнадцатиричных цифр:
OR AX,3030H
В регистре АХ получается результат 3132.
6. Команда AAS выполняется аналогично команде ААА. Команда AAS проверяет правую шестнадцатиричную цифру в регистре AL. Если эта цифра лежит между A и F или флаг CF равен 1, то из регистра AL вычитается 6, а из регистра АН вычитается 1, флаг CF устанавливается в 1. Во всех случаях команда AAS устанавливает в 0 левую шестнадцатиричную цифру в регистре AL.
7. Команда ААМ выполняет корректировку результата умножения ASCII-кодов в регистре АХ. Полученные данные в результате выполнения команды будут иметь распакованное десятичное представление. Например, число 01020304, полученное в результате выполнения команды ААМ, соответствует числу 31323334 в ASCII-формате. Коррекция выполняется только для одного байта за одно выполнение команды, поэтому для более длинных полей необходима организация цикла. Перед выполнением умножения множимое и множитель должны быть распакованы из ASCII-кода в десятичное представление.
8. Команда AAD выполняет корректировку ASCII-кода делимого до непосредственного деления. Однако, прежде необходимо очистить левые тройки ASCII-кодов для получения распакованного десятичного формата. Команда AAD может оперировать с двухбайтовыми делимыми в регистре АХ. Делитель может быть только однобайтовый.
9. Число в компьютере может быть представлено в различных форматах. Например, число 0924 может быть представлено: 30393234 (0011 0000 0011 1001 0011 0010 0011 0100) - ASCII-формат, 00090204 (0000 0000 0000 1001 0000 0010 0000 0100) - распакованное десятичное представление, 0924 (000 1001 0010 0100) - двоично-десятичный формат (BCD) состоящий из двух байт, 039С - (0000 0011 1001 1100) шестнадцатиричное представление, 0000 0011 1001
1100 - двоичное представление .Длина ASCII-представления - 4 байта, распакованного десятичного представления - 4 байта, двоично-десятичного представления - 2 байта, шестнадцатиричного представления - 2 байта, двоичного представления - 2 байта.
10. Для сложения чисел в двоично-десятичном представлении используется команда DAA (десятичная коррекция для сложения). Для вычитания чисел в двоично-десятичном представлении используется команда DAS (десятичная коррекция для вычитания).
11. Процедура преобразования из ASCII-формата в двоичный формат заключается в следующем:
а) Начинают с самого правого байта числа в ASCII-формате и обрабатывают справа налево.
б) Удаляют тройки из левых шестнадцатиричных цифр каждого ASCII-байта.
в) Умножают ASCII-цифры на 1, 10, 100 (01Н, 0АН, 64Н) и т.д. и складывают результаты.
12. Для примера рассмотрим преобразование числа 1234 из ASCII-формата в двоичный формат:
Десятичное Шестнадцатиричное
4 х 1 = 4 4
3 х 10 = 30 1Е
2 х 100 = 200 С8
1 х 1000 = 1000 3Е8
Результат: 4 + 1Е + С8 + 3Е8 = 04D2 (двоичное)
13. Преобразование двоичного формата в ASCII-формат включает в себя процесс, обратный предыдущему. Вместо умножения используется деление двоичного числа на 10 (0АН), пока результат не будет меньше 10. Остатки, которые лежат в границах от 0 до 9, образуют число в ASCII-формате. В качестве примера рассмотрим преобразование 4D2H обратно в десятичный формат:
Частное Остаток
4D2 : A = 7B 4
7B : A = C 3
C : A = 1 2
Так как последнее частное 1 меньше, чем 0АН, то операция завершена. Остатки вместе с последним частным образуют результат в ASCII-формате, записываемый справа налево - 1234. Все остатки и последнее частное должны записываться в память с тройками, т.е. 31323334.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ: