CMP talimatının neden daha çok kullanıldığından bahsettim.
.386
.model flat
.code
start PROC
; Bu programda "Compare" komutu ile iki sayıyı karşılaştıracağız.
; CMP komutu ile karşılaştırma yaparken SUB komutundan farklı olarak register'lar etkilenmiyor.
; Yani SUB komutunun register'ların sonucu değişebilirken CMP komutunda register'lar eski değerlerini koruyacak.
; Bu özelliğinden dolayı karşılaştırmalarda CMP komutu daha çok tercih ediliyor.
mov eax,-10
mov ebx,-5
cmp eax,ebx
jc 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.
jnc 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.