Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

Programming 8086 – Kısım II Program Akı ş ı ve Döngüler 1 Mikroişlemciler.

Benzer bir sunumlar


... konulu sunumlar: "Programming 8086 – Kısım II Program Akı ş ı ve Döngüler 1 Mikroişlemciler."— Sunum transkripti:

1 Programming 8086 – Kısım II Program Akı ş ı ve Döngüler 1 Mikroişlemciler

2 İçerik 2  Program Akı ş Kontrolü  Ko ş ullu komutlar  Döngüler

3 Program Akış Kontrolü 3  Program akı ş ını kontrol etmek çok önemlidir. Bu kısım, programın, olu ş abilecek farklı durumlara göre karar verebilmesini sa ğ lar.  C programlama dilindeki if durumunu hatırlayınız.  Assembly dilinde, akı ş kontrolü, Jump komutları ile sa ğ lanır.

4 Şartsız Atlamalar (Jump) 4  Programda, kontrolü ba ş ka bir satıra atlatan temel komut JMP komutudur: JMP etiket  Programınızda etiket tanımlamak için, adını yazın ve ":" ekleyin.  Bir etiket, herhangi bir karakter kombinasyonu olabilir. Ancak bir rakam ile ba ş layamaz. Örnekler: etiket1: etiket2: a:

5 Etiketler hakkında 5  Etiketler, komut ile aynı satırda olabilece ğ i gibi, ayrı bir satırda da olabilir.  Örnekler: x1: MOV AX, 1 x2: MOV AX, 2

6 JMP Örneği 6 ORG 100H MOV AX, 5 ; AX’e 5 yaz. MOV BX, 2 ; BX’e 2 yaz. JMP calc ; 'calc‘e git. back: JMP stop ; 'stop‘a git. calc: ADD AX, BX ; AX’e BX ilave et. JMP back ; 'back‘e git. stop: RET ; işletim sistemine dön.

7 JMP detayları 7  Üç farklı JMP komutu çe ş idi bulunur: 1. Short Jump – kısa atlama 2. Near Jump – yakın atlama 3. Far Jump – uzak atlama  Short ve near atlamalar segment içi atlamalardır. far atlamalar ise segmentler arası atlamalardır.

8 Jump Tipleri 8

9 Short Jump – Kısa atlama 9  Jump adresi, opcode’da kaydedilmez.  Opcode’dan hemen sonra bir atlama mesafesi belirtilir.  Short jump’lara göreceli jump’lar da denilir.  Atlama mesafesi, -128 ile +127 aralı ğ ındadır.

10 Short Jump Gösterimi 10  Atlama mesafesi, IP (Instruction Pointer)a ilave edilir. Bu sayede, mevcut code segment’inde bir jump adresi olu ş turulur. • Bir sonraki komutta, olu ş turulan bu yeni adrese gidilir.

11 Short Jump Örneği DB XOR BX, BX 0002 BB 0001 BASLA: MOV AX, C3 ADD AX, BX 0007 EB 17 JMP SHORT SONRAKI B D8 SONRAKI: MOV BX, AX 0022 EB DE JMP BASLA Not: SHORT ekini kullanmanıza da gerek yoktur. Çünkü, compiler, hangi jump komutunun uygun oldu ğ unu seçer.

12 Near Jump – Yakın atlama 12  Yakın atlama da kısa atlamaya benzer. Tek fark, atlama mesafesinin daha uzun olmasıdır.  Yakın atlamada, mevcut code segment’inde ±32K bayt lık bir mesafeye atlama yapılabilir.  Yakın atlama da göreceli bir atlamadır.

13 Near Jump Örneği DB XOR BX, BX 0002 BB 0001 BASLA: MOV AX, C3 ADD AX, BX 0007 E9 F601 JMP SONRAKI B D8 SONRAKI: MOV BX, AX 0202 E9 FDFD JMP BASLA Not: Atlama mesafesi olarak F601 belirtilmi ş tir. Gerçek atlama mesafesi ise 01F6’dır. Unutmayın, yüksek bayt, ikinci bayt’a yazılır (little endian).

14 Far Jump – Uzak atlama 14  Uzak atlama komutunda, atlamanın yapılaca ğ ı yeni bir segment ve offset adresi alınır.  Uzak atlama komutu bazen FAR PTR ile gösterilir.  Uzak atlamayı elde etmenin bir ba ş ka yolu da etiketi, uzak etiket olarak tanımlamaktır. Bir etiketin uzak olarak i ş aretlenmesi için, mevcut code segment’inde veya prosedüründe yer almaması gereklidir. Compiler, uzak etiket tanımlamasını otomatik olarak yapar.

15 Şartlı atlamalar 15  JMP komutunda oldu ğ u gibi ko ş ulsuz bir atlama yapılmaz. Bu komutlarda, belli bir durum oldu ğ unda atlama yapılır.  Ş artlı atlamalar, her zaman kısa atlamalardır.  Bu komutlar, üç gruba ayrılabilir:  Birinci grup, tek bir bayra ğ ı kontrol eder.  İ kinci grup, sayıları yönlü olarak kontrol eder.  Üçüncü grup, sayıları yönsüz olarak kontrol eder.

16 Genel Yapı 16  Ş artlı atlama komutlarının genel yapısı ş u ş ekildedir: Örnek: JC etiket1  E ğ er test edilen durum gerçekle ş mi ş ise, etiket’e atlama yapılır.  E ğ er test edilen durum gerçekle ş memi ş ise, bir sonraki komut çalı ş tırılır.

17 Tek bir bayrağı kontrol eden atlama komutları 17 KomutTanımlamaDurumKar ş ıtı JZ, JESıfır (e ş it) - Jump if Zero (Equal)Z = 1JNZ, JNE JC, JB, JNAECarry (küçük; e ş itten büyük de ğ il) - Jump if Carry (Below, Not Above Equal) C = 1JNC, JNB, JAE JSYönlü - Jump if SignS = 1JNS JOOverflow - Jump if OverflowO = 1JNO JPE, JPÇift parity - Jump if Parity EvenP = 1JPO, JNP JNZ, JNEJump if Not Zero (Not Equal) (sıfır de ğ il ise)Z = 0JZ, JE JNC, JNB, JAE Jump if Not Carry (küçük de ğ il; e ş itten büyük - Not Below, Above Equal) C = 0JC, JB, JNAE JNSYönlü de ğ il - Jump if Not SignS = 0JS JNOOverflow de ğ il - Jump if Not OverflowO = 0JO JPO, JNPTek parity - Jump if Parity Odd (No Parity)P = 0JPE, JP

18 Yönlü sayılar için atlama komutları 18 InstructionDescription Conditio n Opposite JE, JZ E ş it is e - Jump if Equal (=) Sıfır ise - Jump if Zero Z = 1JNE, JNZ E ş it de ğ il ise - Jump if Not Equal (≠) Sıfır de ğ il ise - Jump if Not Zero Z = 0JE, JZ JG, JNLE Büyük ise - Jump if Greater (>) Küçük veya e ş it de ğ il ise - Jump if Not Less or Equal (not <=) Z = 0 and S = O JNG, JLE JL, JNGE Küçük ise - Jump if Less (<) Büyük veya e ş it de ğ il ise - Jump if Not Greater or Equal S ≠ OJNL, JGE JGE, JNL Büyük veya e ş it ise - Jump if Greater or Equal (>=) Küçük de ğ il ise - Jump if Not Less S = OJNGE, JL JLE, JNG Küçük veya e ş it ise - Jump if Less or Equal (<=) Büyük de ğ il ise - Jump if Not Greater Z = 1 or S ≠ O JNLE, JG

19 Yönsüz sayılar için atlama komutları 19 InstructionDescription Conditio n Opposite JE, JZ E ş it ise - Jump if Equal (=) Sıfır ise - Jump if Zero Z = 1JNE, JNZ E ş it de ğ il ise - Jump if Not Equal (≠) Sıfır de ğ il ise - Jump if Not Zero Z = 0JE, JZ JA, JNBE Büyük ise - Jump if Above (>) Küçük veya e ş it de ğ il ise - Jump if Not Below or Equal C = 0 and Z = O JNA, JBE JBE, JNA Küçük veya e ş it ise - Jump if Below or Equal (<=) Büyük de ğ il ise - Jump if Not Above C = 1 or Z = 1 JNBE, JA JB, JNAE, JC Küçük ise - Jump if Below (<) Büyük veya e ş it de ğ il ise - Jump if Not Above or Equal Carry ise - Jump if Carry C = 1 JNB, JAE, JNC JAE, JNB, JNC Büyük veya e ş it ise - Jump if Above or Equal (>=) Küçük de ğ il ise - Jump if Not Below Carry de ğ il ise - Jump if Not Carry C = 0JB, JNAE, JC

20 Yönlü veya yönsüz? 20  Bir kar ş ıla ş tırmadaki sayılar, yönlü veya yönsüz olabilir.  Yönlü sayılar kar ş ıla ş tırıldı ğ ında, “greater then” ve “less then” gibi terimlerini içeren komutları kullanın.  Yönsüz sayılar kar ş ıla ş tırıldı ğ ında ise, “above” ve “below” gibi terimleri içeren komutları kullanın.

21 Koşullu atlama örneği 21 ORG 100H MOV AL, 25 ; AL’ye 25 değerini ata. MOV BL, 10 ; BL’ye 10 değerini ata. CMP AL, BL ; compare (karşılaştır) AL - BL. JE equal ; AL = BL (Z = 1) ise atla. MOV CX, 1 ; Eğer buraya gelmiş ise AL<>BL JMP stop ; CX’i set et, ve stop’a atla. equal: ; Eğer buraya gelmiş ise, MOV CX, 0 ; AL = BL’dir, CX’i temizle. stop: RET ; Her durumda buraya gel.

22 Döngüler 22 KomutOperasyon ve atlama ko ş uluKar ş ıtı LOOPDecrease CX, jump to label if CX not zeroDEC CX and JCXZ LOOPEDecrease CX, jump to label if CX not zero and equal (Z = 1) LOOPNE Decrease CX, jump to label if CX not zero and not equal (Z = 0) LOOPE LOOPNZDecrease CX, jump to label if CX not zero and Z = 0 LOOPZ Decrease CX, jump to label if CX not zero and Z = 1 LOOPNZ JCXZJump to label if CX is zeroOR CX, CX and JNZ

23 Döngü örneği : C Kodu 23  İ ki array’in içeriklerini toplayan ve sonucu ba ş ka bir array’de saklayan bir program yazınız. short arr1[100]; short arr2[100]; int count = 100; int ndx = 0; while (count > 0) { arr2[ndx] = arr1[ndx] + arr2[ndx]; ndx++; count--; }

24 Döngü örneği: Assembly Kodu 24 org 100h mov cx, 100 ; Bloklardaki eleman sayısı mov bx, 0 ; index’i başlat L1: mov ax, BLOCK1[bx];BLOCK1’deki sıradaki sayıyı al Add ax,BLOCK2[bx];BLOCK2’deki sıradaki sayıyı ekle mov BLOCK2[bx], ax ; sonucu sakla add bx, 2 ; Bir sonraki elemana geç loop L1 Ret BLOCK1 DW 100 DUP (1) BLOCK2 DW 100 DUP (2)

25 Başka bir çözüm 25 org 100h mov cx, 100 ; Bloklardaki eleman sayısı mov SI, offset BLOCK1 mov DI, offset BLOCK2 L1: mov ax, [SI] ; BLOCK1’deki sıradaki sayıyı oku add ax, [DI] ; BLOCK2’deki sıradaki sayıyı ekle mov [DI], ax ; Sonucu sakla add SI, 2 ; Bir sonraki elemana geç add DI, 2 loop L1 Ret BLOCK1 DW 100 DUP (1) BLOCK2 DW 100 DUP (2)

26 Başka bir çözüm daha 26 ORG 100h MOV CX, 100 ; bloklardaki eleman sayısı MOV SI, offset BLOCK1 MOV DI, offset BLOCK2 L1: LODSW ; Kaynağı AX’e oku ADD AX, [DI] ; BLOCK2’deki sıradaki sayıyı ekle STOSW ; sonucu hedefte sakla. LOOP L1 RET BLOCK1 DW 100 DUP (1) BLOCK2 DW 100 DUP (2)

27 İçiçe Döngüler 27  Döngüler, temel olarak atlamalar gibidirler. Döngüleri, döngü komutlarını kullanmadan, sadece atlama komutlarını kullanarak da yapmak mümkündür.  Tüm döngü komutları, CX registerini kullanarak a ş amaları sayar. Bildi ğ iniz üzere CX register’ı 16 bit’tir ve tutabilece ğ i en büyük sayı veya FFFFh’dir  Ancak, bir atlamaları akıllıca kullanarak * * Satırlık döngüler yazmak mümkündür.  CX register’ının orijinal de ğ eri PUSH CX komutu ile saklanır. İ ç döngü bitti ğ inde ise POP CX komutu ile alınır.

28 İçiçe döngü örneği 28 ORG 100H MOV BX, 0 ; total step counter. MOV CX, 5 k1: INC BX ; any other instructions PUSH CX MOV CX, 5 k2: INC BX ; any other instructions PUSH CX MOV CX, 5 k3: ADD BX, 1 ; any other instructions LOOP k3 POP CX LOOP k2 ; internal loop. POP CX LOOP k1 ; external loop. RET

29 Limitler 29  JMP sadece kod sekmanında bir alana atlama yapabilir.  Ko ş ullu atlamalar ise sadece 127 bayt ileri veya 128 bayt geriye olabilir.  Ço ğ u komutların üç veya daha fazla bayt olarak assemble edildi ğ ine dikkat ediniz.  Bu sınırlama, basit bir yol ile a ş ılabilir.

30 Örnek 30 ORG 100H MOV AL, 5 MOV BL, 5 CMP AL, BL ; JE equal ; unable to jump! JNE not_equal JMP equal not_equal: ADD BL, AL SUB AL, 10 XOR AL, BL JMP skip_data db 256 dup(0) ; 256 bytes skip_data: ; any other instructions here JMP stop equal: ; any other instructions here stop: RET


"Programming 8086 – Kısım II Program Akı ş ı ve Döngüler 1 Mikroişlemciler." indir ppt

Benzer bir sunumlar


Google Reklamları