Assembler proqramlaşdırma dili

Vurmanın nəticəsinin korreksiya əmri

Vurmanın nəticəsinin korreksiya əmri

BCD-ədədlərin vurulması üçün xüsusi əmrlər yoxdur. Qeyri yığcam BCD-ədədlərin vurulmasından sonra nəticəni korreksiya etmək üçün AAM (ASCII Adjust for Multiplication – vurmanın nəticəsini ASCII kodunda göstərmək üçün nəticənin korreksiyası) əmrindən istifadə olunur.

Bu əmr, qeyri yığcam BCD-ədədlərin vurulmasını yerinə yetirən MUL vurma əmrinin icrasından sonra, AX registrindəki nəticəni korreksiya edir. Vuran və vurulan yığcam olmayan baytlar olmalıdır. AAM əmri ümumi şəkildə aşağıdakı kimi yazılır:

AAM

Operandsız əmrdir. AAM əmri iki qeyri yığcamBCD-ədədlərin vurulmasının nəticəsini korreksiya edir. AAM əmri, çevirməni aparmaq üçün AL registrinin qiymətini

10-a bölür və qisməti AH, qalığı isə AL registrində yerləşdirir.

Misal 1       
;5 və 7 ədədlərinin vurulması
MOV AL,5
MOV BL,7
MUL BL   ; 5-i 7-yə vurur. Nəticə  35d (0023h) 
                   ; ədədi AX registrinə yazılır. 
AMM        ; bu əmrin icrasından sonra 
                   ; AX -də 0305h ədədi olacaq. 
Nəticədə AH(03) və AL(05) kimi iki yığcam olmayan BCD-ədədləri alınacaq.

Misal 2: Qeyri  yığcam 78 və3 ədədlərinin vurulması 
              proqramı:
MASM
MODEL SMALL
.STACK 256
.DATA
b          DB 8,7        ; qeyri yığcam 78
d          DB 3           ; qeyri yığcam 3
hasil       DB 4 DUP (0)
.CODE   
main:
        MOV AX,@DATA 
        MOV DS,AX 
        XOR AX,AX 
len   EQU 2          ; Birinci vuruğun ölçüsü (mərtəbələrin
                              :  sayı)
        XOR BX,BX
        XOR SI,SI
        MOV CX,len
m1:
        MOV AL,b[SI]
        MUL d
        AAM               ; nəticənin korreksiyası
        ADC AL,DL
        AAA
        MOV DL,AH  ;köçürməni saxlamaq
        MOV hasil[BX], AL
        INC SI 
        INC BX 
        LOOP m1
        MOV hasil [BX], DL
        MOV AX, 4C00h
        INT 21h
END     main

Proqramın işinin qısa izahı: dövrün birinci mərhələsində MUL d əmri d-nin (d=3) məzmununu AL registrinin məzmununa (AL=8) vurur. Alınan nəticəni (0018h (24d)) AX registrinə yerləşdirir. AAM əmri vurmanın nəticəsini korreksiya edir: AX registrinə qeyri yığcam düzgün cavabı yəni 0204h ədədini yazır.

Sonrakı iki ADC və AAA əmrləri - DL registrinin məzmunu 0, AL registrinin məzmunu isə düzgün qeyri yığcam 4 ədədi olduğuna görə heç bir dəyişiklik yaratmayacaq. MOV DL, AH əmri, böyük hissəyə köçürüləcək 2 ədədini DL registrində (2 – köçürməsi 8 və 3 ədədlərinin vurulmasından yaranıb) saxlayır.

MOV hasil[BX],AL əmri hasil ünvanlı xanaya 4 (78 –in 3 –ə vurulmasından alınan 234 ədədinin ən kiçik mərtəbəsini) ədədini göndərir. Dövrün ikinci mərhələsində MOV AL,b[SI] əmri AL registrinə 7 ədədini göndərir. Nəticədə AX registrində 0207h olacaq. MUL d əmri d (d=3) qiymətini AL ((AL) = 7) registrinin məzmununa vurur. Nəticədə AX registrində 0015h (21d) ədədi qeyd olunur. AAM əmri nəticəni korreksiya edir. Belə ki, AX registrinin məzmunu 0201h ədədi kimi yazır. ADC AL,DL əmri DL

((DL)=2) registrinin məzmunu ilə AL ((AL) = 1) registrinin məzmununu toplayır və nəticədə kiçik mərtəbəli (7-nin 3-ə vurulmasında) 21d ədədi alınır, Beləliklə, AX registrində 0203h ədədi olur. AAA əmri (AL =3<9 olduğundan ) AL registrində düzgün yığcam olmayan BCD ədədi olduğundan, onun məzmunu yenə dəyişməyəcək.

MOV DL,AH əmri yeni köçürməni –2 ədədini DL registrində saxlayacaq. MOV hasil[BX],AL əmri hasil+1 ünvanlı xanasına 234 ədədinin ikinci mərtəbəsinə 3 ədədini göndərir. Sonra isə MOV hasil[BX],DL əmri proizv+2 ünvanlı xanaya 2 ədədini göndərir (234 ədədinin böyük mərtəbəsi).

AAM əmrini, AL registrində yeriləşən ikilik ədədi qeyri yığcam BCD ədədinə çevirmək üçün tətbiq etmək olar. Alınan qeyri yığcam BCD ədədi AX registrində nəticənin (böyük rəqəmi AH registrində, kiçik rəqəmi isə AL registrində yazılacaqdır) yerləşdiriləcək. İkilik ədəd 0 .. 99 diapozonunda olmalıdır.

Yığcam ədədlərin vurulması əmri yoxdur. Bu ədədləri vurmaq üçün onları əvvəlcə AAM əmrinin köməyi ilə qeyri yığcam formaya gətirmək lazımdır.