Assembly kodunda 12 ve 13. satırlar C++ kodunda 5 ve 6. satırlara denk geliyor. Görebileceğiniz gibi aralarında hiçbir fark yok. İkisinin de tek yaptığı a değerini bir artırmak. Optimizasyon kapatılsa bile aynı çünkü compiler'ların kendi söyledikleri gibi isterlerse kendileri belirli seviye optimizasyon yaparlar.
Ama C++ kodunda 2 ve 3. satırlara bakarsak birinin assembly'de 5, 6, 7 şeklinde 3 komut ile yapılırken diğerinin 8, 9, 10 ve 11 şeklinde 4 komut ile yapıldığını görüyoruz.
Assembly 5. satırda a'nın değerini (rbp - 20 adresi) 1 artırıyor. 6. satırda bunu eax'e atıyor. 7. satırda eax'tekini b'ye (rbp - 4 adresi) aktarıyor.
eax 32 bitlik bir register. ax register'ının büyük hali. x86'da bellekten belleğe aktarım yapılmadığı için böyle aktarım sağlıyor. a'dan b'ye gitmek yerine a'dan işlemciye, işlemci'den b'ye gidiliyor.
Bu sayede bir artırma ve 2 taşıma komutuyla a değerimizi 1 artırmış olup b'ye o değeri vermiş olduk.
Assembly 8. satırda a'daki değeri eax'e atıyor. Sonra hile yapıp lea kullanıyor (bu sayede daha az satır kullanmış oluyor). 9. satırda gidiyor geçici değişken olarak edx register'ına rax + 1'i atıyor. rax eax'ın daha da büyük (bkz. 64 bit) hali olduğu için içinde aslında eax, yani a değişkenimizin artmamış değeri var. lea bunu artırıp edx'e atıyor. Sonraki iki satır zaten belli. Önce edx'ten artmış değeri a'ya atıyor, sonra da eax ile artmamış değeri c'ye atıyor.
Gördüğünüz gibi basit bir artırma gibi gözükse de değerin direkt artmaması çok zahmetli. İşlemcinizi boşuna yoruyorsunuz. Üstüne biraz karışık şekilde kullandığınız an işler anlaşılmaz hale geliyor.