Assembly Basit Mnemonicler | Örneklerle anlayalım.

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Uzman Üye
Katılım
2 Ocak 2016
Mesajlar
173
Tepki puanı
29
Ödüller
8
10 HİZMET YILI
1 = CALL,RET
CALL, bir fonksiyon çağırır kısaca durum bu.

* = CALL tarafından fonksiyon çağırılır
call BLABLA
* = BLABLA işlemi tamamlandıktan sonra kod derlendiği için derleyici fonksiyonun Assembly kodunun sonunda RET komutunu ekler.
RET komutu işlem bittikten sonra ana işleme geri dönmek ve kod akışını sürdürmek için kullanılır.

Hadi gelin C++'de örnek üzerinde göstereyim;

C++:
int returnToVar(){
    return 0;
}
int main(){
 
   // .... farklı işlemler
    returnToVar();
   // .... farklı işlemler
}
Gördüğünüz üzere returnToVar isimli bir fonksiyonumuzu ana akışta kullanmışız.
Bu kodun Assembly karşılığı ise şöyle olacak;

Kod:
returnToVar():
        push    rbp
        mov     rbp, rsp
        mov     eax, 0
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        call    returnToVar()
        mov     eax, 0
        pop     rbp
        ret
Gördüğünüz üzere call returnToVar() burada, yine dikkat çeken bir şey var değil mi? Hatırlarsanız üstte
"BLABLA işlemi tamamlandıktan sonra kod derlendiği için derleyici fonksiyonun Assembly kodunun sonunda RET komutunu ekler."
demiştik değil mi? C++ derleyicisi Assembly kodunda returnToVar()'ın sonuna ret'i kendi otomatik olarak eklemiş.
2 = MOV
MOV tam anlamıyla hafızada ki değeri değiştirmek için kullanılır.
MOV ax,1 = ax=1
Örneğin


C++:
int main(){
  int number{100};
}

bu kodun karşılığı şu olacaktır;
Kod:
        mov     DWORD PTR [rbp-4], 100

Gördüğünüz gibi, açıkça görülebilen bir şekilde, "mov DWORD PTR [rbp-4], 100" satırı bulunmaktadır. DWORD, değişkenin boyutunu belirtirken 32 bit olduğunu ifade eder ve PTR, pointer'ın kısaltılmış halidir. rbp-4, bir register'dır ve bu register'ın ne olduğu uzun ve akademik bir konudur, bu yüzden burada anlatmaya gerek yoktur. Bu konuyla ilgili olarak mutlaka araştırma yapılmalıdır. Kısaca, rbp-4 pointer'ının değeri 100 ile değiştirilir.



3 = ADD , SUB , MUL
Bilgisayarlar, ADD ve SUB işlemlerinde toplama ve çıkarma yapmak için kullanılır. Ancak, ADD işlemi toplama yaparken, SUB işlemi çıkarma yapar. Fakat, bilinmesi gereken önemli bir nokta vardır ki, bilgisayarlar aslında doğrudan toplama ve çıkarma yapamazlar. Tüm bilgisayarlar, toplama işlemi üzerinden çıkarma, çarpma ve bölme işlemlerini gerçekleştirirler. Bu, bilinmesi gereken bir bilgidir, ancak pratikte pek işe yaramaz.
Ayrıca, MULL işlemi çarpma işlemi yapar.

ADD AX,BX = AX=AX+BX
SUB AX,BX = AX=AX-BX
MUL AX,BX= AX = AX * BX

Örneğin;
C++:
int main(){
  int num1{1};
  int num2{2};
  int calc{num1+num2};
}
Böyle bir kodun çıktısı şu şekilde olacaktır;
Kod:
mov     DWORD PTR [rbp-4], 1
        mov     DWORD PTR [rbp-8], 2
        mov     edx, DWORD PTR [rbp-4]
        mov     eax, DWORD PTR [rbp-8]
        add     eax, edx
        mov     DWORD PTR [rbp-12], eax
        mov     eax, 0
Burada, edx ve eax registerleri programdaki local değişkenlere denk gelmektedir. Ancak bu tanımın doğru olmadığı ve registerlerin daha detaylı bir konu olduğu belirtilmelidir. İlk iki "mov" komutu, rbp-4 ve rbp-8 pointerlarına sırasıyla 2 ve 1 değerlerini atar ve sonra bu pointerları edx ve eax registerlerine aktarır. Daha sonra "add" komutu ile eax ve edx registerlerinin değerleri toplanır ve sonuç eax registerine kaydedilir. Son olarak, rbp-12 pointerına eax'ın değeri kaydedilir ve eax sıfırlanır. SUB komutunun ise aynı işlemi ters çevrildiği söylenebilir.

Şimdilik ekstra bir bilgiye ihtiyaç duymadan gösterebileceğimiz şeyler bunlar. Ancak eğer bu konu size ilgi çekici geliyorsa, assembly dilini sıfırdan en azından temel düzeyde öğrenerek diğer komutları da öğrenebilirsiniz. Karşılaştırmaları içeren flagların nasıl çalıştığını da anlatmak isterdim ancak şu an için ön bilgi sahibi olmadan bile anlayabileceğiniz durumlar bunlar.
 
Son düzenleme:
Haykıracak Nefesim Kalmasa Bile
Süper Üye
Katılım
26 Ocak 2017
Mesajlar
626
Çözümler
2
Tepki puanı
84
Ödüller
11
Sosyal
9 HİZMET YILI
Öncelikle eline sağlık mutlaka birilerinin işine yarayacaktır ama sadece boş boş bakmak canımı acıtıyor...
 
☾⭒ königsrasse
Ultra Üye
Katılım
28 Ağu 2018
Mesajlar
1,741
Çözümler
33
Tepki puanı
316
Ödüller
10
7 HİZMET YILI
Eline sağlık dostum güzel anlatım olmuş.
 
Her hile kullanan bir gün banı tadacaktır
Seçkin Üye
Katılım
19 Ocak 2017
Mesajlar
383
Çözümler
1
Tepki puanı
31
Ödüller
7
Yaş
23
9 HİZMET YILI
güzel anlatım olmuş eline sağlık dostum
 
aka hernos
Süper Üye
Katılım
30 Ağu 2019
Mesajlar
628
Çözümler
10
Tepki puanı
297
Ödüller
4
Yaş
29
Sosyal
6 HİZMET YILI
Bu işlerde ustalaşmış birisi olarak söylüyorum,Şuan size bu assemblynin ne kadar karışık geldiğini anlıyabiliyorum.İlk başladığımda banada çok zor geliyordu hiçbir şey anlamıyordum evet ama bir işte ustalaşmak için ilk önce o işe başlamak ve ufak ufak adımlar atmanız lazım.Hiç başlamazsanız , hiçbir zaman hedefinize ulaşamazsınız.Benden size tavsiyem assembly öğrenmeden önce C++ öğrenmeniz.İnternetde bir sürü kurs video var izleyerek ikisinide öğrenebilirsiniz. Assembly ve C++ hile yapmak için gerekli olan en önemli 2 şey.

Konuya gelirsek rbp-4 başlı başına bir register değil. Mov işlemi yaparken hafızadaki bir diğeri bir yerden bir yere taşımak için nereye taşımak istersek mov komutunun önüne onun adresini yazarız sonra virgül koyup taşımak istediğimiz değeri veya adresini yazarız

C++:
mov [rbp-4] , 1 // Gibi

rbp kendi başına bir registerdir rbp den 4 çıkarıp istediğimiz yere o değeri taşıyabiliriz.Neden rbp-4 derseniz burada işin içine stack denen konu giriyor ve çok karışık bir konu gerçekten nasıl anlatabilirim bilmiyorum. Stack'ı kutu gibi düşünebilirsiniz. Bir fonksiyonu çağırırken onu paremetreleri ile çağırırız değil mi ? İşte bu paremetreler stack gibi bir kutunun içine sırasıyla dizilir çünkü çağırdığımız fonksiyonun içinde onu rbp-4 yaparmış gibi ulaşabilelim diye. Rbp dediğimiz şey çağırdığımız fonksiyonun stack'ının dibi yani kutumuzun dibi gibi düşünebilirsiniz.Bu kutunun içindede değerlerimizi saklarız.Ben bunu tabiki çok iyi anlatamam çünkü bir öğretmen değilim ama internetden açıp izleyerek öğrenebilirsiniz eğer merakınız varsa.
 
Admin
Katılım
9 Eki 2017
Mesajlar
13,540
Çözümler
1,051
Tepki puanı
3,382
Ödüller
22
8 HİZMET YILI
Bayağı tatlı olmuş bu arada gerçekten birkaç yerini tam olarak anlayamasam da genel olarak anlayabiliyorum
 
Onaylı Üye
Katılım
15 Mar 2023
Mesajlar
50
Tepki puanı
0
Yaş
34
3 HİZMET YILI
hoş ve detaylı anlatım olmuş eline sağlık ama bi kaç yerde noktalama hataları var tam bilmiyorum ama gördüğüm kadarıyla diyim
 
Uzman Üye
Katılım
2 Ocak 2016
Mesajlar
173
Tepki puanı
29
Ödüller
8
10 HİZMET YILI
Bu işlerde ustalaşmış birisi olarak söylüyorum,Şuan size bu assemblynin ne kadar karışık geldiğini anlıyabiliyorum.İlk başladığımda banada çok zor geliyordu hiçbir şey anlamıyordum evet ama bir işte ustalaşmak için ilk önce o işe başlamak ve ufak ufak adımlar atmanız lazım.Hiç başlamazsanız , hiçbir zaman hedefinize ulaşamazsınız.Benden size tavsiyem assembly öğrenmeden önce C++ öğrenmeniz.İnternetde bir sürü kurs video var izleyerek ikisinide öğrenebilirsiniz. Assembly ve C++ hile yapmak için gerekli olan en önemli 2 şey.

Konuya gelirsek rbp-4 başlı başına bir register değil. Mov işlemi yaparken hafızadaki bir diğeri bir yerden bir yere taşımak için nereye taşımak istersek mov komutunun önüne onun adresini yazarız sonra virgül koyup taşımak istediğimiz değeri veya adresini yazarız

C++:
mov [rbp-4] , 1 // Gibi

rbp kendi başına bir registerdir rbp den 4 çıkarıp istediğimiz yere o değeri taşıyabiliriz.Neden rbp-4 derseniz burada işin içine stack denen konu giriyor ve çok karışık bir konu gerçekten nasıl anlatabilirim bilmiyorum. Stack'ı kutu gibi düşünebilirsiniz. Bir fonksiyonu çağırırken onu paremetreleri ile çağırırız değil mi ? İşte bu paremetreler stack gibi bir kutunun içine sırasıyla dizilir çünkü çağırdığımız fonksiyonun içinde onu rbp-4 yaparmış gibi ulaşabilelim diye. Rbp dediğimiz şey çağırdığımız fonksiyonun stack'ının dibi yani kutumuzun dibi gibi düşünebilirsiniz.Bu kutunun içindede değerlerimizi saklarız.Ben bunu tabiki çok iyi anlatamam çünkü bir öğretmen değilim ama internetden açıp izleyerek öğrenebilirsiniz eğer merakınız varsa.
Biliyorsunuz ki, teorik bilgileri burada aktarmayı tercih etmedim. Ayrıca yazımda bunu da belirttim. RBP, bir registerdir ve RBP-4, onun ofsetidir; dolayısıyla bu da bir registerdır.

Bu bilgiyi de zaten yazımda belirttim. Ancak, amacım Assembly'e girişin kolaylığını göstermekti ve yazının sonunda da belirttiğim gibi, bu konular başlı başına ele alınması gereken konulardır.
Post automatically merged:

hoş ve detaylı anlatım olmuş eline sağlık ama bi kaç yerde noktalama hataları var tam bilmiyorum ama gördüğüm kadarıyla diyim
Gece yazdığım için kaçırdığım noktalar olmuş olabilir, hepsini düzelttim. Teşekkürler.
 
Son düzenleme:
Onaylı Üye
Katılım
1 Eki 2022
Mesajlar
51
Tepki puanı
1
Ödüller
1
Yaş
26
3 HİZMET YILI
uzun bir süredir başka kaynaklardan araştırıyordum ama en iyisi bu oldu
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst