Преобразование знака

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.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ:

Наши рекомендации