Uzman Üye
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;
Gördüğünüz üzere returnToVar isimli bir fonksiyonumuzu ana akışta kullanmışız.
Bu kodun Assembly karşılığı ise şöyle olacak;
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
bu kodun karşılığı şu olacaktır;
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;
Böyle bir kodun çıktısı şu şekilde olacaktır;
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.
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
}
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
"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};
}
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
Ş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: