Raspberry Pi’ye İşletim Sistemi Yazmak Ders 2

Ders 2, ders 1 üzerinden yapılandırılacaktır. Ders 1’deki koda sahip olduğunuzu varsayıyoruz.Bu derste Led tekrarlı bir şekilde yanıp sönecektir.

Bekleme Yaptırmak

Bekletme şaşırtıcı olarak işletim sistemi geliştirmenin kullanışlı bir kısmıdır. Sık sık işletim sistemleri bekleme yapmak zorunda kalır. Bu örnekte led’in görünür ve kaybolur olmasını istiyoruz. Bu ders için basit bir bekletme işimizi görecektir. Bir sonraki ders tam manasıyla bunun üzerine eğileceğiz.

[code]

mov r2,#0x3F0000
wait1$:
sub r2,#1
cmp r2,#0
bne wait1$

[/code]

Kodu basitçe açıklayacak olursak. r2 registerına hexadecimal 3F0000 sayısı atanıyor ve sıfır olana kadar bir azaltılıyor 0 olduğunda döngüden çıkıyor.

sub burada çıkarma işlemini yapar subtract’ın kısa şeklidir. Assemblyde bu işi yapan dec komutu da vardır.

cmp, compare kelimesinin kısaltılmış şeklidir. r2 registerında bulunan sayıyı 0 ile karşılaştırır. Bu karşılaştırma işlemi yapılırken aslında çıkarma işlemi yapılır. Fakat çıkarma işleminden farklı olarak bayraklar etkilenir. Biz taşma bayrağı, zero bayrağı ve işaret bayrağını ele alalım, dallanmalar genelde bu bayraklara göre yapılır. Biz örneğimizde zero bayrağını kontrol ediyoruz. r2’den büyük bir sayıyı çıkardığımızda(cmp aslında çıkarma işlemi yapar) zero bayrağı 0, carry bayrağı 1 ve (sign) işaret bayrağı 1 olur. r2’den küçük bir sayı karşılaştırıldığında, zero bayrağı 0, carry bayrağı 0 ve işaret bayrağı da 0 değerini alır.  r2’ye eşit bir sayıyı karşılaştırdığımızda çıkarma işleminin sonucu 0 olacaktır ve zero bayrağı bu sebepten dolayı 1 olur. Sign ve Carry bayrakları ise 0 olacaktır.

bne ise branc not equal demektir. Yani eşit olmadığında dallan demektir. cmp işleminin sonucunda bayrakların nasıl değiştiğini açıklamıştım. Burada zero bayrağı kontrol edilir. Eğer zero bayrağı 0 ise wait1 etiketine dönüş yapılır. Zero bayrağı 1 olduğunda ise döngüden çıkılır.

Hepsi bu, işlemciyi uzun bir süre bu şekilde bekletmiş oluyoruz.

[code]

.section .init
.globl _start
_start:

ldr r0,=0x20200000

mov r1,#1
lsl r1,#18
str r1,[r0,#4]

mov r1,#1
lsl r1,#16
loop$:
str r1,[r0,#40]
mov r2,#0x3F0000
wait1$:
sub r2,#1
cmp r2,#0
bne wait1$
str r1,[r0,#28]
mov r2,#0x3F0000
wait2$:
sub r2,#1
cmp r2,#0
bne wait2$

b loop$

[/code]

Bu bölümün çözümü için tıklayınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.