Assembler proqramlaşdırma dili

Toplamanın nəticəsinin korreksiya əmrləri

Toplamanın nəticəsinin korreksiya əmrləri

Mikroprosessor operandlara ikilik ədəd kimi baxdı­ğından, qeyri yığcam BCD - ədədlərini topladıqda, düzgün nəticə (düzgün nəticə alınmaya da bilər) almaq üçün, toplamanın nəticəsini korreksiya etmək lazım gəlir.

Misal 1.  6= 0000 0110         Misal 2.    6 = 0000 0110
          +                                +
          3= 0000 0011                     7 = 0000 0111 
          9= 0000 1001                     13 = 0000 1101

Misal 1 - də toplama əməliyyatında kiçik tetradadan böyük tetradaya keçid yoxdur. Nəticə doğrudur.

Misal 2 - də toplamanın nəticəsi 9 –dan böyükdür və nəticə BCD ədədi deyil. Alınan nəticə doğru deyil. Çünki, yığcam olmayan BCD – formatlı 13 ədədinin düzgün ikilik təsviri 0000 0001 0000 0011 kimi olmalıdır. Bu cür problemləri aradan qaldırmaq üçün mikroprosessorun əmrlər sisteminə, nəticəni korreksiya edən bir neçə korreksiya əmrləri daxil edilmişdir.

Yığcam olmayaniki birqiymətli BCD-ədədinin toplanmasının nəticəsini korreksiya etmək üçün AAA (ASCII Adjust after Addition-toplamanın nəticəsini ASCII kodunda göstərmək üçün korreksiya) əmrindən istifadə olunur. Əmrin yazılışı aşağıdakı kimidir:

AAA

AAA əmri iki qeyri yığcam BCD ədədinin toplanmasının nəticəsini korreksiya edir. Bu əmrin operandı yoxdur. O, yalnız toplama əmri icra olunduqdan sonra icra olunur və qeyri-aşkar şəkildə, yalnız AL registri ilə işləyir. Başqa sözlə, əmr AL registrinin kiçik tetradasının qiymətini və AF bayrağının qiymətini analiz edir. Əgər bu qiymət 9-dan kiçik olarsa, onda cf=0 vəziyyətinə gətirilir və AL registrinin böyük dörd biti isə sıfırlarla doldurulur. Əgər bu qiymət 9-dan böyük və ya AF=1 vəziyyətindədirsə, onda aşağıdakı əməliyyatlar yerinə yetirilir:

1) aL registrinin kiçik tetradasının məzmununa (registrin bütün məzmununa deyil!) 6 (0110) ədədi əlavə olunur və bununlada onluq nəticənin qiyməti düzgün istiqamətə korreksiya olunur;

2) aL registrinin böyük yarım baytı təmizlənir;

3) AH registrinin qiymətinə 1 əlavə olunur;

4) cf=1 vəziyyətinə gətirilir ki, bununla da böyük mərtəbəyə keçid qeyd (ondan sonrakı əməliyyatlarda istifadə etmək üçün) olunur (əks halda AF=0 və cf=0 vəziyyətində olur).

Misal 2 –də toplamanın nəticəsinin (0000 1101) AL registrində yerləşdiyini nəzərə alsaq, AAA əmri icra olunduqdan sonra nəticə aşağıdakı ardıcıllıqla korreksiya olunur:

1) L=0000 1011 məzmunu ilə 0110 toplanır, nəticədə

AL=0001 0011 alınır;

2) AL registrinin böyük yarım baytı təmizlənir. Nəticə:

AL= 0000 0011

3) AH registrinin qiymətinə 1 əlavə olunur. Nəticədə AX registrində 0000 0001 0000 0011 (13 yığcam olmayan BCD-ədədi alınır) alınır.

İki yığcam olmayan ədədlərin toplanmasının nəticəsinin korreksiyasını əks etdirən proqramı nəzərdən keçirək:

Misal 1. İki yığcam olmayan 08 və 05 BCD-ədədlərin toplanması:

MOV AH,08H         ; AH=08H
MOV AL, 05H         ; AL=05H
ADD  AL,AH          ;AL =05H+08H=0DH – BCD 
                                   ; ədədi deyil
XOR AH,AH           ;AH=0
    AAA                          ;AH=01H, AL=03H nəticə 
                                       ;  korreksiya olundu.

Misal 2. İki yığcam olmayan 71 və 45 BCD-ədədlərin toplanması proqramı:

MODEL SMALL
.STACK 256
.DATA
len     EQU  2          ; ədədin mərtəbəsi
B        DB    1,7       ; yığcam olmayan 71
C        DB    4,5       ; yığcam olmayan 54
sum    DB    3 DUP(0)
.CODE
MAIN:   
 ; Proqrama giriş nöqtəsi
     MOV  AX, @DATA
     MOV  DS, AX
     XOR  BX, BX        ; BX sıfırlaşdırmaq
     XOR  AX, AX       ; AX sıfırlaşdırmaq
MOV  CX,LEN      ; dövrün sayının CX -ə yüklənməsi 
m1:                                ; dövrün gövdəsinin başlanğıcı
       MOV  AL, B[BX]
       ADC   AL,C[BX]   
       AAA
	MOV   sum [BX],AL
	INC   BX
	LOOP m1               ; Dövrün sonu
	ADC   sum[BX], 0
	MOV DL,SUM+2
	ADD DL,30h
	MOV AH,6
	INT 21h
	MOV DL,SUM+1
	ADD DL,30h
	MOV AH,6
	INT 21h
	MOV DL,SUM
	ADD DL,30h
	MOV AH,6
	INT 21h
       MOV AX,4C00h
	INT 21h
      END  main

Bu proqramda BCD-ədədin kiçik rəqəmi kiçik ünvanda yerləşdirilib ki, bu da (yığcam olmayan BCD-ədədin hər bir rəqəminin bir baytda yerləşdiyinə əsaslanır) onların mərtəbə-mərtəbə emal olunması üçün daha əlverişlidir.

Dövrün birinci mərhələsində adc aL, C[bx] əmri

1 rəqəmi ilə 4 rəqəmini toplayır və nəticəni AL registrində yerləşdirir. Yəni, 0000 0100 ilə 0000 0001 ədədlərinin toplanmasının nəticəsi AL registrində 0000 0101 kimi alınır. Burada köçürmə olmadığından CF=0 olur. Alınan ədəd AAA əmri ilə korreksiya olunmur. Çünki alınan ədəd yığcam olmayan BCD-ədədidir. mov sum [bx], aL əmri sum yaddaş xanasına 5 rəqəmini yazır. INC BX əmri bx registrinin qiymətini 1 vahid artırır. loop m1 əmri idarəni m1 nişanına göndərir və CX registrinin qiyməti 1 vahid azaldılır.

Dövrün ikinci mərhələsində adc aL, C[bx] əmri 7 (0000 0111) və 5 (0000 0101) ədədləri toplayır və nəticəni AL registrində yerləşdirir. Alınan 12 (0000 1100) ədədi BCD ədədi deyil. CF bayrağı sıfra bərabərdir. AAA əmri kiçik tetradakı 0000 1100 ədədinə 0110 ədədini əlavə edir. Nəticədə 0001 0010 ədədi alınır. Sonra bu ədədin böyük tetradası sıfırlaşdırılır. AH registrinə 1 əlavə olunur və cf bayrağı 1 vəziyyətinə gətirilir. Nəticədə AX registrində 0000 0001 0000 0010 ədədi alınır.

mov sum [bx], aL

əmri sum+1 ünvanlı yaddaş xanasına 2 (0000 0010) ədədini göndərir. INC əmri isə yenidən bx registrinin məzmununu 1 vahid artırır.

loop m1 əmri dövrü sona çatdırır və idarəni

adc sum [bx], 0

əmrinə ötürür. Bu əmr sum+2 ünvanlı yaddaş xanasına CF bayrağının 1 qiymətini göndərir. Bu əmrin hər iki operandının qiyməti sıfra bərabərdir.

Nəticədə sum dəyişəninində 125 yığcam olmayan BCD-ədədi alınacaq.

Yağcam BCD ədədləri üzərində yalnız toplama və çıxma əməliyyatlarını aparmaq olar. İstər yağcam BCD və istərsə yığcam olmayan BCD ədədləri iləhesabi əməliyyatın nəticəsini korreksiya etmək lazımdır.

İki yağcam BCD ədədinin toplanmasının nəticəsini korreksiya etmək üçün DAA (Decimal Adjust for Addition –toplamanın nəticəsini onluq şəkildə göstərmək üçün korreksiya) əmri mövcudur.

Əmrin yazılışı aşağıdakı kimidir:

DAA

DAA əmri iki yığcam BCD ədədin toplanmasının nəticəsini korreksiya edir. DAA əmri toplama əmrindən dərhal sonra icra olunur və yalnız AL registri (toplamanın nəticəsinin AL registrində olduğu nəzərdə tutulur) ilə işləyərək aşağıdakı əməliyyatları yerinə yetirir:

I. Əgər AL registrinin kiçik dörd bitinin qiyməti 9-dan böyük olarsa (və ya AF = 1), yəni AL registrinin kiçik tetradasının 3-cü bitindən (əgər onun qiyməti 0fh-dan böyük olarsa), onun böyük tetradasına ikilik vahid köçürülməsi baş verərsə, onda AF bayrağının qiyməti 1 vəziyyətinə gətirilir. Bu şərtlər ödəndikdə AL registrinin kiçik tetradasının qiyməti 9h-ı aşır. Onda:

1) AL registrinin məzmunu 6 vahid artırılır;

2) Əgər toplama zamanı 7-ci bitə köçürmə baş verərsə, CF bayrağı vahid vəziyyətinə gətirilir;

3) AF bayrağının qiyməti AF =1 vəziyyətinə gətirilir. Əks halda AF =0 olur.

II. Əgər AL registrinin böyük 4 bitinin qiyməti 9-dan böyük və ya CF= 1 olarsa onda AL registrinin qiyməti 60h-a qədər artırılır və CF= 1 vəziyyətinə gətirilir, əks halda CF= 0 olur.

İndi isə iki ikirəqəmli yığcam BCD-ədədlərinin toplanmasının proqram fraqmentinə baxaq:

…
.DATA                   ; Verilənlər seqmenti
b	DB  17h           ; Yığcam ədəd 17
s	DB  45h           ; Yığcam ədəd 45
sum	DB  2 DUP (0)
.CODE
…
	MOV AL,b
	ADD AL,c
	DAA
	      JNC   $+6      ; Əgər nəticə <= 99-sə, növbəti 
                                      ; əmri ötürməklə keçid
	ADC  sum+l,AH       ; toplamada köçürməni 
                                      ; nəzərə almaq (nəticə> 99)
	MOV  sum,AL         ;nəticənin kiçik 
                                     ; yığcam rəqəmləri

Bu proqram fraqmentindəki DAA əmrinin işləmə mexanizminin izahına baxaq.

add al,C əmrinin icrasından sonra AL reqistrində 0101 1100 (5Ch) ədədi saxlanacaq:

DAA əmri icra olunduqda AL reqistrinin məzmunu 6 (0110) vahid qədər artırılacaq (kiçik dörd bitin qiyməti > 9 olduğundan):

AL reqistrinin böyük yarım baytını (9-dan kiçik olduğuna görə) korreksiya etmək lazım deyil.

İşarəli ədədlərin toplanmasında yalnız CF bayrağının qiymətini deyil, həm də operandın böyük mərtəbəsinin vəziyyətini qeyd edən OF daşma bayrağının qiymətini bilmək lazımdır. Əgər iki eyni işarəli ədədlərin toplanmasının nəticəsi operandların mümkün qiymətlər diapazonunu aşarsa, OF bayrağı 1 vəziyyətinə gətirilir