Перетворення знаку.

NEG – команда зміни знака на протилежний. По суті команда здійснює інвертування коду та додавання до молодшого розряду “1”.

NEG AX; NEG AL, NEG data. (байт або слово пам’яті).


Тема №11 Обробка даних в форматах ASCII та BCD.

ASCII – формат.

 

Дані, які вводяться з клавіатури або виводяться на екран представлені в ASCII кодах. В коді ASCII на кожен символ потрібно один байт.

S – 54 h; A – 41h; M – 4Dh; 1- 31h; 2 – 32h; 3 – 33h; 4 – 34h. і т.д.

З допомогою наступних асемблер них команд можна виконувати арифметичні операції безпосередньо над числами в ASCII – форматі:

 

AAA (ASCII Adjust for Addition) – корекція при додавання ASCII – коду.

Ця команда вважає, що в регістрі AL знаходиться двійкова сума двох розпакованих десяткових чисел (цифр). В результаті виконання команди ААА: в молодшій тетраді регістру AL утворюється правильна десяткова цифра суми; старша тетрада регістру AL скидається в “0”; вміст регістру AH збільшено на “1”, якщо при додаванні виник десятковий перенос; флаги CF і AF показують значення десяткового переносу, а стани інших флагів не визначені.

 

AAS (ASCII Adjust for Subtractions) – корекція при віднімання ASCII – коду.

Ця команда вважає, що в регістрі AL розміщена двійкова різниця двох розпакованих (не упакованих) десяткових чисел (цифр). В результаті виконання AAS:

- в молодшій тетраді регістру AL утворюється правильна десяткова цифра різниці;

- старша тетрада регістру AL встановлюється в 0;

- вміст регістру AH зменшується на “1”, якщо при відніманні виникла десяткова позика.

флаги CF і AF показують значення десяткової позики, інші флаги не визначені.

 

AAM (ASCII Adjust for Multiplication) – корекція при множення ASCII – коду.

Для цієї команди вважається, що в регістрі AX розміщений результат двійкового множення двох десяткових цифр (діапазону 0...81). Після виконання команди ААМ утворюється двохбайтний добуток, розміщений в регістрах AH, (старший розряд) і AL (молодший розряд). Молодші тетради обох регістрів містять цифри добутку, а старші тетради встановлені в “0”. Практично команда ААМ здійснює ділення вмісту регістра АХ на десять і заносить частку в регістр АН, а залишок в регістр AL. Стан флагів SF і ZF і PF залежать від вмісту регістру AL, а стан флагів OF, CF і AF невизначений.

 

AAD (ASCII Adjust for Division) – корекція при ділення ASCII – кодів.

Ділення розпакованих десяткових чисел відрізняється від попередніх тим, що необхідно корекцію проводити до операції ділення. Команда AАD вважає, в регістрі AL зберігається молодша десяткова цифра, а в регістрі AH – старша десяткова цифра діленого. Молодші тетради обох регістрів повинні бути нульовими.

Команда AАD виконує наступні дії:

- вміст регістру AH множить на десять;

- отриманий добуток додає до вмісту регістра AL.

- регістр AH скидає в “0”.

Після цих операцій в регістрі AX міститься двійковий еквівалент двох десяткових розрядів. Сама операція ділення отриманого в AX значення на одно розрядний дільник здійснюється командою DIV.

 

Ці команди не мають операндів, а виконують автоматичну корекцію значення в регістрі АХ.

 

Розглянемо приклад додавання двох ASCII – кодів : 38 (8 – десяткове) і 34 (4 – десяткове). Якщо в АХ занести 0038h, а в ВХ – 0034h, то додавання здійснюється за допомогою 2-х команд:

 

ADD AL, BL ; 34h + 38h

AAA ; Корекція додавання ASCII – кодів.

 

Команда AAA перевіряє праву шіснадцяткову цифру (4 біти) в регістрі AL. Якщо ця цифра перевищує 9h або AF = 1, то до регістру AL додається шістнадцяткова цифра 6h, а до регістру AH додається 1h, флаги СF і AF встановлюється в “1”. В усіх випадках команда ААА встановлює “0” в лівий 16-ковий розряд регістру AL. Результат в регістрі – АХ.

Після команди ADD в AX буде 006С;

Після команди AAA в AX утвориться число 0102.

Для отримання остаточного ASCII – коду достатньо встановити трійки на місце лівих шістнадцяткових цифр (старших тетрад байтів).

 

OR AX, 3030h ; Результат 3132

 

Додаваня багатобайтових ASCII – чисел потребує організації циклу, який виконує обробку значень справа наліво з врахуванням переносу. Цикл повторюється стільки разів скільки байтів даних довшого ASCII – коду.

Приклад додавання ASCII чисел 35 37 38 (578) і 36 39 34 (694).

 

TITLE ASCADD (COM) ;Додавання в ASCII – форматі

CJDESG SEGMENT PARA `code`

ASSUME CS:CODESG, SS:CODESG

ORG IOOH

BEGIN: JMP SHORT MAIN

ASC1 DB `578` ; обчислення символьних змінних

ASC2 DB `694`

ASC3 DB `0000`

 

MAIN: PROC NEAR

CLC

LEA Si, ASC1+2 ; занесення адресу молодших

LEA Di, ASC2+2 ; байтів ASCII - чисел

LEA BX, ASC1+3

MOV CL, 03 ; Встановлення ліч. Циклів в3.

А20:

MOV AH, 00 ; Очистка регістру AH

MOV AL, [Si] ; Занесення ASCII - байту

ADC AL, [Di] ; Додавання байтів 1 і 2 ASCII чисел.

AAA

PUSHF ; ASCII корекція.

OR AL, 30h ; Вставка в старшу тетраду 3-для

POPF ; перетворення розпакованого десяткового Формату ;в ASCII – коді.

MOV [BX], AL

DEC SI

DEC DI

DEC BX

LOOP A20

MOV [BX],AH ; збереження переносу після останньої операцій

RET

MAIN ENDP

GODESG ENDS

END BEGIN

 

При виконанні програми без виділеної частини отримаємо наступний результат 01020702.

 

 

Віднімання в ASCII – форматі.

 

Команда AАS перевіряє праву шіснадцяткову цифру в регістрі AL (молодшу тетраду). Якщо ця цифра більша 9 або флаг AF рівний “1”, то з регістра AL віднімається “6”, а з регістра AH – “1”, флаги AF і CF встановлюється в 1. В усіх випадках команда AAS встановлює в “0” ліву шістнадцяткову цифру (старшу тетраду) в регістрі AL.

Приклади віднімання в ASCII – форматі при ASC1=38; ASC2=34.

 


1. AX AF

MOV AL, ASC1 ; 0038

MOV AL, ASC2 ; 0034 0

AAS ; 0004 0

2. AX AF

MOV AL, ASC2 ; 0034

SUB AL, ASC1 ; 00FC 1

AAS ; FF0G 1


 

В прикладі 1 корекція полягає в заміні лівої тетради (цифри 3) нульовим значенням. В прикладі 2, оскільки права цифра рівна С, команда AAS віднімає 6 з регістра AL і 1 з регістра AH та встановлює флаги AF і СF в “1”. Результат отримуємо FFO6, що в доповнюючому коді еквівалентне числу “ – 4”.

 

Множення в ASCII – форматі.

Команда AAM виконує корекцію результату множення в регістрі AX. Множення необхідно проводити над однобайтними операндами в розпакованому десятковому форматі, тобто ASCII коди повинні бути очищені від трійок в лівих тетрадах.

В результаті виконання команди AAM відбувається ділення результату в регістрі AX на “10” (ОАН) і частка записується в регістрі АН, а залишок – в AL.

Приклад AL 35H; CL 37H.

АХ

AND CL, OFH

AND AX, OFOFH 0208

AAD ; Перетворення в двійковий 001C

DIV CL 0004

 

Команда ADD множить вміст AH на 10 (0AH), додає результат 20 (14H) до регістра AL і очищує регістр AH. Отримане значення 001С – це шістнадцяткове представлення десяткового числа 28.

Дільник може бути тільки однобайтним від 01 до 09.

 

Двійково – десятковий формат (BCD).

Двійково – десятковий формат утворюється шляхом видалення нулів із старших тетрад розпакованих десяткових кодів. Наприклад 00090204 0924. Такий формат називається двійково – десятковим (BCD – Binary Coded Decimal) або упакованим. Цей код містить тільки десяткові цифри від 0 до 9.

Для виконання додавання і віднімання чисел в двійково – десятковому форматі використовуються дві команди корекції.

DAA (Decimal Adjust after Addition) – десяткова корекція після додавання. Вона здійснює наступні операції:

1) Якщо молодша тетрада результату операції більша 9 або встановлений флаг додаткового переносу AF то до вмісту AL додається “6”.

2) Якщо після цього старша тетрада AL більша 9 або встановлений флаг переносу CF, то до старшої тетради додається “6”.

 

Приклад

1. +12 +00010010 CF AF 2. +18 +00011000 CF AF

34 00110100 25 00100101

46 01000110 0 0 43 00111101 0 0

+0110 додаємо “6”

01000011 0 1

3. +67 +01100111 CF AF

54 01010100

121 +10111011 0 0

+ 11000001 0 1

1.0010.0001 1 0.

 

DAS (Decimal Adjust after Subtraction) – десяткова корекція після віднімання. Вона здійснює наступні операції:

1) Якщо молодша тетрада результату операції віднімання більша 9 або встановлений флаг додаткового переносу AF, то від вмісту регістру AL віднімається “6”.

2) Якщо після цього старша тетрада AL, більша 9 або встановлений флаг переносу СF, то від старшої тетради віднімається “6”.

Обидві команди відповідно до результату AL впливає на всі флаги крім OF,стан якого залишається не визначеним.

 

Перетворення ASCII – формату в двійковий формат.

Арифметичні операції над числами в ASCII – і BCD – форматом зручні тільки для коротких полів. Практично простіше перетворити з ASCII – формату безпосередньо в двійковий виконати операції і повернутися до ASCII формату.

Процедура перетворення ASCII формату в двійковий починається з самого правого байту в ASCII – форматі.

1) Видаляють всі трійки з лівих шіснадцяткових цифр кожного ASCII – байту.

2) Множать ASCII – цифри на 1, 10, 100 (01H, 0AH, G4H ) і т.д. та додають результати.

Приклад перетворення чисел 1234 з ASCII – формату в двійковий:

4 ´ 1 = 4 4

3 ´ 10 = 30 1Е

2 ´ 100 = 200 С8

1 ´ 1000 = 1000 3Е8

Результат 04D2

 

Перетворення двійкового фомату в ASCII.

Процедура перетворення двійкового формату в ASCII зворотня до попередньої:

1) Двійкове число ділять на 10, при цьому отриманий залишок є молодшим ASCII числом.

2) Якщо частка більша 10, то її знову ділять на 10 і отримують наступне ASCII число.

3) Процедуру продовжують доти, поки частка стане меншою 10. Вона є старшим ASCII число.

Приклад: Частка Залишок

4D2: A 7B 4 Результат 1234

7B: A C 3

C: A 1 2

 

Всі залишки і остання частка повинні записуватись в пам’ять з “3”, тобто 31 32 33 34.

 

Округлення результату.

 








Дата добавления: 2015-10-09; просмотров: 1025;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.032 сек.