Преобразование знака
9.1. Составьте в текстовом редакторе NORTON программу exnot.asm в СОМ-формате:
MAIN PROC NEAR
MOV AX,81H
MOV DX,30H
NEG AX
NEG DX
MOV AX,81H
MOV DX,30H
NOT DX ;Инвертирование битов
NOT AX ;Инвертирование битов
ADD AX,1 ;Прибавление 1 к АХ
ADC DX,0 ;Прибавление переноса к DX
RET
MAIN ENDP
Команда NEG обеспечивает преобразование знака двоичных чисел из положительного в отрицательное и наоборот. Команда NEG устанавливает противоположные значения битов и прибавляет 1.
Команда NOT применяется для преобразования знака регистровой пары DX:AX.
9.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
9.3. Выполнить трассировку программы внимательно отслеживая содержимое регистров АХ и DХ. Выводы о работе программы записать в отчет.
СОДЕРЖАНИЕ ОТЧЕТА:
1. Листинги программ.
2. Выводы о работе программ.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
Вопросы имеют отношение к следующим данным:
DATAX DW 0148H
DW 2316H
DATAY DW 0237H
DW 4052H
DATAZ DW 0 ;Для результата
DW 0 ;Для результата
DW 0 ;Для результата
1. Закодируйте команды для сложения: а) слова DATAX со словом DATAY; б) двойного слова, начинающегося по адресу DATAX, с двойным словом в DATAY.
2. Объясните действие следующих команд:
STC
MOV BX,DATAX
ADC BX,DATAY
3. Закодируйте команды для умножения (MUL): а) слова DATAX на слово DATAY: б) двойного слова, начинающегося по адресу DATAX на слово DATAY.
4. Закодируйте команды для деления (DIV): а) слова DATAX на 23; б) двойного слова, начинающегося по адресу DATAX, на слово DATAY.
ОТВЕТЫ:
1. а) MOV AX,DATAY
ADD AX,DATAX
MOV DATAZ,AX
б) MOV AX,DATAX+2
ADD AX,DATAY+2
MOV DATAZ+2,AX
MOV AX,DATAX
ADC AX,DATAY
MOV DATAZ,AX
2. Команда STC устанавливает флаг CF. Сумма равна 0148Н плюс 0237Н плюс 1.
3. а) MOV AX,DATAX
MUL DATAY
MOV DATAZ+2,AX
MOV DATAZ,DX
б) MOV AX,DATAX+2
MUL DATAY
MOV DATAZ+4,AX
MOV DATAZ+2,DX
MOV AX,DATAX
MUL DATAY
ADD DATAZ+2,AX
ADC DATAZ,DX
4. а) MOV AX,DATAX
MOV BL,23
DIV BL
MOV DATAZ,AX
б) MOV DX,DATAX
MOV AX,DATAX+2
DIV DATAY
MOV DATAZ+2,AX
MOV DATAZ,DX
Л а б о р а т о р н а я р а б о т а N 8
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ 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-формате выполняется следующим образом:
--
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.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ: