Program Crackleme
denilen
dil aslinda rakamsal bir dildir .Bu onaltilik sayi düzeninde bulunan
kodlar ikilik sayi sistemine (binary)
dönüstürülerek CPU ‘ya
gider 0 ve 1 ler bilgisayarin
isleyisindeki temel olan elektrik sinyali var (1)
elektrik sinyali yok (0) olarak CPU tarafindan
yorumlanarak programlar isler.
Makine dilininin bu zor ve anlasilmaz
olusundan dolayi ASSEMBLY dili gelistirilmistir.
Bu dil bilgisayar dilleri içerisinde en alt düzey programlama dilidir. Bu dil
ile yazilan programlar CPU ya
direkt olarak hitap eder . Fakat bu dil ile uzun programlar yazmak ta oldukça
zor ve gereksizdir. Bunun yerine diger diller ile yazilan programlarda o programlama dilinin yetersiz kaldigi ya da yavas
kaldigi noktalarda daha hizli
ve direkt erisim olanagina
sahip bir dil olan ASSEMBLY ile prosedür veya fonksiyonlar yazilir.
Günümüzde bu sadece bazi aygit
sürücülerini yazarken yada virus lerde
kullanilmaktadir.
Gelelim Windows programlarina ; Windows için yazilan programlar da çesitli
programlama dilleri yada program gelistirme araçlari ile yazilarak derlenir
ve çalistirilabilir kod haline dönüstürülür.
Bu çalistirilabilir kodun DOS programlarinda
en belirgin farki içerisinde kullandigi
isletim sistemini özel fonksiyonlaridir.
DOS isletim sisteminin INTERRUPT denilen bazi fonksiyonlari vardir. Bu fonksiyonlar windows
için yazdiginiz programlarin
içerisinde direkt olarak yer almazlar bunun yerine Windows isletim
sisteminin hali hazirda yazilmis
fonksiyonlari kullanilir.(Bu
konu üzerinde istenirse daha ileriki yazilarimda
durabilirim , ama simdilik bu kadar yeterli diyorum)
Hepimizin mutlaka dikkatini çekmistir Windows / System dizini altinda bir çok DLL
uzantili dosya mevcuttur. Iste
bu dosyalar içerisinde programlarin çalisirken kullandigi birçok
fonksiyon yada tanim bulundururlar. Iste bu fonksiyonlar programlari kirmamiza yardimci olacak noktalardir. Daha önce de belirttigim
gibi programlar makine dilinde bulunuyordu dosyalarda , öyleyse bunlari anlayabilecegimiz bir
sekile sokmak için bu programlari ASSEMBLY diline
çevirmemiz gerekecek. Bu is için kullanacagimiz
programlara Disassembler denilir . Programlarin ham içerigini yani onaltilik sayi düzenindeki içerigini görüntüleyebilmek içinse HEX editör denilen
programlara ihtiyacimiz olacak . Bunun haricinde ise
bazen programlarin CPU daki
isenis sirasindaki içerigini görüntüleyebilen ve aslinda
programlardaki hatalari ayiklamak
için kullanilan Debugger
denilen programlar ise ileride çok isimize yarayacak.
Öyle ise program kirmak için gerekli olan seyleri söyle siralayabiliriz.
1-ASSEMBLY dilini bilmek 2- Windows isletim sistemini
iyi tanimak ve fonksiyonlarini
bilme (C++ kullananlar bu konuda pek zorluk çekmiyecektir
) 3-Iyi bir Disassembler programi 4-Hexeditör programi 5-Debugger programi 6- Sabir (en gerekli sey) . Bu saydiklarimin hepsine
sahip oldugunuzda program kirmak
için herseyiniz vardir anlamina geliyor.
Isterseniz küçük bir örnek ile baslayabiliriz.
Bu is için oldukça kolay bir korumasi olan ve bizimde
kullanacagimiz bir program olan HEXWORKSHOP ile ise baslayabiliriz. Bu program daha önce birçok kisi tarafindan ve farkli yöntemler izlenerek kirilmistir
. Benim izleyecegim yötem
ise bazilariniza saçma gelebilir ama unutmayiki buradaki amacim
kendimi ispat etmek degil sadece ögretmektir.
Hedef Program :HexWorkshop 2.52
Nereden Bulurum : www.bpsoft.com
Kirarken Kullanilan
Programlar :Wdasm89 & HexWorkshop 2.52
Öncelikle programin Demo
yada deneme sürümü olmasinin bize sagladigi
dezavantajlari inceliyoruz. Programi
ilk açtigimizda karsimiza
bu programin 20 gün süreli bir demo
versiyon oldugunu hatirlatan
bir pencere ile karsilasiyoruz.Eger
Bu versiyonu bu yakin tarihte kurduysaniz
ayrica size upgrade
etmenizi öneren bir baska pencere daha çikiyor karsimiza . Bunun
haricinde programin Demonstration
Version diye bir menüsü oldugunu görüyoruz , buraya tikladigimizda
ise bir Serial Number soran
pencere ile karsilasiyoruz. Öyleyse bize burada bir dogru serial numara yada programa
dogru oldugunu zannetirecek bir yöntem gerekli. Programi
disassemble ederek ise basliyabiliriz.
Programin disassemble islemi bittikten sonra kullandigi
windows fonksiyonlarini
inceleyelim functions menusunden
imports ‘a baktigimizda
user32.getwindowtexta fonksiyonu ise yarayabilir
diyoruz ve ilk denememizi bu fonksiyon ile yapiyoruz
. Programi load edip
user32.GetWindowTextA fonksiyonlarinin
kullanildigi yerlere durak noktasi
koyuyoruz. Assagi yukari 7-
8 arasi durak noktasi
koyduktan sonra programi çalsitirip
Demonstration Version menüsünü tiklayip Serial Number olarak herhangi bir
no giriyoruz.Ben 99999999 girdim ve register tusuna bastiginizda HOP Wdasm içinde buluyoruz kendimizi yani ise yaradi !! . Daha sonra F8 tusu
ile hatali Serial Number girdigimize dair ekran çikana kadar devam ediyoruz ilerlemeye. Bu noktaya gelene
kadar islenen kodlari iyi takip edin çünkü en son
islenen Dallanma komutunun yeri çok önemli yani (je ,
Jne , Jz , jnz , Ja , Jb
gibi ) . En nihayetinde hata ekrani çiktiginda OK ye basip islemi tekrar yapalim ve her
islenen kosullu dallanma komutuna bir durak noktasi daha koyalim.
:0043178B E8E8DC0100 call 0044F478 à Serial Number in ekrandan okunmasi
:00431790 8B8DFCFEFFFF mov ecx,
dword ptr [ebp+FFFFFEFC]
:00431796 83C164 add ecx,
00000064
:00431799 E8F21BFDFF call 00403390
:0043179E 50 push eax
:0043179F 8D45DC lea eax, dword ptr [ebp-24]
:004317A2 50 push eax
:004317A3 E8E8B90000 call 0043D190
:004317A8 83C408 add esp,
00000008
:004317AB 680C534800 push 0048530C
:004317B0 8D45DC lea eax, dword ptr [ebp-24]
:004317B3 50 push eax
:004317B4 E867CE0000 call 0043E620
:004317B9 83C408 add esp,
00000008
:004317BC 85C0 test eax, eax
:004317BE 0F8414000000 je 004317D8
:004317C4 8D45DC lea eax, dword ptr [ebp-24]
:004317C7 50 push eax
:004317C8 E893970000 call 0043AF60
:004317CD 83C404 add esp,
00000004
:004317D0 8945EC mov dword ptr [ebp-14], eax
:004317D3 E907000000 jmp 004317DF
:004317DF 837DEC00 cmp dword
ptr [ebp-14], 00000000
:004317E3 0F8479000000 je 00431862 à Girilen Serial Nuber Yanlis
ise dallanma olur
:004317E9 8B8DFCFEFFFF mov ecx,
dword ptr [ebp+FFFFFEFC]
:004317EF 83C164 add ecx,
00000064
:004317F2 E8991BFDFF call 00403390
:004317F7 50 push eax
Yukarida görülen kod üzerinde daha fazla da çalisabilirir ama ben buna su an gerek duymuyorum ,çünkü bu
program girilen numarayi dogru
kabul ettikten sonra çalistigi dizinde bir dosya olusturuyor. REG uzantisi olan bu
dosya var olunca yada içerisinde belli bir imza olunca girilen serial numaranin dogru olup olmadigini bir daha
hiç kontrol etmiyor ve böylece sonsuza dek Full version olarrak çalisiyor .Anlasildigi gibi bu JE
00431862 komutunu JNE 00431862 yada tamamini NOP
komutuna çevirirsek bu program girecegimiz herhangi
bir kodu kabul edicek ve Crackimiz
tamamlanmis olucaktir.Wdasm programindan aradigimiz byte larin 30BE3h adresinde yer aldigini
görüyoruz . Hexworkshop programinin
kendisini kullanip Hworks32.exe
dosyasini açip 30BE3h adrsine gidiyoruz 0F8479000000 byte
larini 909090909090 byte lari ile degistirip baska bir isimle kaydediyoruz. Çünkü ayni isimle o an hafiza da olan bir dosyayi kayit edemeyiz . Daha sonra HexWorkshop
programindan çikip orijinal
dosyanin adini baska bir
isimle kaydedip kirilmis dosyayi
orijinal adiyla kaydedersek program hazir olur. Geriye çalistirip
herhangi bir Serial Number
kodu yazip Register etmek kaliyor.
ASSEMBER HAKKINDA BİLGİ
Assembler programlama dili, çoğu zaman özel alanlarda geliştirilen
programlarda kullanılan alt düzel bir Programlama dili olarak tanımlanır. Bu
dilin komutları, bilgisayarın doğrudan işlettiği makine dili komutlarının birebir
karşı lığıdır. Bu nedenle bu dil için makine dili de denilebilir.
Her ne kadar uzman
programcıların özel alanlarda kullandığı bir dil olarak tanımlansa da,
programcılar istedikleri takdirde her türlü uygulamayı bu dil ile
geliştirebilirler yada kullandıkları üst düzey dil altından çağırabilecekler i procedurler yazabilirler. Çünkü hemen hemen
her dilde assembler için destek bulunmaktadır.
Dilin en büyük avantajı CPU
çevrebirimlerinin ve ana belleğin çok iyi bir şekilde kontrolünü sağlamasıdır.
Ayrıca işletim sistem fonksiyonlarını da çok kolaylıkla kullanmak mümkündür. Assembler program dili derleyicisi kullanılan ko mutların birebir makine dili karşılıklarını üretir. Bu
nedenle bu dil ile oluşturulan programlar olabilecek en kısa programlar olurlar.
Bir assembler
programı çalışabilir bir programın tüm kesimlerinin tam olarak tanıtılması ile
oluşturulabilir. Bu nedenle bir assembler programda
minimum üç ana kesim bulunmalıdır.
1 - STACK Segment
2 - DATA Segment
3 - CODE Segment
Basit bir assembler
programı;
STACK SEGMENT PARA ‘STACK’
DB 64 DUP (‘STACK’)
STACK ENDS
DATA SEGMENT PARA ‘DATA’
MESAJ DB ‘BU BİR ASSEMBLER
PROGRAMIDIR $’
DATA ENDS
CODE SEGMENT PARA ‘CODE’
ANA PROC FAR
ASSUME CS;CODE, DS;DATA,
ES;DATA, SS;STACK
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,MESAJ
MOV AH,09
INT 21H
RET
ANA ENDP
CODE ENDS
END
1. BİLGİNİN TEMSİLİ
Elektronik bilgi işlem makinalarında bilgiler elektriksel uyarımlarla temsil
edilirler. Bu uyarımların ifadesi 1 ve 0’lardan oluşan rakamlarla temsil
edilirler. Bu uyarımları BIT adı verilir. Açıktır ki bir BIT ile 0 ve 1 gibi
iki b ilginin temsili sözkonusudur. Ancak günlük
hayatta kullandığımız bilgiler 2 adet değildir. Bu nedenle BIT’ler
guruplanarak kullanılırlar. En küçük BIT gurubu 8
bitten oluşan guruptur ki bu guruba BYTE adı verilir. Bir byte
ile +127 ile -127 arasındaki rak amlar
ile harflerin temsili mümkün olur. Bir byte ile
temsil edilen harfler için kullanılan en yaygın stantdart
ASCII(American Standard Code
for Infırmation Interchange) standartdır.
2- VERİ TİPLERİ
Bir programlama dilinin temel
özelliklerinden birisi dilin içinde kullanılacak olan veri tipleridir. Burada assembler dilinde kullanılan en basit veri tiplerinden
bahsedilecektir.
Assembler programlama dilinde kullanılacak olan bilgilerin uzunlugu bilgisayarın mikroişlemcisine baglıdır.
8088 mikroişlemci için en fazla 16 bit uzunlugunda
bir veri temsil edilebilir. 80286, 80386 ve 80486 mikroişlemcileri daha g elişmiş oldukları için kullandıkları bilgi uzunlugu daha fazla olabilir.
2.1 BYTE
Byte 8 bitten oluşan bir bilgi birimidir. Assembler’da
byte ile hem nümerik hemde alfanümerik bilgileri temsil etmek mümkündür.
Gerek BYTE gerekse diger veri tiplerinde sayılar işaretli ve işaretsiz olarak
iki ana guruba ayrılırlar. İşaretsiz sayılar tüm veri alanını bir bütün olarak degerlendirildiği bir durumu ifade eder. Sayıların işaretli
veya işaretsiz olması makine açısından izafi bir durumdur.
1 0 0 0 0 0 0 1 İşaretsiz 129 sayısını temsil eder.
1 0 0 0 0 0 0 1 İşaretli -1 sayısını temsil eder.
Negatif sayılarda en duyarlı bit
1 olur.
Byte iki ana kısımdan oluşur. Her kısıma
NIBBLE adı verilir. Her NIBBLE bir hexadecimal sayıyı
temsil eder.
1 0 0 0 0 0 0 1
----------- -------------
2.NIBBLE 1.NIBBLE
2.2 WORD
2 Adet Byte
ile oluşturulmuş bir yapıdır. 8088 ve diğer mikroişlemciler 16 bit
uzunluğundaki bu yapıyı desteklerler. Word yapısını bir bütün olarak
işleyebileceğiniz gibi yüksek byte (HB) veya Low byte (LB) olarak da
işleyebilirsini z.
2.3 DOUBLEWORD
İki word
uzunluğunda yani 32 bit uzunluğunda bir yapıdır. Gerek adreslemede gerekse
büyük sayıların saklanmasında kullanılır.
2.4 QUADWORD
64 Bit uzunluğunda bir yapıdır.
4 word’un birleştirilmesi ile oluşturulur.
8088 Mikroişlemcisi olan bir makinada direkt mikroişlemcinin desteklediği BYTE ve WORD
kavramları kullanılabilir. 80286, 80386 ve üzeri mikroişlemcilerde BYTE ve WORD
kavramlarının dışında DOUBLEWORD ve QUADWORD kavramları da kulla nılabilir. 8088 mikroişlemcilerde WORD’den
daha uzun sabit ve değişkenler de kullanılabilir. Ancak bu kullanım direkt
mikroişlemci destegi dışında yazılım desteği ile
olur.
3- MİKROİŞLEMCİ TASARIMI
Bir mikroişlemci,kendisine bağlı
çevre birimlerle haberleşebilmek, yürütmekte olduğu programları kontrol
edebilmek için REGİSTER adı verilen, kendi iç yapısında fiziksel olarak bulunan
RAM elemanlarını kullanır. REGİSTERLER bir mikroişlemcinin en temel
bileşenlerinden biridir. İntel 80xxx serisi
mikroişlemcilerde uzunlukları değişmekle beraber aşağıdaki registerler
bulunur.
Genel Amaclı
Registerler
AX Ah-Al Accumulator
BX Bh-Bl Base
CX Ch-Cl Counter
DX Dh-Dl Data
Segment Registerleri
CS Code
Segment
DS Data Segment
SS Stack
Segment
ES Extra
Segment
Offset Registerleri
IP Instraction
Pointer
SP Stack
Pointer
BP Base
Pointer
SI Stack
Information
DI Data Information
Flag Registerleri
Flag
3.1 Genel Amaçlı Registerler
AX,BX,CX,DX registerleri
genel amaçlı registerlerdir. Mikroişlemci programları
çalıştırırken verileri ana bellek ile iç bellek arasında sürekli olarak taşır.
Genel amaçlı registerler bu taşıma sırasında aracılık
ederler. Aynı zaman da matematiksel işlemlerde giriş ve çıkış noktaları olarak
kullanılırlar. X
Bu registerlerin
tamamı 16 bit uzunluğunda olup, 2 byte’tan oluşurlar.
Byte’lar bir bütün olarak kullanılabileceği gibi ayrı
ayrı da kullanılabilirler.
3.1.1 AX YAZMACI
Programlarda en çok kullanılan
yazmaçlardan biridir. Accumulator’ün kısaltılması
sonunda oluşan AX yazmacı bütün giriş ve çıkış işlemlerinde ve bazı aritmetik
işlemlerde kullanılır.
AX
--------------------------------------------------------
AH AL
3.1.2 BX YAZMACI
BX Registeri
Base register olarak da
bilinir. RAM ve IO işlemlerinde adreslemede kullanılır. Register
adresleme işlemlerinde daha çok offset degerlerini tutar. Ayrıca hesaplama işlemlerinde de
kullanılır.
BX
--------------------------------------------------------
BH BL
3.1.3 CX YAZMACI
CX Registeri
Counter registeridir. Döngü
işlemlerinde ve kaydırma işlemlerinde sayaç olarak kullanılır.
CX
--------------------------------------------------------
CH CL
3.1.4 DX YAZMACI
Register bazı giriş çıkış işlemlerinde ve matematiksel işlemlerde
kullanılır.Daha çok çarpma ve bölme işlemlerinde büyük sayıları saklamak için
AX registerinin bir parçasıymış gibi kullanılır.
DX
--------------------------------------------------------
DH DL
3.2 Segment
Registerleri
3.3 Pointer
ve Index Registerleri
3.4 PSW Registeri
4. BELLEK , SEGMENT, OFFSET
5. DEBUG PROGRAMI
Debug programı exe veya com tipli, diger bir deyişle makine dili formatlı program dosyalarının
çalıştırılması, bu programların bellek yerleşimlerinin, cpu
üzerindeki etkilerinin ve verilerinin incelenmesi, değiştirilmesi vs. amacıyla ku llanılan bir programdır.
Debug programı ile bir makine dili programı bellege yükleyebilir, bu programı step step
çalıştırabileceğiniz gibi programın belli bir kısmını çalıştırabilirsiniz veya
programın makine dili kodları üzerinde değişiklik yapabilir, programa yeni
kodlar ekleyebilir veya çıkarabilirsiniz. Yada herhangi bir programı assembly kullanarak veya makine dili kullanarak yeniden
oluşturabilirsiniz.
5.1 Debug
Komutları.
Debug programı dos işletim
sisteminin bir parçasıdır. Bu nedenle dos versionları arasında komutlarda veya komut özelliklerinde
değişiklikler olabilmektedir. Burada programın tüm komutlarını anlatmak yerine
program yazmayı veya incelemeyi sağlayacak olan komutlar üzerinde durulacaktır.
A Assemble
Assembly programlarının yazılmasını saglar.
G Go
Bellekte yüklü olan bir programın çalıştırılmasını sağlar.
L Load
Diskten belleğe bir proğramın yüklenmesini sağlar.
N Name Bellekteki program için
isim seçmeyi sağlar.
Q Quit
Programdan çıkarak işletim sistemine dönmeyi sağlar.
R Register
Register degerlerini görme
ve değiştirme.
T Trace
Bellekteki bir veya daha fazla komutun çalıştırılmasını sağlar.
U Unassembly
Assembly kodlarının makine dili karşılıklarını
almanızı sağlar.
W Write
Bellekteki proğramın diske yazılmasını sağlar.
Program sistem komut satırından debug yazılarak çalıştırılabilir. Program çalıştırılırken eger bir program bellege
yüklenecekse bu program ismi komut satırından verilebilir. Program çalıştığında
ekranın sol tarafında ( - ) işareti belirecektir. Bu prompt
debug programının komut almaya hazır olduğunu
gösterir.
5.1.1 A Assembly
Komutu
A Komutu assembly
program yazmak için kullanılır. Bu komutun kullanılış şekli;
-- A [segment:offset]
şeklindedir.
Komutun parametresi olan adres,
yazılacak programın bellegin neresinden itibaren
yerleşeceğini gösterir. Parametre seçimliktir. Eğer verilmeyecek olur ise
mevcut CS ve IP üzerindeki değerler komutun parametresi olarak varsayılır.
Komuttan sonra hiç bir parametre vermeyeceğiniz gibi sadece offset
adresi de verebilirsiniz. Eğer komuttan sonra sadece tek bir sayı verilmişse
verilen değer offset olarak algılanır ve IP registerine bu deger verilerek
programın default segment
ve belirlenen offset üzerinde n yazılması sağlanır.
Komutun çalıştırılması ile, default veya belirlenen segment
ve offset adresi yeni bir satır başına yazılarak bu
adresin yanında komut girişi için beklenir. Her komut girilip enter tuşuna basıldığında debug
ilk önce girilen komutu yorumlar ve girile n komut doğru ise segment ve offset adresleri
yazılan komut uzunluğu kadar artırılarak yeni komut girişi için beklemeye
başlar. Eğer girilen komut hatalı ise hata yeri gösterilerek komutun tekrar
girilmesi için aynı segmet ve offset
adreslerinde beklenir. Eğer herhangi bir satırda komut girilmeyerek enter tuşuna basılırsa debug
komut satırına geri döner. Örnek;
C>Debug
- A
2054:0100 Push
Ds
2054:0101 Mov
Ax,B800
2054:0104 Mov
Ds,Ax
2054:0106 Mov
Si,0000
2054:0109 Mov
Word [Si],7941
2054:010C Pop Ds
2054:010D Int
20
2054:010F
- G
Program yazılırken en son
girilen komutun offset adresi default
offset olarak alınır. A komutundan çıktıktan sonra
tekrar aynı komut kullanılırsa default segmentin son kalınan offseti
ekrana getirilir. Eğer programa ek yapılacaksa bu yöntem kullanı
labilir. Ancak herhangi bir komut değiştirilecekse
komuta girilirken değiştirilecek satırın segment ve offset adresi verilerek girilmelidir.
A komutu ile girilen komutlar
belleğe peşpeşe yerleştirilirler. Bu nedenle yazılmış
bir proğramın değiştirilmesi oldukça zordur. Eğer
değiştireceğiniz komut uzunluğu daha önce yazdığınız komut uzunluğu ile aynı
ise problemsiz bir değişim sözkonusu olabilir. Ancak
yazacağınız komut eskisinden uzun ise M komutu ile ramde
yer açmak gerekir.
5.1.2. G Go
Komutu
Go komutu hafızadaki bir programın icra ettirilmesi amacı
ile kullanılır. Komutun formatı;
- G Adres
şeklindedir.
Komuttan sonra verilen Adres
parametresi seçimliktir. Adres verilmez ise program CS;IP ikilisindeki değerler
default olarak alınarak çalıştırılır. Verilen adres
her zaman programın başlatılacağı adres olarak alınır. Bu değer sadece offset olarak ve rilebileceği
gibi segmet ve offest
olarak da verilebilir.
Hafızadaki herhangi bir program
RET yada INT 20 komutlarından biri ile bitmelidir. G komutu bu iki assembler komutundan birini icra ettirdiğinde PROGRAM
TERMINATED NORMALLY deyimi ile sona erer. Bahsedilen komutlar program icrasını
sona erdirerek k omut satırına dönmeyi sağlar.
Herhangi bir program bu iki komuttan biri ile sona ermiyor ise makinanız denetimsiz komutlar yüzünden kilitlenecek yada
istem dışı davranacaktır.
Herhangi bir proğramı
birden fazla sayıda çalıştıracaksanız ikinci ve sonraki çalıştırmalarda CS:IP
ikilisinin değerlerinden emin olmalısınız. CS:IP ikilisine istediğiniz herhangi
bir değeri R komutu ile atayabilirsiniz.
5.1.3 L Load
Komutu
L Komutu disk üzerindeki herhangi
bir programın belleğe yüklenmesi için kullanılır. Komutun herhangi bir
parametresi yoktur. Komut N komutu ile ismi belirlenmiş bulunan programı
belleğe yükler.
5.1.4 N Name Komutu
N Komutu, L veya W komutu için
dosya ismi seçmekte kullanılır. Komutun kullanım şekli;
- N Dosya Adı
şeklindedir.
Name komutu Load
ve Write komutlarından önce kullanılarak diskten
çağrılacak yada diske yazılacak dosyanın adını belirlemekte kullanılır.
5.1.4 Q Quit
Komutu
Komut debug
programını sonlandırır.
5.1.5 R Register
Komutu
Komut CPU registerlerinin
değerlerini görmek yada değiştirmek için kullanılır. R komutunun kullanım
biçimi aşağıda verilmiştir.
- R Register
Adı
Komut registerlerin
kullanımı ile ilgili olmak üzere 3 ayrı görevi yerine getirir.
R : Komut tek başına
kullanılırsa CPU registerlerinin o anki tüm degerleri gösterilir. Registerlerin
yanısıra komut Flag registerinin degerlerini de
temsili olarak gösterecektir. Komutun kullanımı sonunda CS:IP ile işaret edilen
komut da ekranda göste rilecektir.
R komutunun kullanımı sonunda aşağıdakine benzer bir görüntü alıncaktır.
- R
AX=0000 BX=0000 CX=0000 DX=0000
SP=FFEE BP=0000 SI=0000 DI=0000
DS=2054 ES=2054 SS=2054 CS=2054
IP =0100 NV UP EI PL NZ NA PO NC
2054:0100 IE PUSH DS
NV UP EI PL NZ NA PO NC
değerleri dışındaki tüm reğişterler daha önceki
bölümlerde anlatılmıştı. Yukarıdaki değerler Flag registerinin temsili gösterimidir. Bu registerin
alabileceği değerler aşağıda gösterilmiştir.
FLAGLAR
Overflow
Direction
Interrupt
Sign
Zero
Auxiliary Carry
Parity
Carry
BIT SET (1)
OV
DN
EI
NG
ZR
AC
PE
CY
BIT RESET (0)
NV
UP
DI
PL
NZ
NA
PO
NC
R komutundan sonra parametre
olarak F harfi kullanılırsa program flagların
değiştirilmesi için mevcut flagları ekrana getirir ve
istediğiniz flagları değiştirmeniz için bekler. Bu
durumda istediğiniz herhangi bir flagi set yada reset edebilirsiniz.
- R F
NV UP EI PL NZ NA PO NC - ZRUP
-
Yukarıdaki örnekte Zero flagı SET, direction flagı RESET edilmektedir.
R komutu ile sadece flagların değil tüm registerlerin
degerleri değiştirilebilir. Bunun için R komutundan
sonra değiştirilmesi istenen registerin isminin
yazılması gerekir. Bu işlem gerçekleştiğinde registerin
mevcut degeri ekrana yazılır ve ( : ) iş areti konularak registerin yeni degeri sorulur. Bu işaretin yanına deger
4 digit hexadecimal olarak
verilmelidir. Eger bir deger
verilmeyip enter tuşuna basılırsa registerin
içeriği değiştirilmeyecektir.
5.1.6 T Trace
Komutu
Trace komutu hafızada bulunan bir programın satırlarının tek tek veya belli bir kısmının çalıştırılması için kullanılır.
Komutun kullanımı aşağıda verilmiştir.
- T=Adres Değer
Komutun parametreleri
seçimliktir. Ilk parametre Adres parametresidir ki bu
parametre kullanılacaksa komuttan sonra = işaretinin kullanımı zorunludur.
Adres parametresi icra ettirilecek ilk komutun adresi olarak alınır.
Değer parametresi kaç adet
komutun peşpeşe icra ettirileceğini gösterir. Eğer
kullanılmamış ise bu değer 1 olarak alınır. Eğer herhangi bir parametre
kullanılmaz ise komut CS:IP ile adreslenen yerden başlayarak 1 komut icra
ettirilir ve komutun icr asından sonra registerlerin değeri ve işlenecek olan komut ekranda
görüntülenir.
5.1.7 U Unassembly
Komutu
U Komutu bellekteki programın
makine dili ve assembly karşılıklarını ekranda
listelemek için kullanılır. Komutun kullanım şekli aşağıda verilmiştir.
- U Adres1 Adres2
Parametre olarak verilen Adres1
listelenmek istenen programın başlangıç adresini gösterir. Bu adres segment ve offset olarak
verilebilir. Bu adres verilirken herhangi bir komutu bölmemesine özen göstermek
gerekir. Aksi halde ekrana getirilecek list e
anlamsız bir liste olacaktır.
Ikinci verilen parametre listelemenin sonunu belirler. Burada
verilecek adres offset niteliğinde olmalıdır. Segment Adres1’de belirtilen segment
adresi olarak alınacaktır.
Örnek 1
U 101 106
2054:0101 B800B0 MOV AX,B000
2054:0104 8ED8 MOV DS,AX
2054:0106 BE0000 MOV SI,0000
Örnek 2
U 102 106
2054:0102 00B08ED8 ADD [BX+SI+D88E],DH
2054:0106 BE0000 MOV SI,0000
5.1.8 W Write
Komutu
Bellekteki herhangi bir proğramın bir blok şeklinde diske proğram
olarak yazılmasını sağlar. Komutun kullanım şekli;
W Adres
şeklindedir.
komuttan sonra verilen adres
diske kaydedilecek proğramın başlangıç adresidir.
Eğer bu parametre verilmezse 0100 offseti default olarak kabul edilir. Diske yazılacak programın
uzunluğu BX:CX register çiftinden alınır.
Komut kullanılmadan önce N
komutu ile diske yazılacak programın ismi belirlenmelidir. Aksi halde diske
yazma işlemi default deger
üzerinden yapılacaktır.
Örnek;
N Deneme.com
R BX
: 0000
R CX
: 0010
W
Writing 0010 Bytes
-
6. ASSEBLER PROGRAM YAPISI ve
ILGILI KOMUTLAR
Bir program belleği parçalara
bölerek (segmentleyerek) kullanır. Assembler programlarda da yapı itibariyle bellegin segmentlere ayrılması ve
ayrılan her bölümün ayrı ayrı tanımlanarak
kullanılması esastır. Bu nedenle bir assembler
programında genel itibariyle bölüm tanımları programın yapısını oluşturur.
Genellikle bir proğramda geçici verilerin saklandığı stack, kalıcı verileri saklamak için data ve program
kodlarının saklandığı code segment
bölümleri yer alır. Bir assembler programının örnek
yapı sı aşağıda verilmiştir.
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
DAT SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
DAT ENDS
COD SEGMENT PARA ‘COD’
ANA PROC NEAR
ASSUME SS:STK, DS:DAT, CS:COD
....
....
ANA ENDP
COD ENDS
END
6.1 Segment
Komutu
Segment komutu programın kullandığı segment
kesimlerini tanımlamak için kullanılır. Program içinde tanımlanan herhangi bir segment segment registerleri tarafından takip edilir. Tanımlanan herhangi
bir segmentin hangi register
tarafından takip edil ecegi ASSUME deyimi ile tanımlanır.
Komutun kullanım şekli;
isim SEGMENT tip ‘sınıf’
şeklindedir.
Komut bir isim ile başlar.
Tanımlanan isim degişken olabilme kurallarına uygun
herhangi bir harf dizisidir. Tanımlanan isim program içinde yapılacak
atamalarda vb. işlemlerde kullanılabilir.
Tip segmentin
adreslenebilme tipini belirler. Bu deyim ile kullanılabilecek tip çeşitleri;
PAGE 256 Byte
ve katlarıyla adreslenebilen segment
PARA 16 Byte
ve katlarıyla adreslenebilen segment
WORD Word
ve katlarıyla adreslenebilen segment
BYTE Byte
ve katlarıyla adreslenebilen segment
Segment anahtar cümlesi ile başlayan bir segment
ENDS cümlesi ile son bulmak zorundadır.
Örnek
STK SEGMENT PARA ‘STK’
Tanimlar
Tanimlar
STK ENDS
STK SEGMENT PAGE ‘STK’
Tanimlar
Tanimlar
STK ENDS
6.2 Assume
Komutu
Mikroişlemciler program içinde
bellek kesimlerini takip edebilmek için en az 3 adet segment
registeri kullanır. Bu registerler
CS, DS, SS registerleridir. CS registeri
program kodlarını takip etmek için, DS registeri program
içinde sabit olarak kul lanılan verileri saklamak
için, SS registeri ise program içinde kullanılan
geçici verileri saklamak için kullanılır.
Program içinde belirlenen segmet kesimlerinden hangisinin hangi register
ile takip edilecegi assembler
derleyicisine Assume deyimi ile bildirilir. Komutun
kullanım şekli,
Assume register : segment
, register : segment ,
........ şeklindedir.
Örnek:
STK SEGMENT PARA ‘STK’
Tanımlar
Tanımlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanımlar
Tanımlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DS:DATA, SS:STK, CS:CODE
6.3 Proc
Komutu
Proc komutu Code segment içindeki bir işlem blogunun
tanımlanmasını sağlar. Tanımlanan bloklar bir procedure
davranabilirler ve diger bloklar tarafından CALL
komutu ile çağrılabilirler. Her assembler programı
içinde en az 1 işlem blogunun olması zo runludur. İlk çalışacak olan
blok segment başlanğıcındaki
bloktur. Bu bloktan diger bloklar çağrılabilir. Eger assembler program üst düzey
dillerden çağrılacak bir program ise ilk çalışacak blok çağrılan blok
olacağından segment başında olma zorunluluğu y oktur.
Komutun kullanılış şekli;
isim PROC tip
şeklindedir.
İsim, degişken
olabilme kurallarına uymak koşulu ile istenen herhangi bir harf dizisi
olabilir. PROC deyiminden sonra gelen tip FAR veya NEAR olabilir. Bu deyimler
ilerideki bölümlerde detaylı olarak anlatılacaktır. ilk çalışacak bölümün FAR, dige r bölümlerin NEAR olabileceğinin bilinmesi bu bölüm
için yeterlidir.
Proc deyimi ile başlayan herhangi bir program blogu ENDP deyimi ile sonlandırılmalıdır.
Örnek:
STK SEGMENT PARA ‘STK’
Tanımlar
STK ENDS
DATA SEGMENT PARA ‘DAT’
Tanımlar
DATA ENDS
CODE SEGMENT PARA ‘CODE’
BASLA PROC FAR
ASSUME DS:DATA, SS:STK, CS:CODE
Push DS
Push SS
Mov Ax, 15h
.
.
CALL ATLA1
BASLA ENDP
ATLA1 PROC FAR
.
RET
ATLA1 ENDP
ENDS
END
6.4 Call/Ret
Komutu
Call komutu herhangi bir işlem blogu
içinden bir başka işlem blogunu çagırmak
için kullanılır. Komut aynı segment içindeki(Near) işlem bloklarını çağırabileceği gibi farklı segment içindeki(Far) işlem bloklarını da çağırabilir.
Komutun kullanılış ş ekli;
CALL Çağrılan Blok Adı
Call komutunun işlenmesi sırasında mikroişlemci çağrılan bloga gitmeden önce code segment içinde bulunduğu adresi stack
segment içine saklar ve çağrılan yere dallanır.
Çağrılan blok içinde işlemler sona erdikten sonra stack
segmente saklanan adrese tekrar geri dönülür.
Çağrılan blok içindeki işlemlerin bittiği RET komutu ile belirlenir.
Ret komutu genel olarak
parametresiz kullanılır ve stack segment
içindeki bilginin CS:IP ikilisine aktarılmasını sağlar.
7. DEGİŞKEN VE SABİT TANIMLAMA
Assembler program içinde herhangi bir segment
kesiminde degişken tanımlaması yapılabilir. Değişken
ve sabit tanımlamaları;
DB
DW
DD
DQ
DT
DUP
Komutları ile yapılır.
7.1 DB Deyimi
Byte tipi bir degişkenin veya
sabitin tanımlanmasını sağlar. Tanımlama byte tipinde
bir alan olabileceği gibi dizi şeklinde bir alan da olabilir. Tanımlanan alan(ların) 8 bit olması nedeni ile bu alana 0 ile FF arasında
herhangi bir deger atanabili
r. Deyimin kullanılış şekli;
degişken DB ilk deger
Tüm değişken veya sabit
tanımlama deyimleri ile tanımlanan alanlara ilk deger
atama işlemleri tanımlama anında gerçekleştirilir. Eğer tanımlanan alana deger atanmayacak ise ilk deger
olarak ? atanmalıdır. Aşağıdaki atamalar geçerli atamalardır.
SAYI DB 30 ;ilk değeri 30 olan
SAYI sabit/değişkeni
SAY DB 0AH ;ilk değeri 10 olan
SAY sabit/değişkeni
ABC DB ‘ADI SOYADI’ ;ilk değeri
ADI SOYADI olan karakter dizisi
DIZI DB 0,1,2,3,4,5,6,7
;değerleri 0,1,2,3,4,5,6,7 olan byte dizisi
ilk değer ataması sırasında bir
dizi oluşturulacak ve dizinin içine belirli bir değer/değerler atanacaksa DUP
deyimi kullanılır.
ABC DB 10 DUP (?) ;içerikleri
olmayan 10 byte’lık bir dizi
ABC DB 50 DUP (0AH) ;İçerikleri
10 olan 50 byte’lık bir dizi
ABC DB 25 DUP (0,1) ;içerikleri
0,1,0,1.... olan 25 byte’lık bir dizi
7.2 DW Deyimi
iki byte’lık
bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış şekli;
degişken DW ilk değer
şeklindedir.
MESAJ DW 1210H
SAYI1 DW ?
SAYI2 DW 10 DUP(0)
SAYI3 DW 0,0AABH,CCCAH
7.3 DD Deyimi
Dört byte’lık
bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış şekli;
degişken DD ilk değer
şeklindedir.
MESAJ DD 12100000H
SAYI1 DD ?
SAYI2 DD 10 DUP(0)
SAYI3 DD 0,0AABC12H,0H
7.4 DQ Deyimi
64 bitlik, Sekiz byte’lık bir sabit/değişken tanımlamasının yapılmasını
sağlar. Deyimin kullanılış şekli;
degişken DQ ilk değer
şeklindedir.
MESAJ DQ 12100000H
SAYI1 DQ ?
SAYI2 DQ 10 DUP(0)
SAYI3 DQ 0,0AABC12H,0H
7.5 DT Deyimi
Seksen bit 10 byte’lık bir sabit/değişken tanımlamasının yapılmasını
sağlar. Deyimin kullanılış şekli;
degişken DT ilk değer
şeklindedir.