Програма Алгоритм
Приклад 10. Додавання десяткових чисел
Програма
ORG 800H | |||
SUB A | |||
21 12 08 | LXI H,ADDR1 | ||
MOV B,M | |||
11 16 08 | LXI D,ADDR3 | ||
MPAD: | INX H | ||
1A | LDAX D | ||
80A | 8E | ADC M | |
80B | MOV M,A | ||
80C | INX D | ||
80D | DCR B | ||
80E | C2 08 08 | JNZ MPAD | |
HLT | |||
ADDR1: | DB 03H | ||
29 A4 50 | ADDR2: | DB 29H,0A4H,50H | |
FB 37 28 | ADDR3: | DB 0FBH,37H,28H | |
END |
В більшості 8-бітних мікропроцесорів є спеціальна команда DAA (десяткова корекція), що використовує біти Cy та AC регістру F. Вона розрахована на те, що в акумуляторі знаходиться сума упакованих десяткових операндів, отриманих будь-якою із команд ADD, ADC, ADI, ACI. Ця команда служить для аналізу змісту тетрад акумулятора і станів прапорців Cy та AC . Як підсумок цього аналізу в акумуляторі формується вірний десятковий результат, а прапор Сy відображає значення десяткового переносу.
DAA (Decimal adjust accumulator) - неявна адресація
додавання в двійково – десятковому коді
Якщо значення [A3A2A1A0] > 9H v AC=1, діє на всі біти F
то A ß A + 6H,
Якщо значення [A7A6A5A4] > 9H v Cy=1,
то A ß A + 60H.
Зауваження: команда використовується для одного байту і здійснюється лише над акумулятором.
Завдання:нехай необхідно додати два рядки, кожен з яких складається із шести десяткових цифр
376529 + 224388 = 600917
В пам’яті вони розміщені наступним чином
(ADDR1) = 3 – лічильник,
(ADDR2) = 29H, (ADDR2+1) = 65H, (ADDR2+2) = 37H - перше число,
(ADDR3) = 88H, (ADDR3+1) = 43H (ADDR3+2) = 22H – друге число.
Результат розмісти починаючи з адреси ADDR2.
ORG 800H | |||
SUB A | |||
21 13 08 | LXI H,ADDR1 | ||
MOV B,M | |||
11 16 08 | LXI D,ADDR3 | ||
MPAD: | INX H | ||
1A | LDAX D | ||
80A | 8E | ADC M | |
80B | DAA | ||
80C | MOV M,A | ||
80D | INX D | ||
80E | DCR B | ||
80F | C2 08 08 | JNZ MPAD | |
HLT | |||
ADDR1: | DB 03H | ||
29 65 37 | ADDR2: | DB 29H,65H,37H | |
88 43 22 | ADDR3: | DB 88H,43H,22H | |
END |
Розглянуті приклади ілюструють наступні особливості програмування на мові асемблера:
1. Майже всі операції обробки даних здійснюються над змістом акумулятору.
2. Програміст повинен передбачити якомога менше звернень до пам’яті. Число звернень можна зменшити, використовуючи посередню адресацію регістрів, а також запам’ятовувати дані в регістрах загального призначення (РЗП).
3. Слід уважно аналізувати вплив команд на стан регістру ознак.
4. За допомогою команди “логічне І” можна обнулити деякі розряди комірки, що дає можливість працювати з даними, які мають довжину меншу довжини комірки.
5. За допомогою команд зсуву можна здійснювати переміщення даних із одних розрядів в інші з метою як обробки, так і економії часу.
6. Кожна програма складається із блоків встановлення початкових значень (ініціалізації), обробки і керування циклами. ЕОМ виконує блок ініціалізації один раз перед входом в цикл. Блок керування циклом визначає число повторів циклу.
7. Використання адресних вказівників зменшує число адрес пам’яті процесора.
8. Робота з масивами і організація циклів потребує більшої уваги до всіх деталей.
Програміст повинен знати:
· вірність завдання початкових значень (ініціалізація) всіх змінних перед входом в цикл;
· вірність завдання адреси в командах посереднього переходу;
· вірність вибору умов, що перевіряються в місцях розгалуження;
· вірність виконання першого і останнього переходу.