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

Furkan Aktaş

Bilgisayar Mühendisiyim. Microsoft MCSA Web Applications Sertifikasına Sahibim. Aktif iş hayatımda Full Stack .Net Developer olarak çalışmaktayım.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir