PDA

Tam Sürümünü Görmek İçin : assembly


mkx
18/06/2004, 22:29
yüksek seviyeli diller çıktı mertlik bozuldu.oysa bir çok programcı bilir ki assembly ile programlamak da zevklidir(tabii assembly ile büyük çaplı projeler yapmayı beklemeyin).assembly bilmek ne kazandırır insana?
*assembly(makine dili) demek hız demektir.tüm diller derlendiğinde assembly'e dönüşür(cpu emir takımına).doğrudan işlemcinin anladığı dil ile yazdığımız için kod çok hızlı çalışacaktır.
*assembly ile her işlemi adım adım yaptırırsınız bilgisayara.herşey sağlamdır.assembly ile programlama kibrit çöpünden ev yapmaya benzer.
*virüs ya da antivirüs yazmak isteyenler için birebirdir.
*ara sıra c/c++ kodunuzun içine koyarsınız,güzel olur.
*sistem programlamak,sürücü yazmak,dış cihazı bilgisayarla yönetmeye çalışmak için de gerekli.
ancak...
*yazılan programlarda hataları bulmak güçdür.
*yüksek seviyeli işler için program yazmak imkansızdır.
*offset,jump,branch gibi kavramlar çok iyi bilinmeli,debugger gibi bir beyine sahip olunmalı.
*işlemcinizin registerları,emir takımı bilinmeli(kaç bitliktirler falan filan)
Assembly kodlamak için,turbo assembler,microsoft assembler ya da debug kullanılabilir.


MEHMET
18/06/2004, 22:31
birde assembly öğrenmek ders gecmenize yarar.
referans sessiztetik 2001 II.yarıyıl dönemi

:))

mkx
18/06/2004, 22:34
genelde okullarda motorola 6800 emir takımı öğretilir.bunu öğrenenler ille de bununla program yapmak istiyorlarsa,emülatör kullanırlar.

cL
18/06/2004, 22:37
Şöyle bir giriş yapsanız.Ders kıvamında bir şey olsa...

acemi
18/06/2004, 22:38
assembly(makine dili) demek hız demektir.tüm diller derlendiğinde assembly'e dönüşür(cpu emir takımına).doğrudan işlemcinin anladığı dil ile yazdığımız için kod çok hızlı çalışacaktır.

Birebir karsiligi olmakla birlikte assembly ve makine dili farkli seylerdir. Assembly kodu da assembler'lar sayesinde calistirilmadan once makine diline cevrilir

MEHMET
18/06/2004, 22:43
:)
yani makine diline en yakın olan dil assembly dilidir.
bu arada ders kıvamında başlamak için mikroişlemci mimarisini bilmek gerekiyor acaba nekadar bilgi sahibisiniz?

mkx
18/06/2004, 22:50
makine dili ile assembly farklı şeylerdir.evet.makine dili sayılardan oluşur.her emir hexadecimal bir sayıdır(gerçi ne farkeder,decimal,binary ya da hexadecimal.bir sayıdır sonuçta).assembly ise mnemonic denilen sembollerden oluşur(emirlerin kısaltması).örneğin intel işlemcilerinde MOV komutu,motorolalarda LDA gibi.mnemoniclerle yazarken adresleme modlarını sembollerle belirtebilirken,makine dilinde her mod yine farklı sayıya karşılık gelir.(doğrudan adresleme gibi)

selami_32
18/06/2004, 22:51
xp'de komut istemine geç
debug (enter)
a
mov dx,bx
mov cs,dx
jmp dx

komutlarını yaz sırayla enterle
g yaz entere bas NTVDM hata versin aynı şeyi 98'de denersen bilgisayar da kötü şeyler olabilir basit olarak mov ne demek, dx, bx register de nasıl oluyor 8086 programlama mı ne jmp ne nedir yani kullanmayacaz ama bilelim.

cL
18/06/2004, 23:09
:)
yani makine diline en yakın olan dil assembly dilidir.
bu arada ders kıvamında başlamak için mikroişlemci mimarisini bilmek gerekiyor acaba nekadar bilgi sahibisiniz?


Mikroişlemci mimarisinden başlasak. :)

Euclides
18/06/2004, 23:12
Aslında genelde "Assembly" denildiğinde IA-32 Assembly anlaşılır.BU yüzden akla PICasm yada "motorola 6800" asm gelmemelidir.
(Nasıl ki "Lamba" denildiğnde "Florasan Lamba" anlaşılmıyorsa)
(tabii assembly ile büyük çaplı projeler yapmayı beklemeyin)
bugün win32'de asm ile program yazmak c++ ile program yazmaktan daha kolay bir hal aldı :) :) öyle ki asm ile yazılmış asm editörleri var :)
Pek çok Masm32 macrosu sağolsun :)

Bence asm öğrenilmesi zorunlu bir dildir.Eğer ki siz PC'yi anlamak istiyorsanız asm öğrenmek zorundasınız :)

Öğrenmek İsteyenlere kaynaklar:
www.masm32.com
www.masmforum.com
http://board.win32asmcommunity.net/

MEHMET
18/06/2004, 23:34
bu konuda kesinlikle size katılmıyorum.
yani assembly sadece bilgisayarı anlamak için değil program yazmak içinde kullanılmalı. tabi tamamaen assmebly de yazmayı kastedmiyorum.

mkx
18/06/2004, 23:37
registerlardan başlayabiliriz.registerlar(türkçeye yazmaç diye çevirmişler) cpu'nun datayı tutmada kullandığı en küçük bellekler.16 bitlik olanları ax,bx,cx...32 bitlik olanları eax,ebx,ecx...(extended ax,...) bunlar genel amaçlı registerlar.geçici olarak bunlarda adres ya da veri tutulabilir.bir çok register var.index register,program counter(instruction pointer),gibi diğer registerlar.bunlar da işlemciye göre değişiyorlar.z80'lerde ix index register,x86'larda is kullanılıyor(32 bitliği eis).
genel amaçlı registerların 8 bitlik anlamlı ve anlamsız kısımları da ah,al,bh,bl...şeklinde kullanılır.neyse örneğin intel işlemcisi için şu kodu inceleyelim.
IN AL,60
CMP AL,10
bu komut 60(hexal 96) portunda datayı alıp ax'in anlamsız kısmına yükler,okunan veriyi 10'la(hexal 16) karşılaştırır.IN komutu ilgili porttan datayı okur.porta yazmak için OUT komutunu kullanırız.CMP ise çıkarma işlemi yapan bir komuttur.karşılaştırma yapar.sonuç 0 ise ilgili bayrak(zero flag) 0 yapılır.örneğin sonra şu komutu girmiş olalım;
JNZ 1000
JNZ=jump not zero
eğer bayrak 0 değilse 1000 adresine git manasına gelir.IN,CMP,JNZ mnemoniclerdir.makine dilinde E4 ya da E5'e karşılık gelirler.
iyi bir giriş oldu umarım.

MEHMET
18/06/2004, 23:37
Mikroişlemci mimarisinden başlasak. :)
ben şahsen bua burada başlayacağımızı zannetmiyorum. burada daha çok web programalama konusunda yardım alabilirsin.
mikroişlemci mimarisi hakkında bilgi almak istersen mithat uysalın kitabından başlayabilirsin

Euclides
18/06/2004, 23:38
xp'de komut istemine geç
debug (enter)
a
mov dx,bx
mov cs,dx
jmp dx

komutlarını yaz sırayla enterle
g yaz entere bas NTVDM hata versin aynı şeyi 98'de denersen bilgisayar da kötü şeyler olabilir basit olarak mov ne demek, dx, bx register de nasıl oluyor 8086 programlama mı ne jmp ne nedir yani kullanmayacaz ama bilelim.
BU tip programlara 16-Bit DOS Real Mode Programming deniyor
O kadar eski bir şey ki artık XP desteklemiyor.Ve bu tip programları simulasyon ile çalıştırıyor :(
Sana bir helloworld örneği... Buda 16-bit'tir...

C:\>debug
-a 100
0C77:0100 jmp 110
0C77:0102
-e 0102 "Hello World$"
-a 110
0C77:0110 mov ax,cs
0C77:0112 mov ds,ax
0C77:0114 mov dx,0102
0C77:0117 mov ax,900
0C77:011A int 21
0C77:011C int 20
0C77:011E
-r cx
CX 0000
:1E
-n hello.com
-w
0001E bayt yazılıyor
-q

C:\>hello
Hello World
C:\>

Euclides
18/06/2004, 23:41
bu konuda kesinlikle size katılmıyorum.
yani assembly sadece bilgisayarı anlamak için değil program yazmak içinde kullanılmalı. tabi tamamaen assmebly de yazmayı kastedmiyorum.
Kuşkusuz ki haklısınız. Tüm Packer'lar, Exe Sıkıştırıcılar, Şifreleyiciler hepsi asm ile yazılmışlardır...

MEHMET
18/06/2004, 23:42
hımm arkadaşlar bence siz bu konuda gayet ciddisiniz yani assembly öğrenme konusunda.
acaba bu konuda gercekten birşeyelere başlamak mı gerek?
fikri olan varsa yada isteyen arkadaşlar mircta bir sohbet edebiliriz. benim aklımda bir şeyler oluşmaya başladı.

cL
18/06/2004, 23:50
16 bit olması ne anlama geliyor ya da 32 bit olması?Ne değişir?

0C77:0110 mov ax,cs
Mesela yukarıdaki kodda ne işlem yapıldı.

mkx, bayağı karışık bir şeymiş. :)

MEHMET
18/06/2004, 23:53
16 bit olması ne anlama geliyor ya da 32 bit olması?Ne değişir?

0C77:0110 mov ax,cs
Mesela yukarıdaki kodda ne işlem yapıldı.

mkx, bayağı karışık bir şeymiş. :)
16 bit ile 32 bit arasında dunya kadar fark var. yani en basitinde veriyolu iki kat artıyor. bir de komut setinde tabi artmalar var.vs vs
0C77:0110 mov ax,cs ; ise kod segmetindeki veri ax kaydedicisinin içeriğine atanıyor. bu da 0C77:0110 adresinde saklanıyor.
:)
yanılmıyorsam tabi

mkx
18/06/2004, 23:54
code segmentteki data ax registerine yazıldı.16 bit olması demek registerin 16 bit datayı tutabilmesi demek,32 bit olması demek 32 biti tutabilmesi demek.64 bitlik işlemciler üretildi,bu 64 bitlik registerlar geliyor anlamına gelir.

mkx
18/06/2004, 23:56
assembly öğrenmek orta seviyeli ya da yüksek seviyeli dil öğrenmekten farklıdır.donanıma çok bağlıdır.bundan dolayı daha fazla ön bilgi gerektirir.yüksek seviyeli bir dilde donanımı göz ardı ederek te program yazılabilir.günümüzde programlama dilleri artık nesne modelli olmaya başladı.microsoft kernelinde bile bu tarz yaklaşımı benimsemiş.ama bu yavaşlık demektir,işlemciyi daha fazla yormak demektir.linux C ve assembly kullanıyor kernelinde,herhangi nesne modellemeye gidiş yok.amacım linux vs windows tartışması yaratmak değil tabii.assembly bilmek sadece pc'nin nasıl çalıştığını bilmek anlamına gelmez demek istediğim.sistem programlamadaki yeri göz ardı edilemez.

Euclides
19/06/2004, 00:10
16 bit olması ne anlama geliyor ya da 32 bit olması?Ne değişir?

0C77:0110 mov ax,cs
Mesela yukarıdaki kodda ne işlem yapıldı.

mkx, bayağı karışık bir şeymiş. :)
16-Bit CPU:
CPU registerleri en fazla 0xFFFF(16bit) değerini alabilirler,Hepsi sadece real modda çalışır.
(32-bit CPU'larda 16-bit programları çalıştırabilir.)

RealMode:
Çok kabaca söyle;
Hatırlıyormusunuz bilemiyorum.Ama eskiden PC'ler 2 programı aynı anda çalıştıramazlardı.
İşte o tip CPU modu.

0C77:0110 mov ax,cs
Mesela yukarıdaki kodda ne işlem yapıldı.

Eski cağlara tekrar dönelim.
Diyelim sizin 1mb RAM'imizi var.Fakat siz en fazla 65535'e kadar sayabiliyorsunuz. hafızanızın 221345.'ci byte'ına nasıl ulaşırısınız ? söyle yapsanız olur mu: "3" tane "65535" git sonra "24740" daha git.İşte buradaki "3"'e "segment" ""24740"'ede "offset" deniyor.
(Tam hesaplanması söyle
Gerçek Adres=Segment*16+Offset)
CS sizin programınızın çalıştığı segmentin değerini gösteriyor.

YUkarıdaki komut ile AX'e CS'nin değerini aktarmış oluyorsunuz.

(Yukarıdaki TÜM açıklama ve hesaplamalar Real Mod için geçerldir.
Windows,Linux gibi Protected Mod kullanan sistemlerde HİÇBİR şekilde geçerli değillerdir. !!!)

mkx
19/06/2004, 00:21
offset ve segment olayını çok iyi açıklamışsın euclides.işte bu aynı anda tek işlem yapabilen işletim sistemi örneği dos'tur.sonra multitask yapan sistemler çıktı.peki bu sistemlerde doğrudan porta erişmeyi mümkün kılan,örneğin bir c fonksiyonu olan outport() kullanmak mümkün müdür?sonuçta bu kodun anlamı OUT 'dur.

cL
19/06/2004, 00:29
Şimdi biraz daha iyi anlıyorum fakat hala çok karışık geliyor.

Neden ax'e cs'nin değerini aktarma gereğini duyduk ve diğer kodlardada benzer şeyleri neden yaptık?

mkx
19/06/2004, 00:42
ax,bx,cx...gibi registerlar ara değerleri saklamada kullanılabilen registerlardır.mesela "mov ax,cs" demekle o an programın çalıştığı segment değerini ax'de tutmuş olurum,bunu şöyle de düşünebilirsin,yüksek seviyeli bir dilde ara değişken tanımlamak gibi,sürekli istediğin gibi setleyip değiştirebiliyorsun,cpu buna imkan veriyor.ama cs'yi işlemci kendisi hesaplıyor.
IN AL,60
örneğinde olduğu gibi,60 portundan değer okuyorum ve bunu içeriğini değiştirmemde sakıncası olmayan ax'e yazıyorum(orada saklıyorum).işim düşünce ax'den okuyorum.

Euclides
19/06/2004, 01:36
sonra multitask yapan sistemler çıktı.peki bu sistemlerde doğrudan porta erişmeyi mümkün kılan,örneğin bir c fonksiyonu olan outport() kullanmak mümkün müdür?sonuçta bu kodun anlamı OUT 'dur.
Multi Tasking sistemlerde bu olay mümkün değildir. Eğer bir program "out" komutu çalıştırmaya çalışırsa Protection Fault Meyda gelir.
Bir Porta giriş/çıkış yapmak için en sık şu 2 teknik kullanılır.
1.)
İşletim sisteminizinin aracılığında i/o yapmak.
Ör:Windows'da "CreateFile" api'si COM1,LPT1, gibi noktaları kullanmanıza izin verir.Fakat şeçebileceğiniz portlar çok kısıtlıdır.
2.)
Sizi programınıza ait IOAccessMap'i değişrip belirli port(veya portlar) için "out" komutunun kullanımına izin vermek.Eğer bu izin verilmişse out komutu herhangi bir hata vermeden programınızda çalışacaktır.
(Win9x sistemlerinde bazı portlar için bu izin default olarak verilir.)
IOAccessMap'in ayarlanmasi ile ilgili örneği http://www.logix4u.net/inpout32.htm adresinden indirebilirsiniz.

mkx
19/06/2004, 01:47
ve bu kısıtlama windows versiyonları geliştikçe değişiyor galiba.win98'de donanıma erişmek winxp'ye göre daha kolay galiba.sadece api seviyesinde erişime izin var.yanlışsam uyarın.

Euclides
19/06/2004, 09:38
Xp'de bir porta diretk erişmek için driver yazmak sorunda kalıyorsunuz.Oysa win9x'lerde hiç böyle şeylere girmeden de erişmek mümkün

Euclides
19/06/2004, 09:51
Şimdi biraz daha iyi anlıyorum fakat hala çok karışık geliyor.

Neden ax'e cs'nin değerini aktarma gereğini duyduk ve diğer kodlardada benzer şeyleri neden yaptık?
Programın açıklaması şöyle:
jmp 110 ;Biz şu an 100'de bulununyoruz bu komut programın +16 byte sonraki komuta şıcramasını sağlıyor. Bunun sayesinde "Hello World" string'imizi açtığımız bu küçük boşluğa yerleştiriyoruz.

mov ax,cs
mov ds,ax
;Kısaca DS'e(Data Segment) Cs'nin değerini verdik
jmov dx,102;Dx=Stringimizin başlangıç noktası(offseti)
mov ax,900
int 21h

BU komut ile bir "Interrupt" çağırmış oluyoruz.DOS'ta int'ler bir nevi işletim sisteminin fonksiyonlarıdır.Siz dosya işlemleri,grafik işlemleri vb.... yapmak isterseniz bunu DOS'a söylersiz oda bunun yapılıp yapılamayacağına karaverir.
Uyugnsa yapar.

DS:DX=String'in adresi
AH=09h
Int 21h
Bu Fonksiyon dos'ta string'leri ekrana yazdırmak için kullanılır.
jint 20;Her *.com programı bu int ile sisteme dönmek zorundadır. Yani dos'a işlem tamam artık beni kapat diyoruz.

HunTER
19/06/2004, 10:10
Cok eskıden basic ıle muhasebe programları yazan bı tanıdıgım, menulerı cızdırmek ıcın assembly kullandıgını soylerdı.. Boylece 286 makıneler bıle o menulerı cok hızlı goruntuleyebılırmıs..

Ama sızcede o gunler bıraz gerıde kalmadımı :)

Euclides
19/06/2004, 10:13
win32 assembly var. asm=dos demek değil !

HunTER
19/06/2004, 10:26
Pekı mesela guncel hayattan ornek verılebılırmı? Ornegın bugun neden win32 assembly kullanmalıyız yada ne zaman ıhtıyac duyarız ona?

Yada alternatıfı varmıdır? Kullanmaz ısek nelerden odun vermıs oluruz.. Sadece performansmı ornegın? Oyleyse gunumuzun hızlı bılgısayarları ıle bu performans farkını algılayabılırmıyız?

Not: Sızı elestırdıgımı sanmayın.. Bende tıpkı cL gıbı aslında asm'nın bugun ne ıcın kullanıldıgını ogrenmeye calısıyorum, hepsı bu..

Euclides
19/06/2004, 12:28
Neden Asm kullanmamız gerektiği üzerine bir tartışmayı buradan okuyabilirsiniz.
http://board.win32asmcommunity.net/showthread.php?s=&threadid=18592
-------------------------------------
Benim asm kullanma sebebim ise, bana c++ gibi diller programcıya aşırı bir yük getiriyor. program yazmak hammalık oluyor. Mesela c++'da pointerların dahi bir tipi var.Oysaki asm de sadece 5 tip değişken vardır.byte,word,dword,fword,qword
mesela "HANDLE","HMODULE","HINSTANCE" hepsi aynı şey olduğu halde bir birlerini dönüştürken tanımlamam gerekiyor :(
-------------------------------------
C++ ile uygulamanın imkansız olduğu programlama tekniklerni asm ile kullanabiliyorum.
Ör:
Bir program yazalım girilen fonksiyonun grafiğini çizsin.
Doğal olarak önce verilen stringi paçalayan ne yapılması gerektiğini anlayan bir fonksiyon yazacaksınız.
Bunu c++ ile yazdığınızda ve fonksiyonu her çağırdığınızda verilen string'i tekrar ayrıştırmak zorunda kalacaksınız.Veya bunun benzeri olan bir işlem yapacaksınız.
Ama asm kullanırsanız programınız verilen fonskyonun işlemlerini yapan yeni bir program parcası oluşturabilir.
Hız farkı bu tip bir programda net ayırt edilebilir olacaktır.
-------------------------------------
Assembly ile yazdığınız programlar sadece sizin istediğiniz kodları içerirler.Bu yüzden çok küçük programlar yazabilirsiniz.Ör: 800 byte büyüklüğünde olup pencere çıkartan programlar yazılıyor.
Tom Raider : Dark Angel adlı oyunu oynadınız mı ?(zaten kötü bir oyundu :) :))
Oyun açılmadan önce yaptığınız ayarlarda SSE,3DNow,SSE2 gibi SIMD sistemlerinin kullanılıp kullanılmayacağını ayarlayabiliyorsunuz.
MMX,SSE,SSE2,3DNow gibi sistemlerle renk,matris hesaplamalarınızı hesaplamalarınız çok daha hızlı yapabilirsiniz.Bu tekniğe kısaca SIMD(Single Instruction Multiple Data) denilmektedir.Assembly ile bu yöntemleri kullanabilirsniz.
Burada bir noktanın altını çizmek istiyorum.Visual C++ gibi derleyicilerdeki SIMD desteği çoğu zaman yanlış anlaşılıyor.Bu destek sadece sizin inline asm ile simd komutlarını kullanabileceğinizi göstermektedir.

mkx
19/06/2004, 13:06
neden assembly kullanıyorum?aslında bunun cevabını da ilk yazdığım yazıda belirtmiştim.alçak seviyeli işlerle uğraşmayı seviyorsanız(low level) assembly vazgeçilmez oluyor.alçak seviyeli işlerden kastım,hiç virüs gibi çok az yer kaplayan programlar yazmayı denediniz mi?ya da dmac chipini programlayarak ekran kartına birşeyler çizdirdiniz mi,pic'i,interrupt controller chipini,step motorları programlamayı denediniz mi?elbette bunları programlamak için illa ki assembly gerekir demiyorum.ama bu işleri araştıranların karşısına mutlaka assembly çıkmıştır.sistem programlama ile ilgilenenler,linux kernelini karıştıranlar da assembly ile karşılaşır.bir çok oyunun kaynak kodunda bile görülebilir assembly kodlar.her ne kadar işlemciler çok hızlansa da,işlemciyi verimli kullanmanın bir yoludur assembly.

mkx
19/06/2004, 14:24
linux çekirdek geliştiricileri mutlaka C kodlarının arasına assembly kodlarını yerleştirirler.gcc'nin assembly sözdizimi ile ilgilenenler için;

http://www.belgeler.org/howto/linux-inline-assembly_syntax.html

mkx
19/06/2004, 14:38
ayrıca örnek asm kodları,dersleri vs.
http://www.hc08.cz/sw_tutorials/assembly_tutorials/index.htm

mkx
20/06/2004, 18:49
bu kod imleci değiştirmenizi sağlar.

mov ch,00
mov cl,0F
mov ah,01
int 10
int 21

debugda yazıyorsanız iki kez enterlayıp
"-g address" yazıp program sonlandırın.(address programın sonlandığı adres olabilir.(ya da ilerdeki bir adress).program o adrese kadar çalıştırılır,hata yoksa "program terminated normally" mesajı gelir)
-n ile programa isim verip kaydedebilirsiniz.imlecin kare imlece dönüştüğünü göreceksiniz.şimdi kod üzerinde oynayalım;

mov ch,1A
mov cl,12
mov ah,01
int 10
int 21

girin.bu kez de imlecin kaybolduğunu göreceksiniz.ilk iki satırın değerlerini değiştirerek imleci değiştirebilirsiniz.burada imlecin ilk pixel değeri cx registerinin anlamlı 8 bitine,ikinci pixeli anlamsız 8 bitine yazılır.10 nolu interrupt işlevinin 01 alt işlevi çağırılır.10 nolu interrupt video-bios kesmesidir.21 nolu interrupt dos servis kesmesidir.

esmaeild
21/06/2004, 13:13
hocam az çok assembly bilgimiz var ama. bayağı eskiden kalma. Assembly ile Windowsun GUI sine bir harf koyabilceğim bi kod varmı elinizde. veya aklınıza gelen bir yöntem? (Assembler demiyorum bunu ayıralım lütfen)

Euclides
21/06/2004, 15:36
Assembler demiyorum bunu ayıralım lütfen

zaten eğer sen 32-bit Assembly ile program yazmak istiyorsan bir "Assembly derleyicisine" yani "Assembler"'e ihtiyaç duyarsın.....Yani "debug" sana hiçbir zaman sana 32-bit offsetler veremez, PE header oluşuturamaz....

www.masm32.com'da microsoft assembleri'i indirirsen içinde bir sürü windows gui örnek kodu var.

Yok eğer Exe mimarisi ile ilgili bilgi isitiyorsan
Part1
http://www.msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx
Part2
http://www.msdn.microsoft.com/msdnmag/issues/02/03/PE2/default.aspx

mkx
21/06/2004, 16:24
evet masm32 ile birlikte bir çok windows gui örneği geliyor.ama ben senin istediğin kodu anlamadım.windows gui'sine bir harf koymak?

esmaeild
21/06/2004, 17:05
benim bu güne kadar yazdığım assemby(assembler değil) kodları hep command için bulduğum tüm assembly kodalarıda öyle. ekrana harf koy. ASCII kodları dök, ekranın belli bir bölümünü scroll yap vs. ben bunları Assembly ile GUI de çıkartmak istiyorum. assemler ile bu çok kolay. hatta hazır yazılmışları var. Ben Arayüz oluşturmak istiyorum. Aynı Linuxtaki X Desktop gibi ama assembly ile veya Windows taki gibi. tabiki bu kasacak bir şey. ama bulduğum tüm kaynaklar dos'a hitap ediyor. windowsun GUI siyle oynayacak adresleri bulamıyorum.

Euclides
21/06/2004, 17:16
Abi ne yaptın ? :)

Windows öyle bir olay değil Daha doğrusu Protected mod öyle bir olay değil.
Yani windows zaten bir gui sistemi ile geliyor. Senin linux deki gibi yok ben bunu beğenmedim deme şansın yok. Ha senin çizmene izin verir windows ama seninin programlamana izin vermez...


Bİr başka değişle windows altında çalışıan istisnasız tüm programlar win32 api kullanmak zorundadır.


Sana tavsiyem IA-32 manuallerdeki Protect Mod kısmın okuman. Daha sonra Win32 SDK'ya göz atman....

Ayrııca
1....
Assembly ile programlamak ve Assembler ile programlamak arasında en ufak bir fark yok
2'si tamamen aynı şeyler....!!!!
2......
Benim gösterdiğim örneklerde hazır yazılmış bir gui yok....

esmaeild
21/06/2004, 17:24
Assembly ile windowsun arayüzünün ofset adreslerini kullanarak bu ara yüzle üzerinde şekiller çıkarmak istiyorum. bu adresler nerden başlar nerde biter.

Euclides
21/06/2004, 17:28
Cevap
Hiçbir yerden başlamaz ve hiçbir yerde bitmez....
böyle adresler yoktur....
aynı işi gören portlarda yoktur...

esmaeild
21/06/2004, 17:29
Assembly ile assembler yazabilirsin ama assembler ile assembly yazamasın. assembly bir derleyiciye ihtiyaç duymaz. assembly kodlarının direkt makina kodu karşılıkları vardır. assembler kodları assembly kodlarından türetilmiş kodlardır. ve bir derleyiciye ihtiyaç duyar. nasıl aynı yani?

mkx
21/06/2004, 17:33
assembler,assembly instructionlarını makine koduna dönüştüren programdır.tasm,masm,nasm...bunlar assemblerdir.

Euclides
21/06/2004, 17:39
@esmaeild mkx gerekli cevabı vermiş ....

esmaeild
21/06/2004, 17:43
assemblynin makine diline dönüşmesi için assemblere ihtiyacı yoktur. bahsettiğin assembler programları henüz doğmadan öncede assembly vardı. assembly nin makinediline dönüşmesi için compiler a da gerek yoktur. örneğin debug modda assemly kodu yazarsın m ile prog listi aldınmı makine kodu karşılığını alırsın. (veya tam tersi) burda assembler nere iş yapar nerde nezaman çalışır.

mkx
21/06/2004, 17:53
ben şunları bilmek istiyorum,kısaca açıklarsan sevinirim.
assembly nedir?
makine kodu nedir?
assembler nedir?
ayrıca debug'ın -m komutu ne işe yarar?

esmaeild
21/06/2004, 18:08
assembly direkt işlemciyle muhattap olan ortam işletim sistemi başka bir programlama dili vs. bağımsız. bir compilera ihtiyaç duymadan lda sta jmp vb. temel komutlar ve registerler sayesinde 5A AF 00 D0 vb. hex (makina kodlarıyla bizleri muhattab olmaktan kurtaran mkaina dilinden sonra icat edilmiş en temel dildir.

assembler assembly dilinin daha kolay yazabilsinler diye insanlar dili birazdaha insana yaklaştıran assembly kodlarına benzer fakat farklı kodlama sistemi olan yazılanların bir derleyiciyle makina koduna dönüştürüldüğü dildir.

m komutuda da memorynin bellibir bölümündeki verileri başka bir bölümüne transfer etmeye yarar

orda bir hata yapmışım el sürçmesi D olacaktı özür.

bide sen bildiğin kadarıyla bu kavramları açıklarsan sanırım birbirimizi anlıyacaz

esmaeild
21/06/2004, 18:11
fakat mesaim bitti hocam. ben çıkıyorum servise yetişmem lazım yarın devam edelim.

mkx
21/06/2004, 18:13
sadece assembler konusunda farklı düşünüyoruz.assembler bir dil değil,tool'dur.

Euclides
21/06/2004, 19:04
debug modda assemly kodu yazarsın m ile prog listi aldınmı makine kodu karşılığını alırsın. (veya tam tersi) burda assembler nere iş yapar nerde nezaman çalışır.
"debug mod" diye bir olay yok......
dos'taki "debug" programı bir assembler'dir... FAKAT çooooook embesil ve hayindir...... :P :P

Kaynak Intel IA-32 Manuals

assembler:
mov eax,12345
xor edx,edx
vb.... komutlarını makina diline çeviren programlardır.... başka bir şey yapmazlar...



Lütfen Lütfen Lütfen Lütfen Intel IA-32 Manulaleri indiriniz.... Intelin resmi sitesinden bulabilirsniz..... www.intel.com

bu tüm anlatıklarının hepsi real moda ,single thread vaktinden kalma şeyler...
biliyorsun artık insanlar hem winamp ile mp3 dinleyip hemde internete sörf yapabiliyor....

Artık MultiTasking var......Artık Protected Mod var......


m komutuda da memorynin bellibir bölümündeki verileri başka bir bölümüne transfer etmeye yarar

Artık bu komut öyle bir tranfer yapamazsın.... Protected moda aykırı.......

Bak şöyle ifade edeyim:

Protected modda 10 tane program 0017:00400000 adresini okusa hepsinin okuduğu o programa hastır... hepsi farklı şeyler okur......

sımone
21/06/2004, 23:01
Valla Assembly bilmek iyi hoş bencede ama benimki gibi bir hocanız olursa sizi soğutabilir. Ya dersten kalacam zaten final sonucunu bekliyorum.Adam finalde 8086 işlemcisi ile hapishane güvenlik sistemini tasarlayın demişti.tabi bende sen yeterki iste hocam dedim:)

mkx
21/06/2004, 23:16
bizim de buna benzer sorularımız olmuştu.soğumamak içten bile değil.neyse önemli olan felsefeyi özümsemek.not,sinav olmadan,zorlamadan güzel güzel öğreniyor insan...

sımone
21/06/2004, 23:29
haklısın dostum Assembly e karşı bir lafım yok iyice öğrenmek isterim yine vaktim olduğum zaman en azından şu başka chipler ile yada bilgisayarın başka elektronik aletlerle haberleşmesi çok ilgimi çekiyo orda kullanabilirim galiba

esmaeild
22/06/2004, 08:32
hocam aslında aynı şeylerden bahsediyoruzda. benim assembly ile uğraştığım yıllar 1990 lardı. ozaman 10 yaşındaydım çocuk aklımızla ancak bu kadar anlayabilmişiz mazur görün. ozamandan şimdiye kadarda ilkdefa cevizforum da assembly başlıklı yazıyı görünce heyecanlanıp uzun zamandır aklıma takılan Windows GUI olayını sorayım dedim. makinadilinde poretect yoktur. (en azından bizamanlar yoktu) biz Sayın Baytan BİTİRMEZ'in, Seyfettin ÇANKAYA'nın, Ayhan KALAYLIOĞLU'nun, Tuna ERTEMALP'in o zamanki öğretici yazıları sayesinde hex kodlarla program yazacak duruma geldik. (80 kolon Amstradı nasıl sonsuz kolona çıkarırız, 5 buçuk inç diskin ulaşılamayan bölümlerine nasıl veri yazarız, hdd nin ışığını kodla nasılı yakar söndürürüz vb.),Ama acizane beynimiz kaldırmayınca uzun bir süre ara verdik. Şimdide bir yerlerden tekrar başlıyoruz işte.

armasis
22/06/2004, 10:52
assembly' i temel olarak bilmeli bence,ama fazla abartmamak lazım çünkü çok karışık. bu devirde artık hız önemli olduğu için .net vb. gibi görsel dillere geçmek lazım ondan sonra. Birde Türkiye'de iş bulabilmek için tabi:)

esmaeild
22/06/2004, 11:09
evet bende bu yüzden .NET eğitimi alıyorum şu anda hatta bu eğitime o kadar önem veriyorum ki kazancımın büyük bir kısmını bu eğitim için harcadım. 2 hafta önce son taksidimi yatırdım. toplam 6 milyar ödedim. Bitti çok şükür. Ben hızlı uygulama geliştireyim, para kazanayım diyorsan .NET bu iişin adresi. Ben kafa patlatayım bit kaydıriyim, 3 değişkenle takılayım bana yeter, sınırsız olayım, windowsta kim olaki diyorsan, bu işi eğlence için yapıyorsan, algoritma kurmak en büyük zevkinse benim muhattabım cpu diyorsan bunun adreside assembly dir.

mkx
22/06/2004, 11:21
neden assembly kullanılır sorunundan daha önce de bahsettik.bilgisayar dünyası yüksek seviyeli dillerden ibaret değildir.iş bulmak da önemli ama şu önemsiz bu önemsiz derken türkiye sadece veri tabanı yazan,web programlayan bilişimcilerin ülkesi olmaktan öteye gitmiyor.

esmaeild
22/06/2004, 11:46
mkx e tamamen katılıyorum. üst düzey diller, bize sadece üst düzey komutları tasarlayanların sen bukadarını yapabilirsin. burdan sonrasını yapamazsın diyebileceği dillerdir. örneğin .NET te windowsun çekirdeğini kullanırsın sonuna kadar ama çekirdek kodlarını değiştirmeyi bırak göremezsin bile. amaç neyaprsan yap windows platformuna bağlı kaldır. bu tür yaklaşımların sonucunda windowsu bilgisayar zanneden insanları etrafımızda bolca görmek bu işin olası sonucudur yada algoritma bilmeden program yazabileceğini sananları.

armasis
22/06/2004, 12:43
yanlış anlaşıldı galiba söylediğim. önemsiz demedim assembly için.. her programcının başlarken uğraması gereken noktalardan biridir, onda hemfikiriz. benim kastettiğim bu ülkede şu an çoğu insan için önemli olanın iş bulma problemi olması. bu yüzden en çok kullanılana yönlenmek lazım bir an önce, hobi olarak assembler a devam edebilir insanlar.
hatta bu işi çok benimseyip oturup işletim sistemi de yazabilir belki bunun ilerisinde, diğer arkadaşları bilmiyorum ama şahsen hobi olarak uğraşmaya vakit de kafa da yetmiyo.

Türkiye' nin veritabanı programcısı dolu olması çok normal, bu iş bulamama probleminin bir sonucu bence. İnsalar doğal olarak para kazanacakları konuya eğiliyor, e para da kolay kazanılmıyor:) Bende isterim Türkiye' de işletim sistemi üretilsin, oyun programcılığı yapılsın, yazılım teknolojileri üretilsin. keşke olsa..

Euclides
22/06/2004, 13:42
Bakının bunu cevabını önceden verdim....Aslında Asm ile yükesek seviyeli diller ile yaptıklarınızı çooook daha kolay yapabiliyorsunuz....
Oyun Programlamada dahi assembly kullanılıyor... bundan ticari bir programlama var mı ? ? ? ? ?

Assembly ile tüm programlar çooook daha hızlı ve rahat yazılır...

C++ ile uygulamanın imkansız olduğu programlama tekniklerni asm ile kullanabiliyorum.
Ör:
Bir program yazalım girilen fonksiyonun grafiğini çizsin.
Doğal olarak önce verilen stringi paçalayan ne yapılması gerektiğini anlayan bir fonksiyon yazacaksınız.
Bunu c++ ile yazdığınızda ve fonksiyonu her çağırdığınızda verilen string'i tekrar ayrıştırmak zorunda kalacaksınız.Veya bunun benzeri olan bir işlem yapacaksınız.
Ama asm kullanırsanız programınız verilen fonskyonun işlemlerini yapan yeni bir program parcası oluşturabilir.
Hız farkı bu tip bir programda net ayırt edilebilir olacaktır.
-------------------------------------
Assembly ile yazdığınız programlar sadece sizin istediğiniz kodları içerirler.Bu yüzden çok küçük programlar yazabilirsiniz.Ör: 800 byte büyüklüğünde olup pencere çıkartan programlar yazılıyor.
Tom Raider : Dark Angel adlı oyunu oynadınız mı ?(zaten kötü bir oyundu )
Oyun açılmadan önce yaptığınız ayarlarda SSE,3DNow,SSE2 gibi SIMD sistemlerinin kullanılıp kullanılmayacağını ayarlayabiliyorsunuz.
MMX,SSE,SSE2,3DNow gibi sistemlerle renk,matris hesaplamalarınızı hesaplamalarınız çok daha hızlı yapabilirsiniz.Bu tekniğe kısaca SIMD(Single Instruction Multiple Data) denilmektedir.Assembly ile bu yöntemleri kullanabilirsniz.
Burada bir noktanın altını çizmek istiyorum.Visual C++ gibi derleyicilerdeki SIMD desteği çoğu zaman yanlış anlaşılıyor.Bu destek sadece sizin inline asm ile simd komutlarını kullanabileceğinizi gösterme
ktedir.

esmaeild
22/06/2004, 13:48
x86 tabanlı işlemcilerin assembly komutlarını tanımıyorum. en son yazdığım kodlar 6502 üzerineydi. yeni kodlar açısından bu forumda bizleri bilen arkadaşalar bilgilendirirse, bende elimden geldiği kadarıyla katkıta bulunmaya çalışırım. birde elinde bellek haritası olan varsa gönderebilir mi? birde forumlarda gezinirken chaos isimli assembler ile yazılmış basit bir çekirdeğin kodlarını bulmuşmuştum. bu kodları nasıl bootable edebileciğimi bilen var mı?

Euclides
22/06/2004, 14:53
System Programming Guide
http://www.intel.com/design/pentium4/manuals/25366815.pdf
Basic Architecture
http://www.intel.com/design/pentium4/manuals/25366515.pdf
Instruction Set Reference
A-M
http://www.intel.com/design/pentium4/manuals/25366615.pdf
N-Z
http://www.intel.com/design/pentium4/manuals/25366715.pdf

Euclides
22/06/2004, 14:59
Belki işine yarar ? ? ? ?

mkx
22/06/2004, 15:11
assembly kullanmak bilgisayar mimarisini bilmeyi de gerektiriyor(bir anlamda bilgisayarın çalışma mantığını bilmek).her ne kadar emir takımları,semantiği basit olsa da durum bu.neden assembly'e önem verilmiyor?neden assembly(ya da low level programlama teknikleri) kullanılmıyor?(sektörel anlamda).belki bu arz talep meselesi bir olay ama ben şunu düşünüyorum;aslında bu bir memleket meselesidir,ve bir çok meselesinde olduğu gibi soruna nerden bakarsanız bakın aynı.bu soruna "türkiye neden donanım üretmiyor?" sorusunu da ekleyebilirsiniz.ama bu "türkiye neden uzaya adam yollamıyor?" ya da "türkiye neden bir os çıkarmıyor?" sorularına kadar gidiyor.yıllardır aynı muhabbeti yapıp duruyoruz belki,memleket kurarmaya çalışıyoruz(lafta).bazılarınız belki bunların kişisel şeyler olduğunu,ülkesel bir sorun olmadığını düşünüyorsunuz.ben sorunu tam olarak analiz edemiyorum.sanki bazı şeylerin değişmesi imkansız gibi(statik bir durum sözkonusu).ama anladığım şu ,"ulusal bilim politikasının olmayışı" asıl sorun.her ne kadar sorun kişisel olsa da,ulusal bir hareket,yöneticilerin bilimsel araştırmayı özendirişi söz konusu değil.bu da diğer sorunların ana kaynağı(arge'ye ayrılan pay,özel sektöre bu konuda teşvik verilmeyişi falan filan).içinden çıkılacak gibi değil.neyse biz hobi olarak assembly kodlamaya devam edelim:)

esmaeild
22/06/2004, 17:38
Sağol. Fakat bu değil örneğin 0000 dan 0fff ye kadar kernal(atıyorum)
0d00 dan 0d800 e kadar ekran şeklinde bir harita.

Euclides
22/06/2004, 18:46
öyle bir harita malesef yok (windows+linux'de ) :( :( :( :( :(
Fakat şunu söyleyebirim.
Windows için 0x8000000'den sonrası ayrılmış bölümdür.Linux için 0xC000000'den sonrası ayırılmış bölümdür.

Genellikle driverlarla programlar arasındaki shared bölümlerde kullanılır.

Win9x'de ise burası windows kernelini içerir.

virU
23/06/2004, 02:45
arkadaşlar diğer programlama dillerinin (JAVA,C) aslında temel olarak assembly e dönüştürüldüğü doğru mu?.. assembly makina dili değil demişsiniz. o zaman bu bir arabirim mi?.. makina dilindeki binary kullanılıyor assembly de hexedecimal sayı sistemi kullanılıyor.. bunların birbirleriyle bir ilişkisi olabilirmi.. sorularımı yanıtlarsanız sevinirim.. mutlu günler

esmaeild
23/06/2004, 09:43
makinanın anlayabildiği tek dil 0 1 dir. zamanında abiler delikli kağıtla programlama yaparken demişlerki hocam bu çok kasıyor. biraz bu işi kolaylaştıralım makina dilini yazmışlar. :) makina dili çok hızlıdır. çünkü yapılan tek işlem hex i bin e çevirmek. Assembly ise biraz daha insancıl olsun :))kafayicez abi deyip te makina dilinde yazılmış bir dildir. Fakat Assembly ile Makina dili arasındaki ilişki diğer diller ile makina dili arasındaki ilişkiden farklıdır. örneğin: "cmp al" nin karşılığı "3c" dir. diğer dillerde dilin türüne göre interpreter veya compiler hatta bazılarında her ikiside kullanılıyor olmasına karşılık makina diliyle "01h" nasıl "00001b" ediyorsa "cmp al" da Assemblyde "3c" eder. buda asseblynin önemsenmeyecek kadar kadar azbir hız farkıyla çalışmasını sağlar. üst düzey dillerin asseblye çevriliyor denmesiyle makina diline çevriliyor denmesinin arasında bu yüzden bir fark yoktur. derleyicinin yazılan komut kümelerini assemblye cevirmiş olması dolaylı yoldan aynı zamanda makina dilinede çevirmiş olması demektir.

Euclides
23/06/2004, 09:58
arkadaşlar diğer programlama dillerinin (JAVA,C) aslında temel olarak assembly e dönüştürüldüğü doğru mu?.. assembly makina dili değil demişsiniz. o zaman bu bir arabirim mi?.. makina dilindeki binary kullanılıyor assembly de hexedecimal sayı sistemi kullanılıyor.. bunların birbirleriyle bir ilişkisi olabilirmi.. sorularımı yanıtlarsanız sevinirim.. mutlu günler
esmaeild'e aynen katılıyorum ve küçük bir ekleme yapmak istiyorum. Java yorumlanan bir dildir. Hiçbir zaman pc ile muhatap olmaz...

virU
23/06/2004, 20:25
yani üst düzey programlama dilleri assembly e çevriliyor (hexedecimal) ve assembly de makine diline (binary) diye mi anlasam.. olayın mantığını kavramaya çalışıyorum. bir kitap satın aldım.. basic pascal cobol ile assembly diye burda direk programlama örnekleri vermiş adam bahattin bayburan amcamızın kitabıymış herneyse.. fakat burasıda kadar yararlı olmadı inananın..

esmaeild
24/06/2004, 08:56
o kitabı bende okudum assemblynin mantığını anlama konusunda faydalı. fakat güncel değil. örnekleri bayağı iyi özelliklede diskin istediğiniz sektörüne ve trackine doğrudan bilgi yazma ve bilgi okuma konusu bayağı işe yarar. Soruya gelince makina dili hex, üst düzeydiller assembly'e çevriliyor. yani lda, sta, jmp gibi mnomenic kodlara. bu işlem gerçekleştiğinde aynızamanda hex(yani makinadili) ve bin (yani 01 artık makina dilide değil(makinanın 0 1 ile işlem yapması için dile ihtiyacı yok))'e de çevrilmiş oluyor. üç eş anlamlı kelime gibi düşün. sen eğer bir derleyici yazarsan yazacağın derleyici üst düzey kodları assemblye de çevirse, makina dilinede çevirse, 01 e de çevirse bişey değişmiyor. biri aynı şeyin binary hali, diğeri hex hali diğeride mnomenic hali. katı(01), sıvı(hex),gaz(mnomenic) gibi. üçüde aynı şey. farklı görünümlerde. Isıyı bi düşürüyorsun anında katı oluyor.:)

esmaeild
25/06/2004, 09:18
Merhaba dostlar. Bu gün verilerin bellekte nasıl geçici olarak saklandığını, bilgisayarı resetlediğimizde nasıl kaybolduğunu, mantıksal NOR'u ve ne işe yaradığını, programlama dillerinde logic error diye tanımladığımız hatalardan biri olan kısır döngünüyü geçici veri saklamada nasıl kullandığımızdan bahsedeciğim.

iki mantıksal nor kapısının çıkışlarının birbirlerinin girişine bağlanması ile bir flip-flop devresi elde edilir. mantıksal veya olayına bakacak olursak;
q
0 veya 0 = 0
1 veya 0 = 1
0 veya 1 = 1
1 veya 1 = 1

bunu veyadeğil'i kullanarak yaparsak;

q'
0 NOR 0 = 1
1 NOR 0 = 0
0 NOR 1 = 0
1 NOR 1 = 0

olur

peki bu bizim ne işimize yarar?

ekteki tabloda da görüldüğü gibi
Flip-Flop devresinin 1 ve 2 nolu NOR kapılarının çıkışları birbirlerinin
giriş uçlarına bağlanmıştır. NOR kapılarının diğer boşta kalan uçları SET ve RESET diye adlandırılmıştır.

SET ucuna mantıksal 1 gönderdiğimizde (+5 volt) 1 nolu NOR kapısından dönen değer ne olursa olsun q çıkışı 1 olacaktır.

ve RESET ucuna +5 volt gönderilmediği sürece bir kısır döngü oluşacak
bu sürec içerisnde q nun değeri hep 1 kalacaktır. bu sayede biz 1 bitlik bir 1 değerini q ucunda depolamış oluruz nezaman ki RESET ucuna +5 volt verirsek q çıkışı 0 olacaktır(yani 1 bit 0 değerini depolamış oluyoruz). taki SET ucuna +5 volt verene dek. işte veriler registerlerde geçici olarak böyle tutulur. artık siz buna flip-flop mu dersiniz, register mi, değişken mi vs. o size kalmış.:)

HunTER
25/06/2004, 11:14
Bu arada, konuyla (Assembly) ılgılı Euclides tarafından yazılmıs gırıs nıtelıgınde bır yazı cevız dokumanları arasına ekledı.. Adres, http://www.ceviz.net/index.php?case=article&id=310

Eger sızınde buna benzer calısmalarınız varsa yada olursa onlarıda memnunıyetle yayınlayabılırız :)

esmaeild
25/06/2004, 11:29
verdiğiniz linkten Euclides tarafından yazılmış yazıya göz attım. çok faydalı bir yazı. fakat ben toplu halde bir yazı şeklinde değilde konu başlıkları altında kısa ve öz yukarıda olduğu gibi parçalar halinde yazmak istiyorum. yazdıklarımda hep assembly %90 assembly %10 assembly i destekleyici konular hk. olucak. Acaba ben yanlış bir yere mi yazıyorum. yani yazmam gereken başka biryer varsa oraya yazıyim. yoksa buraya yazdıklarım mı mı oraya koyucaksınız ben anlamadım. Ama benim yazılırımıda o bölümde yayınlarsanız bende memnuniyet duyarım. Bilgi paylaşımına sonuna kadar varım. siz nereye yazmamı istiyorsanız ben oraya yazıyim.

HunTER
25/06/2004, 11:43
Henuz ders nıtelıgınde yazılar gırebılecegınız bır bolum yok.. Bu nedenle yazdıklarınızı yıne dokumanlar bolumunde yayınlayabılırız.. Ornegın bunlar farklı baslıklar altında derlenıp herhangı bır formatta bıze ulastırılabılırse bızde Euclides'ın yazısında oldugu gıbı bunları duzenleyıp uygun bı yerde yayınlayabılırız..

Yanı sız sadece yazın ve yazdıklarınızı edıtorumuz Ansugo'ya ulastırın.. O bunları en uygun halıyle degerlendırecektır endısenız olmasın.. Kendısıne ulasmak ıcın, http://forum.ceviz.net/private.php?do=newpm&u=110 adresını kullanabılırsınız..

Ilgınız ıcın sımdıden tesekkurler :)

virU
27/06/2004, 14:03
------------------------------------------------------------------
:00000100 EB0E jmp 00000110
:00000102 68656C6C6F push 6F6C6C65
:00000107 20776F and byte ptr [edi+6F], dh
:0000010A 726C jb 00000178
:0000010C 64 BYTE 064h


:0000010D 2400 and al, 00
:0000010F E88CC88ED8 call D88EC9A0
:00000114 BA0201B800 mov edx, 00B80102
:00000119 09CD or ebp, ecx
:0000011B 21CD and ebp, ecx
:0000011D 2000 and ch, cl
------------------------------------------------------------------
arkadaşlar selam yukarıda örnek verilmiş olan hello world kod unu w32dasm la disassmble ettim. ve bu kodları aldım ama bu yukarıda verilmiş hello world kodlarıyla alakasız. bu kodlar ne o zaman falam diye düşündüm.. yardımlarınzı bekliyorum tşk.

Euclides
27/06/2004, 15:21
Çünkü 32-bit olarak diassembly etmişsin. 16-bit modunu şeçmen gerekirdi.
2....
100-110 arasında kod yok "Hello World" string'i var

pulsar
07/07/2004, 16:48
Arkadaşlar sitemde BSCA nın incisi CYDONIA hocamızın. ki ona böyle diyince acayip bir tavır takınır kendileri assambly tutorialleri var. Bakarsanız giriş niteliğinde de olsa bilgi edinirsiniz. http://www.redrival.com/pulsar/asm/files/cydonia_asmtutors.zip
Ben kesinlikle Iczelion tutoriallerini öneririm 16 bitlik dünya tarih oldu saygıdeğer newbie-lar. Bu nedenle boşuna interruptlarla boğuşmayın. ben bile bunu 3 sene önce fark ettim. :garip:
Ben de tutorial yazıyom win ile ilgili daha cok reverse işinde olduğumdan dolayı kafa patlatmak güç oluyor. http://www.win32asm.cjb.net siştesinden ve özellikle de http://www.masm32.com sitesinden indirdiğiniz masm ile gelen programlama dökümanları ile ilerleyin. Forumunuzda Assambly bölümü ayrı olsa daha iyi olurdu ama yoq napalım. :tabi:
Hati CU...

Euclides
07/07/2004, 17:06
@pulsar:
neden tüm yazıları okuyup nasıl buraya geldiğimizi görmeyi denmiyorsun !
2...
Sitenin dökümanlar kısmında da cydonia'nın yazdığı kadar asm tutorriali var fakat yanlışkla c++ kısmının konulmuş o ayrı mesele :)
http://www.ceviz.net/index.php?case=article&id=310&f=34&ff=28

pulsar
07/07/2004, 17:44
kesinlikle haklısın o yazıyı şimdi gördüm...
Ama farklı nodda olması kötü. Nasıl farkede bilirdim.
Her neyse. Sorry falan.

virU
07/07/2004, 18:27
Disassembly of File: C:\Documents and Settings\kn-\HELLO.COM
Code Offset = 00000000, Code Size = 0000001E
Data Offset = 00000000, Data Size = 00000000

Number of Objects = 0001 (dec), Imagebase = 00000000h

Object01: RVA: 00000000 Offset: 00000000 Size: 0000001E Flags: 00000000


Number of Imported Modules = 0 (decimal)


+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++

+++++++++++++++++++ EXPORTED FUNCTIONS ++++++++++++++++++
Number of Exported Functions = 0000 (decimal)




+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object BinaryCode **************
Program Entry Point Not Available



//********************** Start of Code in Segment: 1 **************

:0001.0100 EB0E jmp 0110


:0001.0102 68656C push 6C65
:0001.0105 6C insb
:0001.0106 6F outsw
:0001.0107 20776F and [bx+6F], dh
:0001.010A 726C jb 0178
:0001.010C 64 BYTE 064h


:0001.010D 2400 and al, 00
:0001.010F E88CC8 call C99E
:0001.0112 8ED8 mov ds, ax
:0001.0114 BA0201 mov dx, 0102
:0001.0117 B80009 mov ax, 0900
:0001.011A CD21 int 21
:0001.011C CD20 int 20
:0001.011E 00000000000000000000 BYTE 10 DUP(0)
:0001.0128 00000000000000000000 BYTE 10 DUP(0)
:0001.0132 00000000000000000000 BYTE 10 DUP(0)
:0001.013C 00000000000000000000 BYTE 10 DUP(0)
:0001.0146 00000000000000000000 BYTE 10 DUP(0)
:0001.0150 00000000000000000000 BYTE 10 DUP(0)
:0001.015A 00000000000000000000 BYTE 10 DUP(0)
:0001.0164 00000000000000000000 BYTE 10 DUP(0)
:0001.016E 00000000000000000000 BYTE 10 DUP(0)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.010A(C)
|
:0001.0178 00000000000000000000 BYTE 10 DUP(0)
:0001.0182 00000000000000000000 BYTE 10 DUP(0)
:0001.018C 00000000000000000000 BYTE 10 DUP(0)
:0001.0196 00000000000000000000 BYTE 10 DUP(0)
:0001.01A0 00000000000000000000 BYTE 10 DUP(0)
:0001.01AA 00000000000000000000 BYTE 10 DUP(0)
:0001.01B4 00000000000000000000 BYTE 10 DUP(0)
:0001.01BE 00000000000000000000 BYTE 10 DUP(0)
:0001.01C8 00000000000000000000 BYTE 10 DUP(0)
:0001.01D2 00000000000000000000 BYTE 10 DUP(0)
:0001.01DC 00000000000000000000 BYTE 10 DUP(0)
:0001.01E6 00000000000000000000 BYTE 10 DUP(0)
:0001.01F0 00000000000000000000 BYTE 10 DUP(0)
:0001.01FA 00000000000000000000 BYTE 10 DUP(0)
:0001.0204 00000000000000000000 BYTE 10 DUP(0)
:0001.020E 00000000000000000000 BYTE 10 DUP(0)
:0001.0218 00000000000000000000 BYTE 10 DUP(0)
-----------
"helloworld programının 16 bitlik disassembly edilmiş halidir." ne kadar karışık görünüyor.. :D

necrofx
28/07/2004, 15:34
peki 64 bitlik sistemlerde nasıl kullanılacak ve hep intel cpulardan bahsedilmiş peki amd cpularda çalışırken sorun olur mu ya da farklılıklar neler olur ya da olur da biz bunları görmez miyiz nedir yani kafam karıştı valla :)

Euclides
28/07/2004, 16:57
1...
Temel olarak amd=intel
Performans Mon. gibi yerlerde ayrılıyorlar. birde amd'de 3dnow var başka fark yok..
2....
64'bitTe eax değildr rax oalcak, eax bunun düşük 32bit'lik kısmını temsil edecek...

pulsar
30/07/2004, 14:51
Tabii ki hesaplamalarda büyük kolayık düşünün yaa 64 bitt. http://developer.intel.com/design/Pentium4/documentation.htm#des adresinde bilgiler mevcut. Manuallere bakmak daha faydalı.
Microsoft 64 bit işletim sistemi sunumunu dün bilinmeyen bir tarihe kadar erteledi. Portable olmanın gözünü seveyim karnel 64 bit derleniyor. Ama hala üzerinde çalışma yapıyorlar. Şu __asm__(()){}; etiketlerini tekrar tazmak gerekecek tabii. Gcc de hala eksiklik var buna da ok. :)