Gömülü Sistemler - Talimatlar
Program akışı, bir kontrol transfer komutu yürütülmediği sürece, bir komuttan diğerine sıralı bir şekilde ilerler. Montaj dilinde çeşitli kontrol aktarım talimatı türleri, koşullu veya koşulsuz atlamaları ve çağrı talimatlarını içerir.
Döngü ve Atlama Talimatları
8051'de döngü
Bir dizi talimatın belirli sayıda tekrarlanmasına loop. Bir talimatDJNZ reg, labelDöngü işlemi gerçekleştirmek için kullanılır. Bu komutta, bir kayıt 1 azaltılır; sıfır değilse, 8051 etiket tarafından belirtilen hedef adrese atlar.
Kayıt, döngünün başlangıcından önceki tekrar sayısı için sayaç ile yüklenir. Bu talimatta, hem yazmaç azaltma hem de atlama kararı tek bir talimatta birleştirilmiştir. Kayıtlar R0 – R7'den herhangi biri olabilir. Sayaç ayrıca bir RAM konumu olabilir.
Misal
Multiply 25 by 10 using the technique of repeated addition.
Solution- Çarpma, çarpan kadar çok sayıda çarpan ve tekrar tekrar eklenerek elde edilebilir. Örneğin,
25 * 10 = 250 (FAH)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - Talimatla döngüleme eylemi DJNZ Reg labelyalnızca 256 yineleme ile sınırlıdır. Koşullu bir atlama yapılmazsa, atlamayı izleyen talimat yürütülür.
Bir Döngü İçinde Döngü
Başka bir döngü içinde bir döngü kullandığımızda, buna a nested loop. Maksimum sayı 256 ile sınırlı olduğunda sayımı tutmak için iki yazmaç kullanılır. Bu nedenle, eylemi 256'dan daha fazla tekrarlamak için bu yöntemi kullanırız.
Example
Bir program yaz -
- Akümülatörü 55H değeriyle yükleyin.
- ACC'yi 700 kez tamamlayın.
Solution- 700 255'ten büyük olduğundan (herhangi bir kaydın maksimum kapasitesi), sayımı tutmak için iki kayıt kullanılır. Aşağıdaki kod, sayı için iki yazmaç, R2 ve R3'ün nasıl kullanılacağını gösterir.
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
Diğer Koşullu Atlamalar
Aşağıdaki tablo 8051'de kullanılan koşullu sıçramaları listeler -
Talimat | Aksiyon |
---|---|
JZ | A = 0 ise atla |
JNZ | A ≠ 0 ise atla |
DJNZ | Kayıt ≠ 0 ise Azalt ve Atla |
CJNE A, veri | A ≠ verisi ise atla |
CJNE reg, #data | Bayt ≠ veri ise atla |
JC | CY = 1 ise atla |
JNC | CY ≠ 1 ise zıpla |
JB | Bit = 1 ise atla |
JNB | Bit = 0 ise atla |
JBC | Bit = 1 ise atla ve biti temizle |
JZ (jump if A = 0)- Bu talimatta akümülatörün içeriği kontrol edilir. Sıfırsa, 8051 hedef adrese atlar. JZ komutu sadece akümülatör için kullanılabilir, başka herhangi bir kayıt için geçerli değildir.
JNZ (jump if A is not equal to 0)- Bu talimatta akümülatör içeriğinin sıfır olmadığına bakılır. Sıfır değilse, 8051 hedef adrese atlar.
JNC (Jump if no carry, jumps if CY = 0)- Bayrak (veya PSW) kaydındaki Taşıma bayrağı biti, "JNC etiketi" atlanıp atlanmayacağına karar vermek için kullanılır. CPU, yükseltilip yükseltilmediğini görmek için taşıma bayrağına bakar (CY = 1). Yükseltilmezse, CPU etiket adresinden talimatları almaya ve yürütmeye başlar. CY = 1 ise, atlamaz ama JNC'nin altındaki bir sonraki talimatı yürütür.
JC (Jump if carry, jumps if CY = 1) - CY = 1 ise, hedef adrese atlar.
JB (jump if bit is high)
JNB (jump if bit is low)
Note - Tüm koşullu sıçramaların kısa atlamalar olduğu unutulmamalıdır, yani hedefin adresi program sayacının içeriğinin –128 ila +127 bayt aralığında olmalıdır.
Koşulsuz Atlama Talimatları
8051'de iki koşulsuz sıçrama var -
LJMP (long jump)- LJMP, ilk baytın işlem kodunu ve ikinci ve üçüncü baytların hedef konumun 16 bitlik adresini temsil ettiği 3 baytlık bir talimattır. 2 baytlık hedef adres, 0000'den FFFFH'ye herhangi bir bellek konumuna atlamaya izin vermek içindir.
SJMP (short jump)- İlk baytın işlem kodu ve ikinci baytın hedef konumun göreceli adresi olduğu 2 baytlık bir talimattır. Göreli adres, ileri ve geri atlamalara bölünmüş 00H'den FFH'ye kadar değişir; yani, mevcut PC'nin (program sayacı) adresine göre –128 ila +127 bayt bellek içinde. İleri atlama durumunda, hedef adres mevcut bilgisayardan 127 baytlık bir alan içinde olabilir. Geriye doğru atlama durumunda, hedef adres mevcut bilgisayardan –128 bayt dahilinde olabilir.
Kısa Atlama Adresini Hesaplama
Tüm koşullu atlamalar (JNC, JZ ve DJNZ), 2 baytlık talimatlar oldukları için kısa atlamalardır. Bu talimatlarda, ilk bayt işlem kodunu ve ikinci bayt göreceli adresi temsil eder. Hedef adres her zaman program sayacının değerine bağlıdır. Hedef adresi hesaplamak için, ikinci bayt, atlamanın hemen altına komutun PC'sine eklenir. Aşağıda verilen programa bir göz atın -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
Geri Atlama Hedef Adres Hesaplama
İleri sıçrama durumunda, yer değiştirme değeri 0 ila 127 (onaltılık olarak 00 ila 7F) arasında pozitif bir sayıdır. Ancak, geriye doğru bir sıçrama için yer değiştirme, 0 ila –128 arasında negatif bir değerdir.
ÇAĞRI Talimatları
CALL, bir alt yordamı veya yöntemi çağırmak için kullanılır. Alt rutinler, sık sık gerçekleştirilmesi gereken işlemleri veya görevleri gerçekleştirmek için kullanılır. Bu, bir programı daha yapılandırılmış hale getirir ve bellek alanından tasarruf sağlar. İki talimat vardır - LCALL ve ACALL.
LCALL (Uzun Çağrı)
LCALL, birinci baytın işlem kodunu temsil ettiği ve ikinci ve üçüncü baytların hedef alt yordamın adresini sağlamak için kullanıldığı 3 baytlık bir talimattır. LCALL, 8051'in 64K bayt adres alanı içinde bulunan alt rutinleri çağırmak için kullanılabilir.
Çağrılan alt yordamın yürütülmesinden sonra noktaya başarılı bir geri dönüş yapmak için, CPU komutun adresini yığındaki LCALL'un hemen altına kaydeder. Böylece, bir alt yordam çağrıldığında, denetim bu alt yordama aktarılır ve işlemci, PC'yi (program sayacı) yığına kaydeder ve yeni konumdan talimatları almaya başlar. RET (dönüş) talimatı, alt programın yürütülmesi tamamlandıktan sonra kontrolü tekrar arayana aktarır. Her alt rutin son talimat olarak RET'i kullanır.
ACALL (Mutlak Çağrı)
ACALL, 3 bayt olan LCALL'un aksine 2 baytlık bir talimattır. Alt rutinin hedef adresi 2K bayt içinde olmalıdır çünkü adres için 2 baytın sadece 11 biti kullanılır. ACALL ve LCALL arasındaki fark, LCALL için hedef adresin 8051'in 64K baytlık adres alanı içinde herhangi bir yerde olabilirken, CALL'un hedef adresinin 2K baytlık bir aralıkta olmasıdır.