Pat diye işaretsiz sayılarda karşılaştırma konusu attım farkındayım daha öncesinde x86 Assembly MASM (Microsoft ASM) sözdiziminden bahsetmem daha doğru olurdu.
Bu yüzden herhangi bir assembler sözdizimini bildiğinizi varsayarak devam ediyorum, zaten farklı bir assembler kullansanızda çok bir şey değişmez, fikir aynı.
Bu konuda karşılaştırmaların temelinde CMP talimatından ziyade SUB talimatınında olduğundan bahsediyorum.
Ve aynı zamanda Flag Register'ların öneminden bahsediyor olacağım.
Tabi o an ki duruma göre birisinin dezavantajı diğerinin avantajı oluyor.
Fakat genellikle CMP komutu daha avantajlıdır bunu sonra ki konuda nedenini anlatacağım.
Uzun uzun talimatların ve flag register'ların ne amaçla kullanıldığını ve neyi değiştirdiğinden bahsetmedim. İleride belki.
Bu yüzden herhangi bir assembler sözdizimini bildiğinizi varsayarak devam ediyorum, zaten farklı bir assembler kullansanızda çok bir şey değişmez, fikir aynı.
Bu konuda karşılaştırmaların temelinde CMP talimatından ziyade SUB talimatınında olduğundan bahsediyorum.
Ve aynı zamanda Flag Register'ların öneminden bahsediyor olacağım.
Tabi o an ki duruma göre birisinin dezavantajı diğerinin avantajı oluyor.
Fakat genellikle CMP komutu daha avantajlıdır bunu sonra ki konuda nedenini anlatacağım.
Uzun uzun talimatların ve flag register'ların ne amaçla kullanıldığını ve neyi değiştirdiğinden bahsetmedim. İleride belki.
.386
.model flat
.code
; Sayılar arasında karşılaştırma CMP veya SUB komutları kullanılarak yapılabilir.
; Bu programda "Subtract" komutu ile iki sayıyı karşılaştıracağız.
start PROC
mov eax,1111h
mov ebx,1111h
sub 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,1h ; eax, ebx'den büyük ise ecx = 1h olsun.
jmp bitti
eax_ve_ebx_esit:
mov ecx,2h ; eax ve ebx birbirine eşit ise ecx = 2h olsun.
jmp bitti
ebx_daha_buyuk:
mov ecx,3h ; ebx, eax'den büyük ise ecx = 3h olsun.
bitti:
ret
start endp
end startBu içeriği görmek için giriş yapın.