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.