Assembler proqramlaşdırma dili

Bölmənin korreksiya əmri

Bölmənin korreksiya əmri

Toplama, çıxma və vurma əməliyyatlarından fərqli olaraq iki qeyri yığcam BCD-ədədlərin bölünməsinin nəticəsinin korreksiyası,ədədlərin bölünməsindən əvvəl aparılmalıdır.

AAD (ASCII Adjust for Division –bölmənin ASCII kodunda göstərilməsi üçün korreksiya) əmri, korreksiyanı bölmə əməliyyatından əvvəl aparır. Bu operandsız əmr olub, AX registrində yerləşən ikirəqəmli qeyri yığcam BCD-ədədini ikilik ədədə çevirir. AAD əmri aşağıdakı əməliyyatları yerinə yetirir:

1) AX registrindəki ilkin BCD-ədədinin böyük rəqəmini (AH məzmunu) 10-a vurur;

2) (AH)+(AL) cəmini hesablayır, nəticəni (ikilik ədəd) AL registrinə yazır;

3) AH registrini sıfırlaşdırır.

Bundan sonra AX registrinin məzmununu (bölünəni), 1 baytlıq registrində və ya yaddaşda yerləşən bir BCD-ədədinə bölmək üçün, DIV əmrini tətbiq etmək olar.

Misal: 78qeyri yığcam BCD-ədədini, 5-qeyri yığcam BCD-ədədininə bölünməsi proqramına baxaq:

MASM
MODEL SMALL
.STACK 256
.DATA
b        DB 8,7      ; 78 qeyri yığcam BCD-ədədi 
c        DB 5          ; 5 qeyri yığcam BCD-ədədi   
qis     DB 0,0
qal     DB 0
.CODE
main:
        MOV AX, @DATA 
        MOV DS, AX 
        XOR AX,AX 
        MOV AL, b      ; Bu iki əmrin icrasından sonra
        MOV AH, b+1 ; AX məzmunu 0708h olacaq 
        AAD                  ; korreksiyadan sonra AX 
                                   ; məzmunu 004Eh (78d) kimi olacaq
        DIV  c                ;  bölmədən sonra qalıq AH=03h, 
                                   ;  qismət isə AL=0Fh olur
        MOV  qal, AH   ; qal xanasına   (3) qalığı yazılır 
        AAM                  ; AL –dəki 0Fh ədədi 0105h  
                                    ; çevirilərək AX-də yerləşdirilir
        MOV qis, AL    ; alınan qeyri yığcam BCD-ədəd
        MOV qis+1, AH  ; qis dəyişənində saxlanacaqdır 
        MOV AX, 4C00h
        INT 21h
        END main

AAD əmrindən, 0, ... 99 diapozonunda olan qeyri yığcamBCD-ədədi ikilik ekvivalentinə çevirmək üçün istifadə etmək olar.

Yığcam ədədlərin bölünməsi əmri yoxdur.

Qeyd. Assembler proqramlarında hesab əmrlərindən istifadə etdikdə aşağıdakı amilləri nəzərə almaq lazımdır.

- mikroprosessor hesab əməliyyatlarını aparmaq üçün kifayət qədər güclü vasitələrə malikdir. Bunun üçün onun tam və sürüşkən nöqtəli ədədlər ilə əməliyyat blokları mövcüddur. Assembler proqramlarında istifadə olunan bir çox praktiki məsələlərin həllində tam ədədlər kifayət edir. Sürüşkən ədədlərdən istifadə tələbi yarandıqda dolayısı ilə ilkin həqiqi ədədin 10-nun misilinə vurmaq və nəticənin 10-nun misilinə bölmək alqoritmindən istifadə etmək olar.

- tam ədədlər ilə əməliyyat aparan əmrləri iki tip verilənlər ilə işləyə bilir. Bunlar ikilik və ikilik- onluq (BCD - ədəd) tip rəqəmlərdir.

- ikilik verilənlər işarəli və ya işrasiz ola bilər. Ancaq mikroprosessor əslində işarəli və işrasiz verilənləri fərqləndirmir. O, yalnız bəzi bitlərin qiymətlərinin dəyişməsini bayraqların qiymətlərini tənzimləməklə elan edir. İşarəli və işarəsiz ədədlərin toplanması və çıxılması əməliyyatı, eyni qayda ilə, bir qurğu vasitəsilə aparılır.

- nəticələrin düzgünlüyünün yoxlanması və onlara aid olan bütün interpretasiyalar proqramlaşdırıcının öhdəsinə düşür. Hesablama prosesində o, EFLAGS registrinin CF və OF bayraqlarının vəziyyətinə nəzarət etməlidir.

-işarəsiz ədədlər ilə əməliyyatda CF bayrağına nəzarət etmək lazımdır. Onun 1 vəziyyətinə gətirilməsi operandın mərtəbə şəbəkəsində yerləşmədiyi haqqında siqnaldır.

-işarəli ədədlər üçün OF bayraqlarının 1 vəziyyətinə gətirilməsi, toplamanın nəticəsi verilmiş formatda işarəli ədədlər üçün mümkün qiymətlər diapazonundan kənara çıxdığını göstərir və nəticənin özü işarəni dəyişir (tərtib itir).

-hesab əməliyyatlarının icrası nəticəsində, həmçinin, PFZF və SF bayraqlarının da qiyməti tənzimlənir.

-toplama və çıxma əmrlərindən fərqli olaraq, vurma və bölmə əmrləri operandın işarəsini nəzərə almağı tələb edir.

-hesab əmrləri operandın ölçüsünün dəqiq təyin olunmasını tələb etdiyindən mikroprosessorun əmrlər sisteminə bu xarakteristikanı nəzərə alan xüsusi əmrlər daxil edilmişdir.

-ikilik verilənlərin həcmi kifayət qədər böyük, qiymətlər diapazonu isə məhdud olduğundan mikroprosessorun arxitekturasına ikilik-onluq (BCD) ədədlər ilə işləyən vasitələr daxil edilmişdir.

-ikilik-onluq (BCD) ədədlər yığcam və yığcam olmayan formada təsvir olunur.

Hesab əmrlərinin işləmə alqoritminə aid misallara aşağıdakı proqramlarda baxaq.

Misal 1, y=(z2d+a)p/c funksiyasını hesablayan proqramı nəzərdən keçirək:

;.386 prosessor modeli
MASM
MODEL SMALL
.386
.STACK 256
.DATA
z       DB –9
d       DB 3
a       DB 101
p       DB 4
c       DB 5
y       DW ?
qal    DW ?
.CODE
main:
        MOV   AX, @DATA 
        MOV   DS, AX 
        XOR    AX, AX  
        MOV   AL, z   
        IMUL   z             ;  AX –də z*z hasili = 0051h(81)
        MOVSX BX, d   ; BX registrdə d-nin qiymətini işarə 
                                     ; mərtəbəsinə görə genişləndirmək 
                                     ; (baytı sözə)     
        IMUL  AX, BX  ; nəticə AX =00F3h (81*3=243) 
        MOVSX BX, a   ; BX registrdə a-nin qiymətini işarə 
                                     ; mərtəsinə görə  genişləndirmək 
                                     ; (baytı sözə)
        ADD   AX, BX  ; nəticədə AX=0158h
                                     ;  (243+101=344)
        MOVSX BX, p
        IMUL AX, BX  ; nəticədə AX=0560h (344*4=1376)
        MOVSX BX, c
        IDIV  BX           ; qismət AX=0113h (1375/5=275) , 
                                    ; qalıq DX=1
                                   
        MOV   y, AX
        MOV  qal, DX
        MOV AX, 4C00h
        INT 21h
        END     main

Misal 2. Aşağıdakı ifadəni hesablayıb nəticəni ekrana çıxarmaq

Y=Z*D+G*P
Z=-9; D=19; G=-4;P=-3

Bu proqramda ikilik prosedurası, y-in hesablanmış qiymətini CONV2 prosedurası vasitəsi ilə ASCII kodlara çevirərək, 21H kəsilməsinin 9H funksiyası vasitəsi ilə ekranda əks etdirir. Beləliklə, məsələnin həlli proqramı aşağıdakı iki baş və alt proqram ilə yerinə yetirilir:

MASM
MODEL SMALL
.STACK 256
.DATA
STR7   DB  6 DUP(?)
STR1   DB  6 DUP(?)
D	   DB  	9
P	   DB  	-5
A        DB  	-8
Z        DB  	-9
Y1       DW 	 ?
STRL   DW   0
REZ    DW   0

.CODE
main:
        MOV   AX, @DATA 
        MOV   DS, AX 
        MOV AX,DATA	    
        MOV DS,AX	    
        MOV    AX,  0	      
        MOV   AL,Z	    
        IMUL   Z	     
        IMUL   D 	      
        MOV   Y1,  AX	  
        SUB     AX, AX
        MOV    AL, A	    
        IMUL   P            
        ADD    AX ,Y 1	   
        MOV   REZ, AX
        LEA BX,STR7
	  CALL CONV2
	  LEA DX,STR7
	  MOV AH,9
	  INT 21H
         MOV AH,4CH
	   INT 21H
CONV2	PROC
	   PUSH DI
	   PUSH SI
	   PUSH DX
	   PUSH CX
	   PUSH BX
	   SUB DI,DI
	   MOV CX,7
	   OR AX,AX
	    JNS BUFF
	    MOV DI,1
	   DEC CX
	   INC BX
	   NEG AX
BUFF:  MOV BYTE PTR[BX],' '
	   INC BX
	   LOOP BUFF
	   MOV BYTE PTR[BX],'$'
	   MOV SI,10
CONT: SUB DX,DX
	   DIV SI
	   ADD DX,'0'
	   DEC BX
	   MOV [BX],DL
	   OR AX,AX
	  JNZ CONT
	  CMP DI,1
	  JNE K1
	  DEC BX
	  MOV BYTE PTR[BX],'-'
K1:	  POP BX
	  POP CX
	  POP DX
	  POP SI
	  POP DI
	  RET
CONV2	ENDP
        END main