Assembly - Reverse Engineering
Asm"De Ozyinelemeli Fonksiyon Tasarimina Ornek
Asm"De Ozyinelemeli Fonksiyon Tasarimina Ornek
-
tasarlayacagimiz fonksiyon yalnizca parametre olarak aldigi onluk(decimal) sistemdeki sayiyi ekrana yazmaya yariyor.Tabiki burda fonksiyonun yaptigindan cok mantigi onemli cunku amac ogrenmek ;):)
oncelikli olarak bu isi C programlama dilinde en basit haliyle nasil yapariz.
printf("%d",Sayimiz);
printf bu is icin yazilmis standart bi c metodu ve sayi, karakter, karakter katari vs gibi cesit cesit veriyi ekrana yazabiliyor.
Ekrana bir sayi yazdirma isi c'de en basit haliyle asagidaki sekilde yapilabilir
void dprint(int nm)
{
printf("%d",nm);
}
Ancak amac ozyinelemeli bir fonksiyon yazmak oldugu icin yukardaki fonksiyonu eledik.
O yuzden hemen ozyinelemeli olarak yazilicak dprint fonksiyonunu tasarlayalim.Cunku daha assembly'e kadar inicez :)
C'de bu sekilde bi fonksiyon tasarlamak icin putchar fonksiyonundan faydalanabiliriz
putchar(int ch);
putchar yalnizca bir karakteri ekrana basmak icin tasarlanmis standart c metodu
Iste ozyinelemeli fonksiyomuz
void dprint(int nm)
{
if(!nm)
return;
dprint(nm / 10);
putchar(nm % 10 + '0');
}fonksiyondaki
if(!nm) sorgusunun ne yaptigi son derece acik.(tabikide kendi kendini cagirma olayinin bi yerde bitmesi gerekiyor.Bu nokta, degiskenimizin 0 oldugu noktadir)
Evet bu isi C'de yapmak bu kadar kolay :)
simdide asm kodunu asagiya yaziyorum
model small
.data
.stack
.code
main proc
mov ax,@data ;data segment
mov ds,ax ;ayarlandi
mov ax,456 ;parametre
push ax ;birakildi
call dprint
mov ax,4C00h ;dos icin cikis fonk kodu
int 21h ;kesme cagrildi
main endp
dprint proc
push bp ;bp stack'te saklaniyor
mov bp,sp ;bp sp ile kilitlendi
mov ax,bp[4] ;fonk parametresi ax'e alindi
TEST ax,ax ;0 kontrolu
jz dprint@1 ;sifirsa cikisa zipla
mov bl,10 ;bolunucek deger
div bl ;bolme islemi yapildi
xor dh,dh ;dh sifirlandi
mov dl,ah ;bolmeden kalan deger dl'ye alindi
add dl,'0' ;0 ascii kodu ile toplandi
push dx ;stack'e atildi
xor ah,ah ;ah sifirlandi
push ax ;parametre stack'e atildi
call dprint ;fonksiyon cagrildi
pop dx ;saklanan ve yazilacak deger cekildi
mov ah,2 ;fonk kodu
int 21h ;kesme cagrildi karakter yazildi
dprint@1:
pop bp ;bp eski degeriyle yuklendi
ret 2 ;fonksiyondan donuldu
dprint endp
end mainaslinda fonksiyonumuzn girisinde bp'yi stack'e atip saklamamizin bir anlami yok.Cunku bp'yi degistirmis olsakda programimizda kullanmiyoruz.Yinede standartlara uyum saglamak acisindan bunu yapmakta yarar var.En azindan el aliskanligi olsun :)
Umarim yararli olmustur.
-
sitede asm bilen pek adam kalmadı teşekkürler emeye saygı olsun =)
-
evet dogru soyluyosun ama bu durum yalnizca tahribatta degil,genelde de boyle..
ama su bilinmeli ki asm dili yazilimin en temel dilidir ve bana kalirsa her programcinin asm dilini bilmesi gerekir.
-
bazıları öle düşünmüyor hatta vb gibi basit tabanlı dillerin en kral dil oldugunu savunan bile var
-
bazi insanlar elindekiyle yetinemez.Her zaman daha fazlasini ister.
bazilari elindekiyle yetinmesini bilir.
diger bazilari ise elindekiyle yetinir ve ayni zamanda kendini mutlu edebilmek icin en iyisinin kendinde oldugunu savunur.:)
Arkadaslar konu bilgisayar oldugunda elimizdekilerle yetinmeyelim ..!
sosyal mesajida verdigimize gore yolumuza devam edebiliriz :)
-
Eyvallah hoca,dökümanlara ekleriz artık bunu,ama nedense asm bende dahil çok soğuk geliyo insana,okulda asm dersini geçene kadar anam ağladıydı :)