Assembler proqramlaşdırma dili

Sadə Assembler proqramının işlənməsi

Sadə Assembler proqramının işlənməsi

Assembler proqramı prosessorun arxitekturasını özündə əks etdirir. Başqa sözlə, assembler proqramı mikroprosessorun proqram modelinə daxil olan aparat vasitələri səviyyəsində işləyir. Proqramın alqoritminin işlənməsi, icrası, verilənlərin yaddaşda yerləşdirilməsi, məhdud sayda registrlərdən effektiv istifadə olunması, onun əməliyyat sistemi və başqa proqramlar ilə əlaqələndirilməsi və s. proqramçı tərəfindən icra olunur.

Kompüter ən aşağı səviyyədə ikilik informasiya ilə işlədiyindən, giriş-çıxış qurğuları ilə informasiya mübadiləsi ASCII simvollar kodunda aparılır. Odur ki, proqramçı mübadilə zamanı kod çevirmələrini də nəzərə almalıdır.

Aydındır ki, 0,1...9 diapazonundakı 16-lıq rəqəmlər ASCII kodunda uyğun olaraq 30h,...39h, A,...F diapazonundaki kiçik və böyük 16-lıq simvollar isə uyğun olaraq 41h,...46h və 61h,...66h kimi kodlaşdırılır.

Məsələn, onaltılıq 3 ədədinin ASCII kodu 33h ( 33h-ın ikilik təsviri- 00110011), 3 isə ikilik təsviri isə – 00000011 kimi göstərilir.

Odur ki, ASCII kodunu 16-lıq ədədə çevirmək üçün iki şərti nəzərə almaq lazımdır:

1. (ASCII kodu- 30h), ”yəni ikilik çıxma əməliyyatını aparmaq;

2. Baytın böyük tetradasını sıfırlaşdırmaq.

Deyilənləri nəzərə alaraq, iki rəqəmli 16-lıq ədədin simvola (ikilik təsvirdə) çevirilməsi məsələsinin proqramına baxaq:

 

;Prg_1.asm
     ;07Ch  onaltılıq ədədini 
     ; ikilik ekvivalentinə çevirən proqram
     ;Giriş: ilkin ikirəqəmli 16-lıq ədəd
     ; klaviaturadan daxil edilir
     ; Çıxış: çevirmənin nəticəsi 
     ;dl registrində olmalıdır
     ;***********************
data  segment para public “data” ; verilənlər seqmenti 
message   db    “ ikirəqəmli 16-lıq ədədi daxil  et $”
data      ends
         stk        segment stack 
            db 256 dup (“?”“)             ; stek seqmenti
        stk        ends
 code  segment para public “code” ; kodlar seqmentinin başlanğıcı
 main       proc               ; main posedurunun başlanğıcı
            assume cs:code, ds:data, ss:stk
            mov ax,data   ; verilənlər seqmentinin 
                                    ; ünvanı  AX-də
            mov   ds,ax             ; AX registrinin məzmununu DS registrinə göndərmək
            mov   ah, 9 
            mov   dx, offset message
            int     21h
            xor    ax,ax 
            mov   ah,1h
            int    21h      ; 21h nömrəli kəsilmənin çağrılması
            mov  dl,al        ; (al) məzmununu dl göndərmək
            sub   dl,30h     ; çıxma: (dl)=(dl)-30h
            cmp dl, 9h ;(dl) məzmununu 9h müqayisə etmək
            jle    M1           ;  əgər al<=9h onda  M1 keçid 
            sub   dl, 7h      ; çıxma: (dl)=(dl)-7h
M1:                             ; M1 nişanının təyini
    mov  cl, 4h       ; 4h-ın cl registrinə göndərmək 
    shl  dl, cl           ; (dl)məzmununu 4 mərtəbə 
                              ;sola sürüşdürülür
    int  21h              ; 21h nömrəli kəsilmənin 
    sub  al, 30h     ; çağrılması çıxma: (dl)=(dl)-30h
    cmp  al, 9h      ; (al) məzmununu 9h müqayisə 
    jle    M2       ; etmək əgər al<=9h onda  M2 keçid
    sub  al, 7h      ; çıxma: (al)=(al)-7h
    M2:             ;M2 nişanının təyini
    add  dl,al        ; toplama: (dl)= (dl)+(al)
    mov  ah, 4c ; 4c00h –ın ax regstirinə göndərilməsi
    int   21h         ;21h nğmrəli kəsilmənin çağırılması
    main endp        ; main prosedurunun sonu
    code ends        ; sode seqmentinin sonu
    end  main      ;girişi main nöqtəli proqramın sonu

 

Proqramı nəzərdən keçirsək, (burada biz əsasən Assembler proqramının strukturunu verməyi nəzərdə tuturuq) görərik ki, proqram Seqment və Ends direktivləri ilə qapanmış üç hissədən (9 və 11, 12 və 14, 15 və 44 sətirlər) ibarətdir. Əvvəldə qeyd olunduğu kimi mikroprosessor aparat vasitələri tərəfində qəbul olunan ünvandan asılı olmayan altı yaddaş sahəsi ilə işləyir:

Bunlar: kodlar, verilənlər, stek seqmenti və üç əlavə verilənlər seqmentləridir. Bu isə proqramın strukturunda yaddaşın təşkilinin xüsusiyyətlərini əks etdirdiyini göstərir.

9-11 sətrlər verilənlər, 12-14 sətrlər stek seqmentini təsvir edir. Bu 256 bayt uzunluğunda sadəcə yaddaş sahəsi və « ? » inisiallaşdırma işarəsindən ibarətdir.

15-44 sətrlərində kodlar seqmenti göstərilib. Bu seqmentdə (16)-(43) sətrlərdə bir tam prosedur təyin olunub.

17 sətrdəki assemblerin assume psevdooperatoru, seqmentlərə məxsus olan registrlərin adı (baza ünvanı üçün) haqqında məlumatı translyatora çatırır.

18-19 sətrlərdə verilənlər seqmentinin baza ünvanı ds registrinə yüklənir.

20-22 sətrlərdə “messaqe”- dəki məlumat ekrana sıxarılır. Bu “iki onaltılıq rəqəm daxil edin ” məlumatıdir.

23 sətr AX registrini təmizləyərək işə hazırlayır.

Bu əməliyyatdan sonra ax=0000 0000 0000 0000 olacaq.

24-25 sətrlər klaviaturadan simvolları daxil etmək üçün əməliyyat sisteminin vasitələrinə müraciət edir. Daxil edilən simvolları əməliyyat sistemi AL registrində yerləşdirir. Misal üçün, klaviaturadan “iki onaltılıq ədədi daxil edin “ məlumatına:

5c cavabını vermək olar. Yəni klaviaturadan 5c ədədini daxil etmək lazımdır.

25 sətrdəki əmr icra olunduqda, yəni ASCII kodunda 5 daxil edildikdən sonra AX registrinin məzmunu ax= 0000 0000 0011 0101 kimi olacaq.

26 sətrdəki əmr, növbəti elementi daxil etmək üçün AL registrinin məzmunu DL registrinə göndərir. Çünki, daxil edilən hər bir simvol əməliyyat sistemi tərəfindən mütləq AL registrinə yazılmalıdır.

26-cı sətr icra olunduqdan sonra DX registrinin məzmunu:

DX=0000 0000 0011 0101 olacaq.

27 sətrdəki əmr 5 simvoldan 30h çıxma yolu ilə onu ikilik ekvivalentinə çevirir. nəticədə DL registrində 5-ədədinin ikilik qiyməti alınıcaq:

DX=0000 0000 0000 0101

28-29 sətrləri, DL registrindəki ikilik qiymətin, korreksiya edilməsinə ehtiyac olduğunu araşdırır. Əgər bu qiymət 0,...9 diapazonundadırsa, onda korreksiya emək lazım deyil. Yəni, ikilik ekvivalentinə düzgün çevirilib.

Əgər DL registrindəki qiymət 9-dan böyükdürsə, onda çevriləcək ədəd A, B, C, D, E, F (burada kiçik hərflərin çevrilməsinə baxılmayıb) simvollardan birinə çevirilməlidir. Birinci halda 5 rəqəmi 0,...9 diapazonunda olduğundan 29-cu sətr idarəni M1 nişanlı sətrə göndərir. Hər bir 16-lıq rəqəm bir tetrada da yerləşdiyindən iki belə rəqəm (bizim hal üçün iki 16-lıq ədəd olduğundan) elə yerləşdirmək lazımdır ki, böyük mərtəbələrin qiyməti dəyişməsin. Bu məqsədlə 32-33 sətrləri DL registrinin qiymətini 4 mərtəbə sola sürüşdürür və beləliklə kiçik 16-lıq ədəd üçün kiçik tetrada boşaldılır.

34 sətri ikinci 16-lıq rəqəmi (onun ASCII kodu 63-dır) AL registrinə daxil edir.

AX= 0000 0000 0100 0011

35-37 sətrlər daxil edilən ikinci 16-lıq rəqəmin 0,...9 diapazonuna düşməsini yoxlayır. Bizim baxdığımız halda «c» 16-lıq simvolu bu diapazona düşmür. Onun üçün də onun düzgün ikilik ekvivalentini almaq məqsədinə əlavə korreksiya tələb olunur. Bunu 38-ci sətr yerinə yetirir. 35-ci sətrin icrasında sonra AL registirinin məzmunu:

AX= 0000 0000 0001 0011 olacaq.

AL registrinə 13h ədədi əvəzinə 0CH (16-lıq ədədinin yazılış qaydasına görə) yazılmalıdır. 0CH simvolu 0,...9 diapazonuna düşmədiyi üçün idarə 38-ci sətrə göndərilir. Burada çıxma əmrinin nəticəsində AL registrində, düzgün 0CH

(( AL ) =0CH ) qiyməti alınır.

Yəni, 0CH simvolu daxil edildikdə (AL) = 0100 0011, 38-ci sətrin icrasından sonra isə (AL)=(AL) - 37 = 0100 0011 - 0011 0111=0000 1100 alınar. Bu da 0CH simvolunun düzgün ikilik ekvivalentidir. Deyilənlərə uyğun olaraq AX məzmunu:

AX= 0000 0000 0000 1100

40-cı sətrdə isə DX registrində iki rəqəmli 16-lıq ədədin ikilik ekvivalentini almaq üçün aşağıdakı əməliyyat yerinə yetirilir:

DX= 0000 0000 0101 0000 ; 5 simvolunun

; sürüşdürülmüş ikilik qiyməti

+

AX= 0000 0000 0000 1100

------------------------------------

DX= 0000 0000 0101 1100

5 C

Beləliklə 05CH onaltılıq simvolunun düzgün ikilik ekvivalenti (DL)= 05CH alınar.

41-42 sətrlər proqramın sona çatdığını göstərir və idarəni əməliyyat sisteminə ötürür.

Assembler proqramının strukturu və onun tərtib edilməsinə aid daha geniş məlumat sonrakı materiallarda veriləcəkdir. Burada bizim misala aid olan qaydalarla tanış olmaq və assembler dilindəki proqramın, maşın dilinin simvolik təsviri olunduğunu göstərməkdir.