Assembly Hello World Bootloader - Yeni Başlayanlar İçin

pottie4r

Kilopat
Katılım
9 Haziran 2016
Mesajlar
1.404
Makaleler
2
Çözümler
40
Daha fazla  
Cinsiyet
Erkek
Merhaba! Bugün sizlerle yeni başlayan arkadaşlarımız için bir hello world bootloader yapacağız...
Öncelikle bize lazım olanlar:
  1. NASM
  2. Notepad++
  3. QEMU (test etmek için)
Eğer her şey hazırsa başlayalım!

Öncelikle masaüstüne "bootloader.asm" isimli bir belge oluşturuyoruz ve notepad++ ile açıyoruz.

Öncelikle bootloader'ımızın 16 Bit olduğunu belirteceğiz. Bunun için [BITS 16] yazıyoruz.
bits16.PNG


Ardından, BIOS adresini belirtelim. [ORG 0x7C00]
org.PNG


Şimdi ise asıl işe koyulabiliriz. Öncelikle şunu söyleyeyim;
1-> MOV komutu 1.girdiye 2.girdi değerini yükler...
Örneğin: MOV AH,02H ; Burda AH akümülatörüne 02H değerini yükler.

2-> Peki nedir bu AH,BH,CH vs.
Bunlar için bu slaytı incelemenizi öneririm.

Şimdi geri dönelim.

Öncelikle bir mesaj belirleyelim ve bunu 'msg' olarak kaydedelim.
msg.PNG


Şimdi geri kalan kısımda her şeyi ekran görüntüsü atarak anlatmayacağım. Görüntü kirliliği olmaması amacıyla eğer copy-paster iseniz sayfanın sonundan kodu alabilirsiniz.

3-> Şimdi bir jump-point oluşturalım.

printstring adlı bir nokta oluşturalım. (Burayı ekran görüntüsü attım çünkü hiç üstünden geçmemiştim kafanız karışmasın :) )
point.PNG


Onun içine de bir adet point açalım ve ismini 'printchar' koyalım.
Ve açtığımız printchar pointinden sonra bu kodları yazalım;

Kod:
MOV        AH,0Eh ; Bu tele-type fonksiyonu içindir.
INT        10H ; Bu da BIOS'un görüntü interrupt'u

;INTERRUPT LİSTESİ İÇİN : https://en.wikipedia.org/wiki/BIOS_interrupt_call

Bu bizim ekrana bir harf yazdırmak için kullandığımız fonksiyondur. Normalde AL'nin içindekini yazar fakat şuan AL'nin içinde bir değer yok. Hemen bunu da halledelim.
Bunun için SI dediğimiz kayıta 'msg'yi yani mesajımızı atalım. Yani sayfanın başına [ORG 0x7C00]'dan hemen sonra MOV komutu ile msg'yi SI'ya taşıyalım.

movsi.PNG



Şimdi ise yeni bir point açıyoruz ve ismini next_char yapıyoruz.
Ona da aynen bu kodları yazıyoruz;

Kod:
MOV        AL,[SI] ; Dediğimiz gibi printchar "AL" nin içindekini yazıyor. Biz de AL'ye [SI]'yı yükledik.
OR        AL,AL ; Burda "AL ?= 0" işlemini yapıyoruz yani "AL" 0 mı? diye kontrol ediyoruz.
JZ        print_complete ; Eğer 0 ise ki bu da yazıyı yazdırmayı tamamladı demektir, print_complete pointine gitmesini sağlıyoruz(Onu da birazdan oluşturacağız kafanız karışmasın.)
;artık eğer değilse kısmına geçiyor burası
CALL printchar ; Daha önce tanımladığımız printchar fonksiyonunu çağırıyoruz ve AL'deki harfi yazdırıyoruz.
INC SI ;SI'ın kendisini bir arttırarak bir sonraki harfe geçişi sağlıyoruz.
JMP next_char ; ve bu pointi kelime bitene kadar tekrar çalıştırıyoruz.

;JMP -> pointe gider
;JZ -> IF'den sonra kullanılır. JMP ile aynı işlevi görür.
;CALL -> daha önceden tanımladığınız pointteki kodları çağırır.

Son görünüm:
nextc.PNG


En son olarak artık yukarıda bahsettiğimiz print_complete pointini açıyoruz ve sonsuz döngüye sokuyoruz...
Sonsuz döngü için JMP $ kullanılır.
jmpdolar.PNG



Ana programımız bitti, şimdi sırada bu dosyanın boot edilebilir olduğunu anlatmak!
Sayfanın en alt kısmına (msg'yi tanımladıktan sonraki boşluğa)

TIMES 510 - ($ - $$) db 0
DW 0xAA55

yazmak. Artık işimiz bitti! Şimdi bunu kaydediyoruz ve NASM'ın kurulu olduğu yere atıyoruz.
Ardından bir komut istemi açıyoruz ve cd komutu ile NASM'ın kurulu olduğu yere gidiyoruz.
Ve cmd'ye
cmd.PNG

Ardından oluşan dosyayı QEMU'nun kurulu olduğu klasöre atıyoruz.
qemu.PNG

Ve sonunda amacımıza ulaştık :D
İşte gördüğünüz gibi Assembly'da Hello World yazmak
cout << "Hello World!"; yazmaya benzemez :)

Buraya birkaç işe yarar link bırakıyorum:

Bir dahaki rehberde görüşmek üzere! Hoşçakalın...

Copy-pasterlar için kodun tamamı:
Kod:
[BITS 16]
[ORG 0x7C00]

MOV SI,msg
CALL next_char

printchar:
MOV        AH,0x0E ; Bu tele-type fonksiyonu içindir.
MOV           BL,0x06
INT        10H ; Bu da BIOS'un görüntü interrupt'u
RET
;INTERRUPT LİSTESİ İÇİN : https://en.wikipedia.org/wiki/BIOS_interrupt_call

next_char:
MOV        AL,[SI] ; Dediğimiz gibi printchar "AL" nin içindekini yazıyor. Biz de AL'ye [SI]'yı yükledik.
OR        AL,AL ; Burda "AL ?= 0" işlemini yapıyoruz yani "AL" 0 mı? diye kontrol ediyoruz.
JZ        print_complete ; Eğer 0 ise ki bu da yazıyı yazdırmayı tamamladı demektir, print_complete pointine gitmesini sağlıyoruz(Onu da birazdan oluşturacağız kafanız karışmasın.)
;artık eğer değilse kısmına geçiyor burası
CALL printchar ; Daha önce tanımladığımız printchar fonksiyonunu çağırıyoruz ve AL'deki harfi yazdırıyoruz.
INC SI ;SI'ın kendisini bir arttırarak bir sonraki harfe geçişi sağlıyoruz.
JMP next_char ; ve bu pointi kelime bitene kadar tekrar çalıştırıyoruz.

;JMP -> pointe gider
;JA -> IF'den sonra kullanılır. JMP ile aynı işlevi görür.
;CALL -> daha önceden tanımladığınız pointteki kodları çağırır.

print_complete:
JMP $

msg db 'Hello World!',0

TIMES 510 - ($ - $$) db 0
DW 0xAA55
 
Hocam konunuzu biraz mahvediyorsam affola. Uzaktan eğitime geçtiğimiz şu dönemde çoğu forum üyesi, böyle derin konulara girmek istiyor ama nereden başlayacağı konusunda kararsızdır diye tahmin ediyorum ve onlara yönelik bu mesajı yazmak istedim.

Bootloader yazabilecek seviyeye gelmek için bu konudan çok daha fazlasına ihtiyacınız olacak. Burada yapılan şeyleri kopyala yapıştır ile yapabilirsiniz. Fakat neden yazıldığını, her bir kod parçasının ne işe yaradığını öğrenirseniz o zaman gerçek manada kendi bootloader'ınızı kodlayabilirsiniz.

Bilgisayar dünyasına forumda herkes aşinadır ama harvard computer science 101 ders videolarını izlemediyseniz çok ayıp etmiş olursunuz. Bir çok deha, bu dersi veren david j. malan sayesinde bilgisayar dünyasına giriş yaptı. Niyazi saral abimizin çizgi-tagem eğitim platformu sağ olsun Türkçe altyazılı olarak izleyebilirsiniz.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

HTML vs CSS ile çok uğraşmayın web developer olmak istemiyorsanız. Hayatınızda en fazla birkaç websitesi yapacaksınız bütün HTML taglerini öğrenmenize gerek yok. Eğer interneti biraz daha merak ediyorsanız;
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

İnceleyebilirsiniz. Ardından programlamaya başlayın.


C dili programlamaya başlangıç için çok ideal bir dil. Elektronik donanımlar C dili ile iç içedir. Bir dilin her şeyini öğrenmenize gerek yok. Mesela grafik arayüzüne sahip bir program oluşturmak istiyorsunuz diyelim. Ve sadece C biliyorsunuz ama C dilinde grafik arayüzü tasarımını öğrenmediniz. İnanın C# öğrenip o arayüzü yapmak, C dilinde yapmaktan çok daha kolay.(Bu grafik arayüzü, bir program yükleyicisi olabilir. Setup'a bas sonra Next Next.)

İsterseniz biraz da konsolda bir şeyler yapmayı öğrenin. Mesela diyelim Windows 10'da klasör adını değiştirmenize izin vermiyor. CMD'yi açıp konsoldan değiştirebilirsiniz. Önemli bir yetkinlik konsol kullanmayı bilmek. Tabi Windows üstünden öğrenmek biraz zorlayabilir sizi. Tüm denetim sizde değil Microsoft'un sen elleme ben hallederim mantığı bazen sinir bozucu olabiliyor. Linux'ta ise her şey size bırakılmış. Bu oynatma listesi ise sanal makine ile Windows bir bilgisayarınızda Ubuntu çalıştırarak konsolu iyi öğretiyor.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Artık donanım öğrenme vakti. Dijital elektronik ya da diğer adı ile lojik devreler. Bunları üstünkörü de olsa bilmelisiniz. Bootloader kodlayabilecek adamın donanım bilgisi olmalı. RAM tasarımına da biraz bakabilirsiniz donanım seviyorsanız. (Bu ders bilgisayar müh. Ve elektrik elektronik müh. 2. sınıfta verilen bir derstir.)
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Yukarıdaki videolarla yetinmeyin. Araştırın. Arduino'ya giriş yapın. Sesli komut ile ışığı kontrol eden sistem yapın. Ya da para hilesi istediğiniz oyunlarda para miktarının tutulduğu değişkene RAM'den erişip müdahale ederek hangi adreste tutulduğunu bulup kendi hile yazılımınızı yapabilirsiniz. İlginç projeler tutkunuzu alevlendirir. Ve bu alev sayesinde sıkıcı olan öğrenme safhası keyifli bir hale geliyor. Tutkunuzu kaybetmeyin.

Son olarak işletim sistemi kodlamayı öğrenin.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
İşletim sistemi kodlayabiliyorsanız bilgisayarın her şeyine hakimsiniz demektir.
 
Son düzenleme:
Hocam konunuzu biraz mahvediyorsam affola. Uzaktan eğitime geçtiğimiz şu dönemde çoğu forum üyesi, böyle derin konulara girmek istiyor ama nereden başlayacağı konusunda kararsızdır diye tahmin ediyorum ve onlara yönelik bu mesajı yazmak istedim.

Bootloader yazabilecek seviyeye gelmek için bu konudan çok daha fazlasına ihtiyacınız olacak. Burada yapılan şeyleri kopyala yapıştır ile yapabilirsiniz. Fakat neden yazıldığını, her bir kod parçasının ne işe yaradığını öğrenirseniz o zaman gerçek manada kendi bootloader'ınızı kodlayabilirsiniz.

Bilgisayar dünyasına forumda herkes aşinadır ama harvard computer science 101 ders videolarını izlemediyseniz çok ayıp etmiş olursunuz. Bir çok deha, bu dersi veren david j. malan sayesinde bilgisayar dünyasına giriş yaptı. Niyazi saral abimizin çizgi-tagem eğitim platformu sağ olsun Türkçe altyazılı olarak izleyebilirsiniz.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

HTML vs CSS ile çok uğraşmayın web developer olmak istemiyorsanız. Hayatınızda en fazla birkaç websitesi yapacaksınız bütün HTML taglerini öğrenmenize gerek yok. Eğer interneti biraz daha merak ediyorsanız;
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

İnceleyebilirsiniz. Ardından programlamaya başlayın.


C dili programlamaya başlangıç için çok ideal bir dil. Elektronik donanımlar C dili ile iç içedir. Bir dilin her şeyini öğrenmenize gerek yok. Mesela grafik arayüzüne sahip bir program oluşturmak istiyorsunuz diyelim. Ve sadece C biliyorsunuz ama C dilinde grafik arayüzü tasarımını öğrenmediniz. İnanın C# öğrenip o arayüzü yapmak, C dilinde yapmaktan çok daha kolay.(Bu grafik arayüzü, bir program yükleyicisi olabilir. Setup'a bas sonra Next Next.)

İsterseniz biraz da konsolda bir şeyler yapmayı öğrenin. Mesela diyelim Windows 10'da klasör adını değiştirmenize izin vermiyor. CMD'yi açıp konsoldan değiştirebilirsiniz. Önemli bir yetkinlik konsol kullanmayı bilmek. Tabi Windows üstünden öğrenmek biraz zorlayabilir sizi. Tüm denetim sizde değil Microsoft'un sen elleme ben hallederim mantığı bazen sinir bozucu olabiliyor. Linux'ta ise her şey size bırakılmış. Bu oynatma listesi ise sanal makine ile Windows bir bilgisayarınızda Ubuntu çalıştırarak konsolu iyi öğretiyor.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Artık donanım öğrenme vakti. Dijital elektronik ya da diğer adı ile lojik devreler. Bunları üstünkörü de olsa bilmelisiniz. Bootloader kodlayabilecek adamın donanım bilgisi olmalı. RAM tasarımına da biraz bakabilirsiniz donanım seviyorsanız. (Bu ders bilgisayar müh. Ve elektrik elektronik müh. 2. sınıfta verilen bir derstir.)
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Yukarıdaki videolarla yetinmeyin. Araştırın. Arduino'ya giriş yapın. Sesli komut ile ışığı kontrol eden sistem yapın. Ya da para hilesi istediğiniz oyunlarda para miktarının tutulduğu değişkene RAM'den erişip müdahale ederek hangi adreste tutulduğunu bulup kendi hile yazılımınızı yapabilirsiniz. İlginç projeler tutkunuzu alevlendirir. Ve bu alev sayesinde sıkıcı olan öğrenme safhası keyifli bir hale geliyor. Tutkunuzu kaybetmeyin.

Son olarak işletim sistemi kodlamayı öğrenin.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
İşletim sistemi kodlayabiliyorsanız bilgisayarın her şeyine hakimsiniz demektir.

Kesinlikle haklısınız. Her bir kodu teker teker açıklamaya çalıştım zaten. Wikipedia'dan INT listesi de bıraktım. Daha sonraki anlatımlarımda da aynen her kodu teker teker anlatacağım. Konumu güzel mesajınızla süslediğiniz için çok teşekkür ederim hocam.
 
Son olarak işletim sistemi kodlamayı öğrenin.
İşletim sistemi kodlayabiliyorsanız bilgisayarın her şeyine hakimsiniz demektir.

İşletim sistemi kodlayabilen kaç kişi var? Ayrıca işletim sistemi kodlamak nedir? Sıfırdan geliştirmek mi? Sistem programlama desek daha doğru olur ona. İşletim sistemi kodlamak çok zor iştir. Bırak kodlamayı, yazılı kodları anlayacak kişi sayısı bile az. İşletim sistemi gibi CS müfredatının core derslerinden birinin sınavının test yapıldığı üniversiteler duydum.

Ayrıca Assembly günümüzde bilgisayar mimarisi öğrenmek ve çok çok özelleşmiş endüstriyel uygulamalar dışında kullanılmıyor bile.
 
Elinize sağlık hocam. Çok güzel bir paylaşım. Assembly öğrenecekler ileride C, C++ ya da başka herhangi bir high-level dilde program yazmanın ne kadar da kolay olduğunu görecekler. :)
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı