Karşılaştırma yaparken CMP talimatının yanı sıra flag register'ları doğrudan kontrol etmek yerine neden JB, JBE, JA, JAE gibi talimatları kullandığımızdan bahsettim
.386
.model flat
.code
start PROC
; "İŞARETSİZ" sayılarda karşılaştırma yaparken JC, JZ, JNC gibi talimatlar yerine JB, JBE, JA ve JAE talimatlarda kullanılabilir.
; Bu komutlarda JC, JZ ve JNC'nin yaptığı gibi bayrakların durumlarını kontrol edip ona göre atlıyor yada atlamıyor.
; Fakat JB, JBE, JA ve JAE komutlar daha pratik ve kullanışlı. Çünkü bu komutlar ile çok az daha yüksek seviyeden kod yazmış oluyoruz.
; Assembly'de bir fonksiyon belki onlarca farklı kez ifade edilebilir.
; İşte bu noktada en pratik ve en kullanışlı olanı kodlamak bizim elimizde.
; cmp eax,ebx
; JB : Jump if below. (CF=1) EAX < EBX ise atla.
; JBE : Jump if below or equal. (CF=1 or ZF=1) EAX <= EBX ise atla.
; JA : Jump if above. (CF=0) EAX > EBX ise atla.
; JAE : Jump if above or equal. (CF=0 or ZF=0) EAX >= EBX ise atla.
; Karşılaştırma yaparken JB komutu ile JC komutu aynı anlama gelirken, JAE komutu ile de JNC komutu aynı anlama geliyor
; Yani bu komutlar birbiri yerine kullanılabilir.
; Neden x86 komut setinde aynı anlama gelen iki komut var?
; JB ve JAE komutları kodun daha okunaklı hale gelmesi için komut setine sonradan eklenen komutlardır.
; Çünkü karşılaştırmaları JN ve JNC komutları ile doğrudan bayrakların durumlarını kontrole ederek yaptığımız için düşünmeyi ve kodun okunurluğunu biraz daha zor hale getiriyor.
; Fakat geriye dönük uyumluluk olması adına JC ve JNC komutlarıda komut seti mimarisinden kaldırılmamıştır.
; Bu programda JA ve JB komutlarını kullandım fakat isteğe bağlı olarak JBE (<=) veya JAE (>=) komutlarınıda kullanabiliriz.
mov eax,1101h
mov ebx,1111h
cmp eax,ebx
jb ebx_daha_buyuk ; Çıkarma işleminde (eax-ebx) eğer elde'ye ihtiyaç duyuluyor ise ebx, eax'den daha büyüktür.
; Elde'den kastım borç(borrow) bir bit. Yani eax'in en soluna bir(1) biti ekleniyor.
; Bu bitin eklenmesinin sebebi işaretli sayılarda çıkarma işlemi yaparken sonucun negatif çıkmasının önüne geçmek.
; Çünkü işaretsiz sayılarda örneğin 1-3 işleminin cevabı olan -2'yi ifade edemiyoruz.
; Sonucun pozitif olabilmesi içinde büyük sayıdan küçük sayı çıkması gerekiyor.
; Bunun içinde eax'e yani küçük olana 1 bit eklenmesi gerekiyor.
; Bu işlem sonucunda Carry Flag = 1 olur.
; Carry Flag = 0 ise yukarıda ki komut geçersiz olacaktır.
; Bu durumda eax daha büyükte olabilir fakat eşitte olabilirler.
jz eax_ve_ebx_esit ; Eğer eşitlerse çıkarma işleminin sonucu sıfırdır. Zero Flag = 1 olur.
ja eax_daha_buyuk
eax_daha_buyuk:
mov ecx,eax ; eax, ebx'den büyük ise ecx = eax olsun.
jmp bitti
eax_ve_ebx_esit:
mov ecx,eax ; eax ve ebx birbirine eşit ise ecx = ebx = eax olsun.
jmp bitti
ebx_daha_buyuk:
mov ecx,ebx ; ebx, eax'den büyük ise ecx = ebx olsun.
; Yani hangisi büyük ise ecx'e büyük olanın değeri taşınacak. Eşitler ise ecx'de aynı değer taşınacak.
bitti:
ret
start endp
end startBu içeriği görmek için giriş yapın.