Mikroilemciler Programming 8086 Ksm II Program Ak ve

  • Slides: 31
Download presentation
Mikroişlemciler Programming 8086 – Kısım II Program Akışı ve Döngüler 1

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

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

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

Program Akış Kontrolü Program akışını kontrol etmek çok önemlidir. Bu kısım, programın, oluşabilecek farklı

Program Akış Kontrolü 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. 3

Şartsız Atlamalar (Jump) Programda, kontrolü başka bir satıra atlatan temel komut JMP komutudur: JMP

Şartsız Atlamalar (Jump) 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: etiket 1: etiket 2: a: 4

Etiketler hakkında Etiketler, komut ile aynı satırda olabileceği gibi, ayrı bir satırda da olabilir.

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

JMP Örneği ORG 100 H MOV AX, 5 MOV BX, 2 JMP calc back:

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

JMP detayları Üç farklı JMP komutu çeşidi bulunur: 1. 2. 3. Short Jump –

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

Jump Tipleri 8

Jump Tipleri 8

Short Jump – Kısa atlama Jump adresi, opcode’da kaydedilmez. Opcode’dan hemen sonra bir atlama

Short Jump – Kısa atlama 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. 9

Short Jump Gösterimi Atlama mesafesi, IP (Instruction Pointer)a ilave edilir. Bu sayede, mevcut code

Short Jump Gösterimi 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. 10

Short Jump Örneği 0000 0002 0005 0007. . . 0020 0022 33 BB 03

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

Near Jump – Yakın atlama da kısa atlamaya benzer. Tek fark, atlama mesafesinin daha

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

Near Jump Örneği 0000 0002 0005 0007. . . 0200 0202 33 BB 03

Near Jump Örneği 0000 0002 0005 0007. . . 0200 0202 33 BB 03 E 9 DB 0001 C 3 F 601 8 B D 8 E 9 FDFD XOR BASLA: MOV ADD JMP BX, BX AX, 1 AX, BX SONRAKI: MOV BX, AX JMP BASLA Not: Atlama mesafesi olarak F 601 belirtilmiştir. Gerçek atlama mesafesi ise 01 F 6’dır. Unutmayın, yüksek bayt, ikinci bayt’a yazılır (little endian). 13

Far Jump – Uzak atlama komutunda, atlamanın yapılacağı yeni bir segment ve offset adresi

Far Jump – 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. 14

Şartlı atlamalar JMP komutunda olduğu gibi koşulsuz bir atlama yapılmaz. Bu komutlarda, belli bir

Şartlı atlamalar 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. 15

Genel Yapı Şartlı atlama komutlarının genel yapısı şu şekildedir: <Şartlı atlama komutu> <etiket> Örnek:

Genel Yapı Şartlı atlama komutlarının genel yapısı şu şekildedir: <Şartlı atlama komutu> <etiket> Örnek: JC etiket 1 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. 16

Tek bir bayrağı kontrol eden atlama komutları 17 Komut Tanımlama Durum Karşıtı JZ, JE

Tek bir bayrağı kontrol eden atlama komutları 17 Komut Tanımlama Durum Karşıtı JZ, JE Sıfır (eşit) - Jump if Zero (Equal) Z=1 JNZ, JNE JC, JB, JNAE Carry (küçük; eşitten büyük değil) - Jump C = 1 if Carry (Below, Not Above Equal) JNC, JNB, JAE JS Yönlü - Jump if Sign S=1 JNS JO Overflow - Jump if Overflow O=1 JNO JPE, JP Çift parity - Jump if Parity Even P=1 JPO, JNP JNZ, JNE Jump if Not Zero (Not Equal) (sıfır değil ise) Z=0 JZ, JE JNC, JNB, JAE Jump if Not Carry (küçük değil; eşitten büyük - Not Below, Above Equal) C=0 JC, JB, JNAE JNS Yönlü değil - Jump if Not Sign S=0 JS JNO Overflow değil - Jump if Not Overflow O=0 JO JPO, JNP Tek parity - Jump if Parity Odd (No Parity) P=0 JPE, JP

Yönlü sayılar için atlama komutları 18 Conditio Opposite n Instruction Description JE, JZ Eşit

Yönlü sayılar için atlama komutları 18 Conditio Opposite n Instruction Description JE, JZ Eşit is e - Jump if Equal (=) Sıfır ise - Jump if Zero Z=1 JNE, JNZ Eşit değil ise - Jump if Not Equal (≠) Sıfır değil ise - Jump if Not Zero Z=0 JE, 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≠O JNL, JGE, JNL Büyük veya eşit ise - Jump if Greater or Equal (>=) Küçük değil ise - Jump if Not Less S=O JNGE, 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

Yönsüz sayılar için atlama komutları 19 Instructio n Description JE, JZ Eşit ise -

Yönsüz sayılar için atlama komutları 19 Instructio n Description JE, JZ Eşit ise - Jump if Equal (=) Sıfır ise - Jump if Zero Z=1 JNE, JNZ Eşit değil ise - Jump if Not Equal (≠) Sıfır değil ise - Jump if Not Zero Z=0 JE, 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, 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, Büyük veya eşit ise - Jump if Above or Equal (>=) Conditi Opposite on C=0 JB, JNAE,

Öğrnek jnc a jnb a jae a mov ax, 4 a: mov ax, 5

Öğrnek jnc a jnb a jae a mov ax, 4 a: mov ax, 5 ret 20

Yönlü veya yönsüz? 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

Yönlü veya yönsüz? 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 ORG 100 H MOV AL, 25 MOV BL, 10 CMP AL,

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

Döngüler 23 Komut Operasyon ve atlama koşulu Karşıtı LOOP Decrease CX, jump to label

Döngüler 23 Komut Operasyon ve atlama koşulu Karşıtı LOOP Decrease CX, jump to label if CX not zero DEC CX and JCXZ LOOPE Decrease 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 LOOPNZ Decrease 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 JCXZ Jump to label if CX is zero OR CX, CX and JNZ

Döngü örneği : C Kodu İki array’in içeriklerini toplayan ve sonucu başka bir array’de

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

Döngü örneği: Assembly Kodu org 100 h mov cx, 100 ; Bloklardaki eleman sayısı

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

Başka bir çözüm org 100 h mov cx, 100 ; Bloklardaki eleman sayısı mov

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

Öğrnek 3 org 100 h jmp start vec 1 db 1, 2, 5, 6

Öğrnek 3 org 100 h jmp start vec 1 db 1, 2, 5, 6 vec 2 db 3, 5, 6, 1 vec 3 db ? , ? , ? start: lea si, vec 1 lea bx, vec 2 lea di, vec 3 mov cx, 4 sum: 28 mov al, [si] add al, [bx] mov [di], al inc si inc bx inc di loop sum ret

İçiçe Döngüler, temel olarak atlamalar gibidirler. Döngüleri, 29 döngü komutlarını kullanmadan, sadece atlama komutlarını

İçiçe Döngüler, temel olarak atlamalar gibidirler. Döngüleri, 29 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ı 65535 veya FFFFh’dir Ancak, bir atlamaları akıllıca kullanarak 65535 * 65535. . 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.

İçiçe döngü örneği ORG 100 H MOV BX, 0 ; total step counter. MOV

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

Limitler JMP sadece kod sekmanında bir alana atlama yapabilir. Koşullu atlamalar ise sadece 127

Limitler 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. 31

Örnek 32 ORG 100 H MOV AL, 5 MOV BL, 5 CMP AL, BL

Örnek 32 ORG 100 H 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