EMU8086 Faktöriyel Bulan Program
EMU8086’da özyineli prosedür kullanarak bir sayının faktöriyelini bulan programı yazacağız. Öncelikle bir değişken tanımlıyoruz ve içine hangi değerin faktöriyelini almak istiyorsak onu yazıyoruz.
.model small .stack 64 .data n dw 05
Ben değeri 5 olarak tanımladım. Şimdi diğer tanımlamaları yapalım.
.code mov ax,@data mov ds,ax mov ax,0001 mov bx,[n]
Çarpmada etkisiz eleman olduğu için ve ileride kullanıcağımız mul komutunun parametresi ax olduğu için, Ax’e 1 değerini verdik. Bx’e sayımızı atıyoruz.
Prosedürü çağırma kodunu ve Sonucu cx’te göstereceğim için cx’e ax’i atıyorum. (Bir sonraki adımda daha iyi anlaşılacak)
call faktoriyel mov cx,ax mov ah,4ch int 21h
Son olarak prosedürümüz kaldı. Prosedürü end komutunun hemen üstüne yazıyoruz.
faktoriyel proc cmp bx,0001 je cik: push bx dec bx call faktoriyel pop bx mul bx; AX=AX*BX cik:ret faktoriyel endp end
Yukarda bx’in değerini 1 ile karşılaştırıyor. Eğer bire eşitse prosedürden çıkacak. Bir değilse bx’i push komutuyla yığına atıyor. Dec bx’le sayıyı azaltıyor. Sonra call faktoriyel diyerek sayıyı azaltarak yığına kopyalamaya devam ediyor. Bire eşit olana kadar bu işlem devam edecek. Bire eşit olunca pop komutuyla yığındaki sayıları alıyor ve mul bx komutuyla çarpıyor, sonucu Ax’e yazdırıyor.
Biz sonucu mov cx,ax yazarak sonucu cx’e atamıştık. Şimdi programı çalıştırıp sonuca yani CX’e bakıyoruz. Sonuç 0078 çıkıyor. Bunu Emu8086’da bulunan converterda, 16 biti seçip yazarsak sonucu 120 olarak verecektir.
KODUN TAMAMI:
.model small .stack 64 .data n dw 05 .code mov ax,@data mov ds,ax mov ax,0001 mov bx,[n] call faktoriyel mov cx,ax mov ah,4ch int 21h ;faktoriyel ozyineli prosedur faktoriyel proc cmp bx,0001 je cik: push bx dec bx call faktoriyel pop bx mul bx; AX=AX*BX cik:ret faktoriyel endp end