Програма Алгоритм

Приклад 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. Робота з масивами і організація циклів потребує більшої уваги до всіх деталей.

Програміст повинен знати:

· вірність завдання початкових значень (ініціалізація) всіх змінних перед входом в цикл;

· вірність завдання адреси в командах посереднього переходу;

· вірність вибору умов, що перевіряються в місцях розгалуження;

· вірність виконання першого і останнього переходу.