Bebek katili İsrail'in Filistin ve Lübnan'a yapmış olduğu saldırıları kınıyorum. Engin KUZU
Ana Sayfa
Ana Sayfa
Tux
Linux
Programlama
Programlama
Projeler
Projeler
enginkuzu blog
BLOG
Eskiler
Eskiler
Ben
Ben


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