03 : ARM64 Assembly Başlangıç
İlk Örneğimiz
- Örneklerimizi derlemek için "GNU Assembler" ve "GNU Linker" uygulamalarını kullanacağız.
- Eğer Intel masaüstü bilgisayarınızdan aynı işlemleri yapmak isterseniz "gcc-aarch64-linux-gnu" isimli paketi kurun.
- Aşağıdaki kaynak kodu test01.s ismiyle kaydedin.
- "as test01.s -o test01.o" komutu ile derleyin.
- "ld -s test01.0 -o test01" komutu ile çalıştırılabilir dosyayı oluşturun.
- "./test01" şeklinde çalıştırın. Ekrana kaynak kodun içinde belirtilen mesaj basılacak ve uygulama sonlanacak.
.section .rodata // Sadece okunan (üstüne yazılamayan) verilere ait bellek bloğu
txt01: .ascii "Merhaba Dunya :)\n" // Mesaj metni
.section .text // Programın çalıştırılabilir olan bölümünün verisini tutan blok
.global _start
_start:
mov x0, 0 // x0 : çıktının nereye gönderileceği (0 : standart çıktı)
ldr x1, =txt01 // x1 : metnin başlangıç adresi
mov x2, 17 // x2 : metnin uzunluğu
mov x8, 64 // x8 : sistem çağrı numarası (64 : write)
svc 0 // sistem çağrısı
mov x0, 0 // x0 : çıkış kodu
mov x8, 93 // x8 : sistem çağrı numarası (93 : exit)
svc 0 // sistem çağrısı
Bazı Detaylar
- Sistem çağrı numaralarına kernel kaynak kodunuzun içindeki unistd.h isimli dosyadan erişebilirsiniz.
- Sistem çağrıları ile ilgili dökümantasyona http://man7.org/linux/man-pages/man2/intro.2.html adresinden erişebilirisiniz.
- Sistem çağrı numarası x8 saklacına, gerekli parametreler ise sırasıyla x0 dan x5'e kadar olan saklaçlara atanmalıdır.
- Sistem çağrısı sonrası bir dönüş değeri varsa x0 saklacına atanır.
- Sistem çağrıları sonrasında saklaçlarınızın içeriği korunur. (En son hali neyse onu bulursunuz)
İkinci Örneğimiz
- Bu örneğimizde ise x0 saklacının içeriğini 16'lık sayı sisteminde ekrana basan bir uygulamanın kaynak kodunu görmektesiniz.
- 16'lık sayı sistemine dönüşüm ile ilgili kısım çok basit olarak geliştirildi. (Dilerseniz daha iyi çalışan bir kod parçası geliştirebilirsiniz)
.section .rodata // Sadece okunan (üstüne yazılamayan) verilere ait bellek bloğu
txt01: .ascii "0123456789ABCDEF" // 16'lık sayı sistemindeki karakterler
.section .data // Üstüne yazma yapılabilen verilere ait bellek bloğu
txt02: .ascii "0x................\n" // 64 bitlik bir sayının 16'lık tabanda gösterimi için kullanılacak
// olan bellek bölgesi
.section .text // Programın çalıştırılabilir olan bölümünün verisini tutan blok
.global _start
_start:
mov x0, 0x12AF // Örnek veri x0 saklacına kaydediliyor
bl print // print fonksiyonunu çağır
b exit // exit fonksiyonunu çağır
print:
ldr x2,=txt02
add x2, x2, 1
add x3, x2, 16
ldr x4,=txt01
loop:
and x1, x0, 0xF
add x1, x1, x4
ldrb w5, [x1]
strb w5, [x3]
sub x3, x3, 1
ror x0, x0, 4
cmp x3, x2
b.ne loop
mov x0, 0 // x0 : çıktının nereye gönderileceği (0 : standart çıktı)
ldr x1, =txt02 // x1 : metnin başlangıç adresi
mov x2, 19 // x2 : metnin uzunluğu
mov x8, 64 // x8 : sistem çağrı numarası (64 : write)
svc 0 // sistem çağrısı
ret // fonksiyonun çağırıldığı yere geri dön
exit:
mov x0, 0 // x0 : çıkış kodu
mov x8, 93 // x8 : sistem çağrı numarası (93 : exit)
svc 0 // sistem çağrısı
Dökümanlar
- ARM64 assembly hakkında bilgilerimizi artırmak için aşağıdaki iki dökümana başvurabiliriz. Dili İngilizce'dir.
- İkinci dökümanı indirmek için ilgili web sayfasına üye olup sisteme giriş yapmış olmanız gerekmektedir.
- Döküman 1 : ARMv8 Instruction Set Overview Issue 30.pdf
- Döküman 2 : The ARMv8-A Architecture Reference Manual (ARMv8-A başlığına tıklayın ve PDF dosyasını indirin)
Bu dökümanı yazar ismi belirterek özgürce dağıtabilirsiniz.
CopyRight, ©, Engin KUZU, enginkuzu(at)gmail.com, 05.10.2016, 04.12.2016
|