Перетворення знаку.
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; просмотров: 1030;