Assembler proqramlaşdırma dili

Çıxmanın nəticəsinin korreksiya əmrləri

Çıxmanın nəticəsinin korreksiya əmrləri

Qeyri yığcam BCD-ədədlərinin çıxılmasında, toplamada olduğu kimi, düzgün nəticə almaq üçün çıxmanın nəticəsini korreksiya etmək lazımdır. Bu prosesi misallarla izah edək

Misaldan göründüyü kimi çıxmanın nəticəsi 9-dan böyükdür.

Çıxma ikilik hesab qaydasına görə aparıldığından, nəticə artıq qeyri yığcam BCD-ədədi deyil. Nəticə doğru deyil. Çünki, qeyri yığcam BCD - formatında düzgün nəticə 9 (0000 1001 ikilik say sistemində) olmalıdır. Bu halda adi çıxma əmrində olduğu kimi böyük mərtəbədən borc götürmək, yəni faktiki olaraq 14–5 əməliyyatını aparmaq lazım gəlir. Onun üçün də nəticəni korreksiya etmək, yəni onu qeyri yığcam BCD - formatında təsvir etmək lazımdır. Bü əməliyyat operandsız AAS (ASCIIAdjust for Substraction – çıxmanın nəticəsini ASCII kodda, başqa sözlə, simvol şəklində təsvir etmək üçün korreksiya) əmri ilə icra olunur.

Əmrin formatı:

AAS kimidir.

AAS əmri iki qeyri yığcam BCD ədədlərinin çıxılmasının nəticəsini korreksiya edir. Korreksiya ediləcək ədəd AL registrində olmalıdır. Əmr AL registrinin kiçik tetradasını aşağıdakı kimi analiz edir;

Əgər AL registrinin kiçik tetradasının qiyməti 9-dan kiçikdirsə, onda CF bayrağına sıfır yazılır və idarə sonrakı əmrə ötürülür. Əgər AL registrinin kiçik tetradasının qiyməti 9-dan böyükdürsə və ya AF=1 - dirsə, onda AASəmriaşağıdakı əməliyyatları yerinə yetirir:

1) AL registrinin kiçik tetradasından 6 vahid çıxır;

2) AL registrinin böyük tetradasını sıfırlaşdırır;

3) CF=1 vəziyyətinə gətirməklə, böyük mərtəbədən borc götürməni qeyd edir və həmçinin, AF bayrağını vahid vəziyyətinə gətirir;

4) AH registrinin məzmununu 1 vahid azaldır.

AAS əmri SUB və SBB çıxma əmrlərindən dərhal sonra tətbiq olunur. Odur ki, SUB əmrindən bir dəfə, operandların kiçik rəqəmini çıxanda istifadə etmək lazım gəlir. Sonra isə böyük mərtəbədən borc götürüb –götürmədiyini nəzərə almaq üçün SBB əmrindən istifadə olunur.

b   DB 6,5        ; qeyri yığcam 56 ədədi
…
c   DB 3,4        ; qeyri yığcam 43 ədədi
…
      XOR BX,BX
      MOV CX,2
m1:
      MOV AL,b[BX]
      SBB AL,c[BX]
      AAS
         …
      INC BX
      LOOP m1
      JC m2
         …
m2:  …

Bu misalda azalan çıxılandan böyük olarsa, onda heç bir problem yaranmır. Ancaq, azalan çıxılandan kiçik olarsa, fərq düzgün olmayacaq və bu vəziyyət nəzərə alınmalıdır. Bu məqsədlə jc əmri Cf bayrağını analiz edir. Əgər cf=1 olarsa, idarə m2 nişanına göndərilir və burada azalan ilə çıxılanın yeri dəyişdirilir və nəticəyə mənfi ədəd kimi baxılır.

Yığcam BCD-ədədlərinin çıxılmasının proqramı da qeyri yığcam BCD-ədədlərinin çıxılmasına analoji olaraq aparılır. Ancaq burada işarə mərtəbəsi nəzərə alınır. Bunu, böyük mərtəbədən borc götürməni qeyd edən CF bayrağının qiyməti müəyyən edir. Nəticənin korreksiyasını DAS əmri yerinə yetirir.

DAS (Decimal Adjust for Substaction – çıxmanın nəticəsini onluq ədəd kimi təsvir etmək üçün nəticəni korreksiya etmək) əmri AL registrinin məzmununu iki yığcam onluq rəqəmə çevirir.

Əmrin formatı:

DAS kimi göstərilir.

DAS əmri iki yığcam BCD ədədlərinin çıxılmasının nəticəsini korreksiya edir. Əgər bu əmr SUB, SBB və ya DEC əmrlərindən sonra gələrsə, AL registrində alınan iki yığcam ikilik-onluq ədədlərin fərqini korreksiya edir.

DAS əmri aşağıdakı əməliyyatları aparır:

1) Əgər AL registrinin kiçik dörd bitinin qiyməti 9-dan böyük və ya AF=1 olarsa, onda AL registrinin məzmunu 6 vahid azaldılır və çıxmada borc götürmə baş veribsə, AF bayrağı vahid vəziyyətinə gətirilir. Əks halda AF=0 olur;

2) Əgər AL registrinin böyük dörd bitinin qiyməti 9-dan böyük və ya CF=1 olarsa, AL registrinin məzmunu 60h qədər azaldılır və CF =1 olur. Əks halda CF=0 olur.

Korreksiya etməklə yığcam BCD-ədədlərinin çıxılma­sının proqram fraqmentinə baxaq:

...
.DATA
a       DB 45h     ; Yığcam ədəd 45 
b       DB 37h     ; Yığcam ədəd 37
c       DB 0
.CODE
      ...
        MOV AL,a
        SBB  AL,b   ; 45 –dən 37-nin çıxılması 
        DAS             ; Nəticənin AL-də korreksiyası
       ...