Арифметичні операції над багатобайтними числами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Арифметичні операції над багатобайтними числами



Як видно, процесор КР580ик80 безпосередньо може виконувати обмежене коло арифметичних операцій над однобайтними операндами. Але це не означає, що ним не можна виконувати складнішу обробку багатобайтних даних. Така обробка реалізується не однією окремою командою, а невеликими програмами. Нижче наводяться приклади програм деяких операцій з багатобайтними числами. При цьому використовуються такі символічні імена і адреси:

 

FIRST   SECND HL і DE N В       – адреса молодшого байту першого операнду і адреса ре­зультату; – адреса молодшого байту другого операнду; – вказівники даних; – довжина операндів в байтах; – лічильник байтів (представляє довжину операндів в бай­тах).  

 

Приклад 5.1. Додавання багатобайтних чисел (цілих без знаку)

 

ADDN:   MVI   B, N ; ініціалізація лічильника  
    LXI   D, FIRST ; ініціалізація вказівників инициализация указателей  
  LXI H, SECND  
    XRA LDAX   A   ; скидання ознаки переносу  
LOOP: LDAX D ; завантаження першого операнду
    ADC   M   ; додавання
    STAX   D   ; запам’ятовування результату  
    DCR   В   ; декремент лічильника  
    JZ   DONE   ; додавання закінчено?  
    INX   H   ; перехід до настіпного байту  
    INX   D      
    JMP   LOOP   ; організація циклу  
DONE:   …   ; кінець  

 

Примітки: 1. Для реалізації підпрограми віднімання SUBN необхідно повторити підпрограму ADDN, але замінити в ній команду ADC на команду SBB. У випадку отримання від’ємної різниці ознака С буде дорівнювати 1.

2. Для реалізації підпрограми складання багатобайтних десяткових двійково-кодованих чисел (BCD-чисел) в підпрограмі ADDN після команди ADC слід ввести команду DAA. Десяткове переповнення фіксується в розряді С регістра ознак.

Приклад 5.2. Віднімання багатобайтних десяткових двійково-кодованих чисел (BCD-чисел, цілих без знаку).

Віднімання BCD-чисел виконується в МП К580 відносно складно, оскільки команда DAA не корегує результат двійкового віднімання BCD-чисел. Віднімання BCD-чисел виконується в дві фази: спочатку отримують доповнення від’ємника до 10 n+1, а потім складають отриманий код із зменшуваним. При цьому команда DAA корегує результат двійкового складання BCD-чисел.

FIRST D, E SECND H, L N В   - адреса зменшуваного і різниці; - вказівник поточного байту зменшуваного; - адреса від’ємника; - вказівник поточного байту від’ємника; - довжина операндів в байтах; - лічильник байтів.  

Підпрограма DSUBN

DSUBN;   MOV   B, N       ; ініціалізація лічильника і вка-  
    LXI   D, FIRST       зівників    
    LXI   H, SECND              
    STC       ; установка ознаки С      
LOOP:   MVI   A, 99H       ; завантаження «дев’яток»      
    ACI         ; врахування ознаки С      
    SUB   M       ; доповнення від’ємника      
    XCHG         ; обмін вказівників, HL вказує на зменшуване  
    ADD   M       ; додавання до зменшуваного      
    DAA           ; корекція    
    MOV   МД * ‘-       ; запам’ятовування різниці      
    XCHG           ; відновлення вказівників  
    DCR   B       ; віднімання закінчено?      
    JZ   DONE       ; так, вихід із підпрограми  
    INX   D       ; ні, віднімати следующие      
    INX   H       ; байти      
    JMP   LOOP       ; цикл      
DONE:   …       ; кінець      
               

 

Примітки: 1. Для представлення BCD-чисел із знаком вводиться тетрада для знаку (0000 – додатні числа, 1001 – від’ємні числа).

2. Використання в підпрограмі DSUBN команди взаємного, обміну XCHG дозволяє звертатися до пам’яті за однобайтними командами ADD М і MOV М, А, Команда XCHG дозволяє позбавитися від додаткових команд міжрегістрового обміну MOV г1, г2.

3. Отримання додаткового коду від’ємника і складання його із зменшуваним виконується в одному циклі.

4. Додатковий код від’ємника утворюється відніманням його, з коду «всі дев’ятки» і інкрементуванням результату. Саме для цього командою STC ознака переносу заздалегідь встановлюється в 1, а підсумовування виконується командою ACI яка враховує значення ознаки переносу.

5. Якщо після закінчення підпрограми ознака переносу дорівнює нулю, то це свідчить про отримання від’ємного результату.

6. Якщо двійкові числа представлені в двійковому додатковому коді, а BCD-числа представлені в десятковому до додатковому коді, то розглянуті підпрограми без змін можуть бути використані для операцій над числами із знаком. У випадку відсутності переповнення результат операції буде отриманий в додатковому коді.

Оскільки АЛП в МП К580 не формує ознаку переповнення, доводиться доповнювати підпрограми процедурою перевірки переповнення розрядної сітки, яка реалізується серією команд маскування та порівняння і працює за правилом: переповнення має місце, якщо знак результату відрізняється від однакових знаків обох операндів при складанні, або не співпадає із знаком зменшуваного при віднімання у разі, коли операнди мають різні знаки.

Програмна реалізація операції множення.

Існує багато різних алгоритмів виконання операції множення. Розглянемо найбільш часто використовувані способи і оцінимо їх достоїнства і недоліки.

Приклад 5.3. Множення байтів. Варіант 1. Множення молодши­ми розрядами вперед із зсувом часткової суми вправо.

D – множене, Е – множник, ВС – двобайтний добуток, L – лічильник бітів.

 

MULT1:   NXBIT:   LXI MVI MOV RAR   B, 0 L, 8 A, E   ; скидання часткової суми ; завантаження лічильника ; множник в акумулятор ; біт, що аналізується в тригері С  
    MOV JNC MOV   Е, A NOADD A, B   ; повернення зсунутого множника ; біт множника дорівнює нулю? ; ні  
  ADD MOV   D B,A   ; додавання множеного ; повернення старшої часткової суми    
NOADD:   MOV   A, B    
  RAR MOV   В, А ; зсув часткової суми  
    MOV   A, C л., ‘-*,..  
    RAR      
    MOV   С, А ; повернення молодшої часткової суми
  DCR L  
  DONE: JNZ ... NXBIT ; організація циклу ; кінець
           

 

Примітки: 1. Командою RAR аналізований біт множника поміщається в тригер переносу. Якщо він дорівнює 1, то вміст регістрів В і D сумують, а якщо С=0, то складання не виконується. Після цього (починаючи з мітки NOADD) проводиться зсув часткової суми управо.

2. Довжина підпрограми MULT1 складає 24 байт.

Приклад 5.4. Множення байтів. Варіант 2. С – добуток, D – множник, ВС – добуток, L – лічильник бітів. Множник поміщається на місце молодших розрядів добутку в регістр С. Молодші біти добутку заміщають старші біти множника, що звільняються, і тому окремих зсувів молодшого байту часткової суми виконувати не потрібно. За рахунок цього підпрограма MULT2, що наводиться нижче, на 3 байта коротша за підпрограму MULT1.

 

MULT2:   MVI   В, 0   ; ініціалізація  
    MVI   L, 9      
NXBIT:   MOV   А, С   ; множник в акумулятор  
    RAR       ; біт, що аналізується – в тригері С  
    MOV   С, А   ; повернення зсунутого множника
    DCR   L    
    JZ   DONE   ; кінець множення?
    MOV   А, В   ; ні
    JNC   NOADD   ; аналіз біта множника  
    ADD   D   ; додавання множеного
NOADD:   RAR       ; зсув часткової суми
    MOV   В, А   ; повернення старшого байту часткової суми
    JMP   NXBIT   ; організація циклу  
DONE:   ...   ; кінець  

 

Примітка. Перевірка закінчення множення проводиться до аналізу старшого біта множника, і тому в лічильник бітів L завантажується константа 9, а не 8.



Поделиться:


Последнее изменение этой страницы: 2017-02-10; просмотров: 108; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.88.16.192 (0.027 с.)