=== Konu tarihi: 1 Nisan 2012 Paylaş Konu tarihi: 1 Nisan 2012 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ı 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. Alıntı Link to comment Share on other sites More sharing options...
Recommended Posts
Sohbete katıl
Şimdi mesajını gönderebilir ve daha sonra kayıt olabilirsin. Bir hesabın varsa, hesabınla göndermek için şimdi oturum aç.