· EEM332

EEM332 Mikroişlemciler: Assembly ile Arama, Sıralama ve Sayı İşlemleri

EEM332 – Mikroişlemciler · 09.04.2015 · 18.10.2026

Bu yazı, Başkent Üniversitesi EEM332 Mikroişlemciler ders arşivindeki ilgili notları ve uygulamaları bir araya getiriyor (2015–2015). Doğrusal ve ikili arama, sıralama, asal sayılar, büyük sayılarla toplama, matris çarpımı ve taban dönüşümü. Bir arkadaşın hazırladığı çalışmalar ve ders belgeleri birlikte aktarılmış; öğrenci adları, numaraları ve grup bilgileri çıkarılmıştır. Belgelerin PDF arşiv kopyaları ve varsa kaynak kodları yazının sonunda ZIP olarak indirilebilir.

1000basamaktoplamD

; hafizada yeralan ve herbirisi 1000 rakamdan olusan
; 10'luk tabandaki iki sayinin toplamini yapar.
; ilk sayi 1000-1999
; ikinci sayi 2000-2999
; sonuc 3000-4000
; m.ali akcayol                  
; 04.07.2007

org 0100h      
ADET equ 1000           ; toplam rakam sayisi
mov dl,10               ; sayilari onluk tabanda gostermek icin

call baslangic          ; baslangic degerleri atanir
call degerata           ; iki sayinin degerleri atanir
call topla              ; toplama islemi yapilir
call mesajyaz           ; kullaniciya islemin bittigi bildirilir

hlt

topla proc    
    call baslangic
    mov bx,0            ; bl'de kalan saklanacak
    mov cx,ADET         ; cx sayaci rakam sayisina esitleniyor
    sonrakibasamak:
        mov al,[si]         ; ilk sayinin en sagdaki basamagi
        add al,[si+1000]    ; ikinci sayinin en sagdaki basamagiyla toplaniyor
        add al,bl           ; onceki basamaktan gelen toplandi
        div dl              ; toplam 10'a bolunerek kanal alinacak
        mov [si+2001],ah    ; elde olursa 1001 byte gerekir o yuzden 2001
        xor ah,ah           ; bir sonraki bolme icin 
        mov bl,al           ; kalan saklandi sonraki basamaga eklenecek
        dec si              ; onceki basamaklara gecilir
        loop sonrakibasamak
    mov [si+2001],bl        ; elde varsa bir onceki adrese yazildi    
    ret    
topla endp

baslangic proc
    mov cx,ADET     ; her sayidaki rakam sayisi
    mov si,1000     ; ilk dizinin en soldaki rakami
    add si,cx       ; ilk dizinin en sagdaki rakami
    ret
baslangic endp         

degerata proc       ; dizilere baslangic degerleri atar
    dongu:
        mov ax,cx   ; her eleman (cx mod 10) ile belirleniyor
        div dl      
        mov al,ah   ; kalan deger alinacak
        xor ah,ah
        mov [si],al         ; ilk diziye
        mov [si+1000],al    ; ikinci diziye
        dec si              ; bir soldaki rakam
        loop dongu
        ret
degerata endp  

mesajyaz proc
    mov dx, offset mesajvar
    mov ah, 9
    int 21h
    ret
    mesajvar db "toplama islemi tamamlandi... $"         
mesajyaz endp

20basamaktoplamiH

; hafizada yeralan ve herbirisi 20 rakamdan olusan
; 16'lik tabandaki iki sayinin toplamini yapar.
; ilk sayi 0100h-0109h
; ikinci sayi 010Ah-0113h
; sonuc 0114h-011Dh
; m.ali akcayol                  
; 01.07.2007

org 0100h
mov [0100h],8A76h
mov [0102h],6557h
mov [0104h],1A98h
mov [0106h],713Eh
mov [0108h],8797h
mov [010Ah],2587h
mov [010Ch],8B96h
mov [010Eh],2588h
mov [0110h],46D1h
mov [0112h],9854h

mov si, 0108h           ; 1.sayinin en sagdaki 4 rakam (1 word) aliniyor
mov bx,[si]         
add bx,[si+000Ah]       ; 2.sayinin en sagdaki 4 rakami ile toplaniyor
mov [si+0014h],bx       ; sonuc hafizaya yaziliyor
jnc atla1               ; carry=0 ise atla
    mov dx,1            ; sub isleminden once carry dx'e saklaniyor
    atla1:              
sub si,2                ; sola dogru 4 rakam (1 word) gidiliyor
dongu:
    mov bx,[si]         ; 1.sayinin onceki 4 rakami (1 word) aliniyor
    add bx,[si+000Ah]   ; 2.sayinin onceki 4 rakami ile toplaniyor 
    add bx,dx           ; varsa carry ekleniyor
    xor dx,dx           ; saklanan carry degeri sifirlaniyor
    mov [si+0014h],bx   ; sonuc hafizaya yaziliyor
    jnc atla2           ; carry=0 ise atla
      mov dl,1
    atla2:
        sub si,2        ; sola dogru 4 rakam (1 word) gidiliyor
        cmp si,0100h    ; en sola gelindimi?
        jae dongu       ; gelinmediyse basa doner
call mesajyaz
hlt      

mesajyaz proc
    mov dx, offset mesajvar
    mov ah, 9
    int 21h
    ret
    mesajvar db "toplama islemi tamamlandi... $"         
mesajyaz endp

HexToDec

; 16 lik tabandaki sayiyi 10 luk tabana cevirir
; ekrana 10 luk tabanda yazilir
; m.ali akcayol - 23.07.2007

MACRO YAZDIR
MOV AH, 2
DONGU:
    POP BX      ; soldan saga dogru sayi pop edilir
    MOV DL, BL  ; yazdirilacak deger
    ADD DL, 48  ; 48 eklenerek karakter karsiligi bulundu
    INT 21h
    DEC CL      ; sagdaki basamak icin azaltildi
    CMP CL,0    ; sifirsa en sagdaki basamak yazilmistir
    JNE DONGU
ENDM YAZDIR

org 0100h
mov ax, 231h    ; 10 luk tabana donusturulecek sayi
mov dl,10       ; bolme icin
mov cl,0        ; kac defa bolme yapildigini tutar
basa:           ; her dongude 10 luk sayinin 1 basamagi hesaplanir
    inc cl      ; basamak artirildi
    div dl      ; kalan bulunacak
    mov bl,ah   ; kalan sagdaki basamak degeri
    push bx     ; sagdan sola dogru sayi push edilir
    cmp al,10   ; bolum sonucu 10 dan kucukse son basamak bulundu
    jb atla     ; son basamaksa atla
    xor ah,ah   ; kalani sifirla basa don
    jmp basa    ; yeni basamak hesapla
atla:    
inc cl
mov bl,al       ; son basamakta stack a push edilir
push bx
YAZDIR          ; yazdirma islemi
hlt

arama

; 10000 kisiye ait ogrenim durumu bilgileri 
; hafizaya kaydedilmistir. 
; Ogrenim durumu LISANSUSTU icin 'M', 
; UNIVERSITE icin 'U', 
; LISE icin 'L' 
; ILKOGRETIM icin 'I' girilmistir. 
; Herbir ogrenim durumu icin kisi sayisini bulup 
; tumunu buyukten kucuge sirali olarak 10'luk tabanda ekrana yazar.
; m.ali akcayol - 26.07.2007

MACRO YAZDIR HEXSAYI
    MOV AX,HEXSAYI  ; sayi 10 a bolunerek her seferinde kalan
    MOV DL,10       ; alinmistir. 
    MOV CL,0
    DONGU:
        DIV DL
        MOV BL,AH
        XOR AH,AH
        XOR BH,BH
        PUSH BX     ; stack'a once birler basamagi atilir
        INC CL
        CMP AL,10
        JNB DONGU
    MOV BL,AL
    XOR BH,BH
    PUSH BX
    INC CL
    
    MOV AH,2
    MOV DL,' '
    INT 21H         ; bosluk verildi
    DONGU2:
        POP DX       ; stack'tan once yuzler basamagi alinir
        ADD DX,30H   ; karakter karsiligi hesaplaniyor
        MOV AH,2     ; karakter yazdirma islemi yapiliyor
        INT 21H
        DEC CL   
        CMP CL,0
        JE CIKIS
        JMP DONGU2
    CIKIS:
ENDM YAZDIR

org 0100h
kayitM db 2485 dup('M')
kayitU db 2459 dup('U')
kayitL db 2541 dup('L')
kayitI db 2515 dup('I')
xor bx,bx   ; lisansustu
xor cx,cx   ; universite
xor dx,dx   ; lise
xor di,di   ; ilkogretim
mov si,0
dongubasi:              ; her dongude bir karakter karsilastirilir
    mov al,[0100h+si]
    cmp al,'M'          ; Lisansustu
    je lisansustu        
    cmp al,'U'          ; Universite
    je universite
    cmp al,'L'          ; Lise
    je lise
    cmp al,'I'          ; Ilkogretim
    je ilkogretim
    lisansustu:
        inc bx          ; Lisansustu sayisi artirildi
        jmp devam
    universite:
        inc cx          ; Universite sayisi artirildi
        jmp devam
    lise:
        inc dx          ; Lise sayisi artirildi
        jmp devam
    ilkogretim:
        inc di          ; Ilkogretim sayisi artirildi
    devam:
        inc si          ; Sonraki karakter
        cmp si,10000    ; Hepsi kontrol edildiyse donguden cik
        jb dongubasi
mov ah,4                ; 4 farkli karakter icin
tekrar:
    xor si,si           ; si gecici sayi tutmak icin kullanilacak
    cmp bx,0            ; her yazilan -1 yapilacak
    jl atlaM            ; -1 ise onceden yazilmistir
    cmp si,bx           ; Lisansustu degeri mevcuttan buyukse onu al
    ja atlaM            ; degilse degistirme yapma
    mov si,bx           ; yeni en buyuk lisansustu
    mov al,'M'          ; bu donguler 4 defa tekrarlanir
atlaM:                  ; her defasinda kalanlardan en buyugu yazilir
    cmp cx,0            
    jl atlaU
    cmp si,cx
    ja atlaU
    mov si,cx
    mov al,'U'
atlaU:
    cmp dx,0
    jl atlaL
    cmp si,dx
    ja atlaL
    mov si,dx
    mov al,'L'
atlaL:
    cmp di,0
    jl atlaI
    cmp si,di
    ja atlaI
    mov si,di
    mov al,'I'
atlaI:
    cmp al,'M'
    jne MGec
    mov bx,-1           ; yazilana -1 atanir 
	pusha 
	call yenisatir
	mov dx, offset msgM
	mov ah, 9
	int 21h             ; lisansustu ise ilgili mesaj yazilir
	popa 
MGec:
    cmp al,'U'
    jne UGec
    mov cx,-1           ; yazilana -1 atanir
	pusha 
	call yenisatir
	mov dx, offset msgU
	mov ah, 9
	int 21h             ; universite ise ilgili mesaj yazilir
	popa
UGec:
    cmp al,'L'
    jne LGec
    mov dx,-1           ; yazilana -1 atanir
    pusha
	call yenisatir
	mov dx, offset msgL
	mov ah, 9
	int 21h             ; lise ise ilgili mesaj yazilir
	popa
LGec:
    cmp al,'I'
    jne IGec
    mov di,-1           ; yazilana -1 atanir 
	pusha  
	call yenisatir
	mov dx, offset msgI
	mov ah, 9
	int 21h             ; ilkogretim ise ilgili mesaj yazilir
	popa 
IGec: 
    pusha 
    YAZDIR SI           ; toplam adet degeri yazilir
    popa
dec ah
cmp ah,0
je bitis
jmp tekrar
bitis:
msgM db "LISANSUSTU = $"   
msgU db "UNIVERSITE = $"
msgL db "LISE = $"
msgI db "ILKOGRETIM = $"
hlt

yenisatir proc 
    mov ah,2
    mov dl, 0Dh             ; return
    int 21h                 
    mov dl, 0Ah             ; yeni satir
    int 21h 
    ret
yenisatir endp

asalsayi

; Girilen 3 basamakli bir sayidan
; kucuk asal sayilari bulup ekrana yazan program
; m.ali akcayol - 26.07.2007

MACRO YAZDIR HEXSAYI
    MOV AX,HEXSAYI  ; sayi 10 a bolunerek her seferinde kalan
    MOV DL,10       ; alinmistir. 
    MOV CL,0
    DONGU:
        DIV DL
        MOV BL,AH
        XOR AH,AH
        XOR BH,BH
        PUSH BX     ; stack'a once birler basamagi atilir
        INC CL
        CMP AL,10
        JNB DONGU
    MOV BL,AL
    XOR BH,BH
    PUSH BX
    INC CL
    
    MOV AH,2
    MOV DL,' '
    INT 21H         ; bosluk verildi
    DONGU2:
        POP DX       ; stack'tan once yuzler basamagi alinir
        ADD DX,30H   ; karakter karsiligi hesaplaniyor
        MOV AH,2     ; karakter yazdirma islemi yapiliyor
        INT 21H
        DEC CL   
        CMP CL,0
        JE CIKIS
        JMP DONGU2
    CIKIS:
ENDM YAZDIR


org 0100h
buffer db 4,?,4 dup(1)

mov bl,10  
mov dx,offset buffer
mov ah,0Ah
int 21h             ; 3 basamakli bir sayi girildi           

mov al,[buffer+2]   ; yuzler basamagi alindi
sub al,30h          ; karakter sayisal degere cevrildi
mul bl              ; 10 la carpildi
mul bl              ; 100 le carpildi
mov cx,ax           ; 100 ler basamagi cx e aktarildi

mov al,[buffer+3]   ; onlar basamagi alindi
sub al,30h           
mul bl
add cx,ax

mov al,[buffer+4]   ; birler basamagi alindi
sub al,30h 
add cx,ax   ; cx e 3 basamakli sayi aktarildi

mov ah,2    ; 1 ve 2 dogrudan yazdiriliyor
mov dl,' '
int 21h
mov dl,'0'
int 21h
mov dl,'1'  ; 01
int 21h
mov dl,' '
int 21h
mov dl,'0'
int 21h
mov dl,'2'  ; 02
int 21h

mov dl,3    ; 3 ve ustu sayilar kontrol edilecek
xor dh,dh

disdongu:       ; her sayi icin tekrarlanir
    mov bl,2    ; bolme islemi 2 ile baslar
    icdongu:
        mov ax,dx   ; dx kontrol edilen sayiyi tutar  
        div bl      ; ax bolme islemleri icin kullanildi
        cmp ah,0    ; kalan kotrol edildi
        je sonrakisayi    ; kalan yoksa asal degildir  
        inc bl      ; bolen artiriliyor
        cmp bl,dl   ; bolen sayiya esitse asal sayidir 
        je asalsayi
        jmp icdongu ; degilse yeni bolenle devam edilir
        asalsayi:
            push dx ; dx ve cx kullanildigi icin stack'a atildi 
            push cx
            YAZDIR DX   ; sayi 10 luk tabanda yazdiriliyor
            pop cx
            pop dx
        sonrakisayi:
        inc dl      ; sonraki sayiya geciliyor
        cmp dx,cx   ; girilen sayiya esitse program biter
        jne disdongu    
hlt

binarysearch

; binary search --- 
; sirali bir dizide en cok log(2)sayiadedi 
; kadar kontrolle aranan sayinin olup
; olmadigini bulur
; m.ali akcayol
; 29.06.2007


org 0100h
mov [0100h], 1
mov [0101h], 2
mov [0102h], 3
mov [0103h], 4
mov [0104h], 6
mov [0105h], 8
mov [0106h], 9
mov [0107h], 10
mov [0108h], 11
mov [0109h], 13
mov [010Ah], 14
mov [010Bh], 15
mov [010Ch], 16
mov [010Dh], 17
mov [010Eh], 19
mov [010Fh], 20
mov [0110h], 22
mov [0111h], 23
mov [0112h], 25
mov [0113h], 27
mov [0114h], 28
mov [0115h], 30

mov dl,2        ; bolen
mov dh,28       ; aranan sayi   
mov bx,0100h    ; en kucuk adres
mov cx,0115h    ; en buyuk adres
mov si,0100h

mov ax,cx       ; eleman sayisi hesaplaniyor
dec bx
sub ax,bx
div dl          ; ortadaki sayi bulunuyor
xor ah,ah       ; kalan atiliyor
add si,ax       ; ortadaki sayinin adresi
dongu:
    cmp [si],dh     ; ortadaki sayi arananla karsilastiriliyor
    jb sagtaraf     ; kucukse saga gidilir
    ja soltaraf     ; buyukse sola gidilir
    je bulundu      ; esitse bulunmustur
    sagtaraf:
        mov bx,si
        mov ax,cx       ; eleman sayisi hesaplaniyor
        sub ax,bx
        div dl          ; ortadaki sayi bulunuyor
        cmp al,0
        jz kalanal1
        xor ah,ah       ; kalan atiliyor
        add si,ax       ; ortadaki sayinin adresi
        jmp dongu       ; basa don
        kalanal1:       ; son kalan eleman kontrol ediliyor
            xchg al,ah
            add si,ax
            cmp [si],dh
            je bulundu
            jne sayiyok
    soltaraf:
        mov cx,si
        mov ax,cx       ; eleman sayisi hesaplaniyor
        sub ax,bx
        div dl          ; ortadaki sayi bulunuyor
        cmp al,0
        jz kalanal2
        xor ah,ah       ; kalan atiliyor
        sub si,ax       ; ortadaki sayinin adresi
        jmp dongu       ; basa don
        kalanal2:       ; son kalan eleman kontrol ediliyor
            xchg al,ah
            sub si,ax
            cmp [si],dh
            je bulundu
            jne sayiyok

; yazdirma islemleri

bulundu:                
    mov dx, offset mesajvar
    mov ah, 9
    int 21h
    ret
    mesajvar db "sayi bulundu $"         
    jmp cikis         
sayiyok:
    mov dx, offset mesajyok
    mov ah, 9
    int 21h 
    ret
    mesajyok db "sayi yok $"         
cikis:
hlt

bubblesort

; hafizada yeralan toplam 100 karakterden
; ADET ile belirtilen kadarini kendi 
; yerinde siralayan algoritma - bubblesort
; m.ali akcayol                  
; 28.06.2007


org 0100h
dizi0 db 'v','a','z','b','t','r','z','k','m','a'
dizi1 db 'v','a','z','b','t','r','z','k','m','a'
dizi2 db 'v','a','z','b','t','r','z','k','m','a'
dizi3 db 'v','a','z','b','t','r','z','k','m','a'
dizi4 db 'v','a','z','b','t','r','z','k','m','a'
dizi5 db 'v','a','z','b','t','r','z','k','m','a'
dizi6 db 'v','a','z','b','t','r','z','k','m','a'
dizi7 db 'v','a','z','b','t','r','z','k','m','a'
dizi8 db 'v','a','z','b','t','r','z','k','m','a'
dizi9 db 'v','a','z','b','t','r','z','k','m','a'
        
ADET dw 9                   ; ilk 10 karakter siralanir

mov dx,ADET                 ; eleman sayisi-1
call ekranayazdir

dongu:                      ; toplam eleman sayisi kadar tekrar
    mov cx,0                ; siralanmamis eleman sayisi
    icdongu:                ; kalan eleman sayisi kadar tekrar         
        mov si,cx
        mov al,[dizi0+si]   ; soldaki eleman
        mov bl,[dizi0+si+1] ; sagdaki eleman
        cmp al,bl
        jbe devam           ; soldaki kucukse degistrme yapma
        call degistir       ; soldaki buyukse degistir
        devam:               
            inc cx          ; siralanmamis elemanlarda bir artir
            cmp cx,dx       ; siralanmamis elemanlarin sonuna geldimi
            jnb icdongusonu ; siralanmamis elemanlarin sonu
    jmp icdongu             ; siralanmamis eleman devam ediyor
    icdongusonu:            ; ic dongude siralanmamis eleman kalmadi    
    dec dx                  ; sirasiz kalan eleman sayisini bir azalt
    cmp dx,0                ; sirasiz eleman sayisi 0 mi?
    je bitir                ; sirasiz eleman sayisi 0 ise bitir
    jmp dongu               ; sirasiz eleman varsa basa git
bitir: 
call ekranayazdir           ; sirali yazdir
hlt                         ; program bitisi

degistir proc               ; yanyana iki karakter yer degistirir
    mov [dizi0+si],bl
    mov [dizi0+si+1],al 
    ret
degistir endp

ekranayazdir proc
    push dx                 ; dl ye deger atanacak
    mov cx, 0               ; karakter sayaci
    mov ah, 2               ; int 21, ah=2, ekrana karakter yazdir
    tekrar:  
        mov si,cx
        mov dl, [dizi0+si]
        int 21h             ; int 21, ah=2, ekrana karakter yazdir
        inc cx
        cmp cx, ADET
        ja cikis
    jmp tekrar  
    cikis:  
    mov dl, 0Dh             ; return
    int 21h                 
    mov dl, 0Ah             ; yeni satir
    int 21h
    pop dx                  ; dl nin eski degeri alindi
    ret    
ekranayazdir endp

carpmaislemi

org 0100h
mov [0100h], word ptr 121   ; 1.sayi
mov [0102h], word ptr 235   ; 2.sayi
mov bx,[0100h]                
mov ax,[0102h]  
mov dl,2                    ; bolen (2)
mov cx,0                    ; kalanlarin toplami saklanacak        
cmp bx,0                    ; 1.sayi sifirmi?
jz bitis                    ; sifirsa bitir
dongu:                      ; her dongude 1.sayi iki katina cikar 2.sayi 2'ye bolunur
    cmp ax,0                ; 2.sayi sifirsa veya dongude sifir olduysa bitir
    jz bitis
    div dl                  ; 2.sayi 2'ye bolunur
    cmp ah,0                ; kalan kontrol ediliyor
    jz atla                 ; kalan yoksa ekleme yapmadan devam et
    add cx,bx               ; kalan 1 ise 1.sayiyi sonuca ekle
    atla:                   
        add bx,bx           ; 1.sayiyi iki katina cikar
        xor ah,ah           ; bir onceki islemden kalani sifirla
        jmp dongu           
bitis:  
mov [0104h],cx              ; sonucu bir sonraki adrese kaydet
hlt

matriscarpimi

; 2x2 iki matrisin carpimini hesaplar
; 0100h-0103h birinci matris
; 0104h-0107h ikinci matris
; m.ali akcayol - 26.07.2007
;
; 1   2   3   5   7   D
;       X       = 
; 3   8   2   4   19  2F
;
                        
org 0100h
mov [0100h],1
mov [0101h],2
mov [0102h],3
mov [0103h],8
mov [0104h],3
mov [0105h],5
mov [0106h],2
mov [0107h],4

mov al,[0100h]
mul [0102h]
mov bl,al
mov al,[0101h]
mul [0106h]
add al,bl
mov [0108h],al

mov al,[0100h]
mul [0105h]
mov bl,al
mov al,[0101h]
mul [0107h]
add al,bl
mov [0109h],al

mov al,[0102h]
mul [0104h]
mov bl,al
mov al,[0103h]
mul [0106h]
add al,bl
mov [010Ah],al

mov al,[0102h]
mul [0105h]
mov bl,al
mov al,[0103h]
mul [0107h]
add al,bl
mov [010Bh],al

hlt

radixsort

; radix sort - kelimeleri alfabetik olarak siralar
; m.ali akcayol
; 11.07.2007

org 0100h
kelimeler db 'klf','dfa','fez','zas','ser','akf','kle','mys','mhv','akc'

mov di,0                    ; hangi karakterin karsilatirilmakta oldugunu saklar
mov si,offset kelimeler     ; kelime sayisi kadar dongu icin
mov ch,0                    ; her kelime icin
mov dl,9                    ; siralanmamis eleman sayisi

call ekranayazdir           ; kelimelerin ilk sirasini ekrana yazar

sonrakikelime:              ; her dongude bir sonraki kelimeyi secer
    cmp di,2                ; di=2 ise 3.karakterlere gore siralaniyor
    je karakter3            
    cmp di,1                ; di=1 ise 2.karakterlere gore siralaniyor
    je karakter2            
    cmp di,0                ; di=0 ise 1.karakterlere gore siralaniyor
    je karakter1            
    karakter3:              ; ucuncu karakterlere gore siralaniyor
        mov al,[si-2]       ; ucuncu karaktere gore siralamayi...
        cmp al,[si+3-2]     ; ...birinci ve ikinci karakterleri ayni olanlar arasinda yap
        jne atla            ; birinci karakterler ayni degilse gec
    karakter2:              ; ikinci karakterlere gore siralaniyor 
        mov al,[si-1]       ; ikinci karaktere gore siralamayi...
        cmp al,[si+3-1]     ; ...birinci karakterleri ayni olanlar arasinda yap
        jne atla            ; birinci karakterler ayni degilse gec
    karakter1:              ; ikinci karakterlere gore siralaniyor 
        mov al,[si]         
        cmp al,[si+3]       ; birinci karakterler ayni ikincileri karsilastir
        jbe atla            ; birinci ikinciden kucukse yer degistirme

        push si             ; su andaki si push edilir
        sub si,di              ; yer degisterecek kelimenin ilk karakter adresi
        call yerdegistir
        pop si              ; eski si geri alindi
    atla:
        inc ch              ; bir kelime ilerle
        cmp ch,dl           
        je sonrakitur       ; siralanmamislarin sonuysa bir sonraki tura gec
        add si,3            ; degilse bir sonraki kelimeye gec
        jmp sonrakikelime       
    sonrakitur:             ; kelime sayisi kadar tur yapilir
        dec dl              ; her turda bir kelime dogru yere getirilir (bubble sort)
        cmp dl,0            ; en son tur bittimi?
        je sonrakikarakter  ; bir sonraki karaktere gec
        mov si, offset kelimeler    ; yeni tur
        mov ch,0                    
        jmp sonrakikelime   ; sonraki kelimeye gec
    sonrakikarakter:        ; bir sonraki karaktere gore siralar
        mov dl,9            ; siralanmamis kelime sayisi
        inc di              ; siralanacak yeni kaakter sira nosu
        cmp di,3            ; karakter bittimi? 3=4.karakter
        je bitis            ; evet bitir
        mov si, offset kelimeler    ; ilk kelimenin ilk karakterini gosterir
        add si,di                   ; si her kelimenin di.karakterini gosterir
        mov ch,0                    ; ilk kelimeye gecmek icin 
        jmp sonrakikelime           
bitis:
call ekranayazdir 
call mesajyaz
hlt

yerdegistir proc                    ; si ile verilen kelimeyle yanindakini yer degistir
    push si
    push cx
    mov cl,0
    dongu:
        mov al,[si]
        mov bl,[si+3]
        mov [si],bl
        mov [si+3],al
        inc si
        inc cl
        cmp cl,3
        je cikis
        jmp dongu 
    cikis:    
    pop cx
    pop si       
    ret
yerdegistir endp                               

ekranayazdir proc           ; ekrana 3 karakterlik kelimeleri alt alta yazar
    pusha
    mov cx, 0               ; karakter sayaci
    devam:  
        mov si,cx 
        mov dl, [0100h+si]
        mov ah, 2           
        int 21h             ; int 21, ah=2, ekrana dl'deki karakteri yazar
        inc cx
        cmp cx,30           ; toplam 30 karakter
        je yazmacikisi
        mov ax,cx
        mov bl,3            ; her kelimeden sonra alt satira gecer
        div bl
        cmp ah,0
        jne devam
        mov ah, 2           
        mov dl, 0Dh         ; return
        int 21h                 
        mov dl, 0Ah         ; yeni satir
        int 21h
        jmp devam
    yazmacikisi:
    mov ah, 2           
    mov dl, 0Dh             ; return
    int 21h                 
    mov dl, 0Ah             ; yeni satir
    int 21h
    mov dl, 0Dh             ; return
    int 21h                 
    mov dl, 0Ah             ; yeni satir
    int 21h
    popa
    ret    
ekranayazdir endp   

mesajyaz proc
    mov dx, offset mesaj
    mov ah, 9
    int 21h
    ret
    mesaj db "alfabetik siralama islemi tamamlandi... $"         
mesajyaz endp

selectionsort

org 0100h
mov [0100h],'7'
mov [0101h],'5'
mov [0102h],'9'
mov [0103h],'3'
mov [0104h],'2'
mov [0105h],'7'
mov [0106h],'8'
mov [0107h],'6'
mov [0108h],'5'
mov [0109h],'1'
mov [010Ah],'3'

call ekranayazdir   ; baslangic durumunu yazdir

mov dx,0100h        ; soldaki gosterge
mov cx,0100h        ; kontrol edilen 
mov bx,0100h        ; en kucuk sayinin adresi icin 

dongu:              ; her sayinin dogru yeri bulunur
    mov si, cx      
    mov al,[si]     
    cmp al,[bx]     ; bir sonraki sayi en kucukle karsilastirilir
    jae atla        ; buyuk veya esitse bir sonrakine gec
    mov bx,cx       ; yeni sayi en kucukten kucukse en kucuk yap
    inc cx          ; bir sonrakine gec
    cmp cx,010Bh    ; sona gelindimi?
    je yerdegistir  ; sonda ise yer degistir
    jmp dongu       ; sona gelinmedi basa don
    yerdegistir:
        cmp bx,dx
        je ayniatla ; ayni eleman yer degistirme
            call degistir   ; dx ile bx yer degistirir
        ayniatla:
        inc dx          ; soldaki gosterge bir ilerler
        cmp dx, 010Ah   ; sona gelindimi?
        je cikis        ; son elemanda sirasina konduysa cikis yap 
        mov cx,dx       ; siralanmamis sayinin adresi cx bx e atilir
        mov bx,dx
        jmp dongu       ; basa don 
    atla:               ; yeni sayi buyuk veya esitse bir sonrakini sec
        inc cx
        cmp cx,010Bh    ; sona gelindimi?
        je yerdegistir  ; son elemanda en kucukle karsilastirildigi
        jmp dongu       ; yer degirme yapilir ve basa donulur
          
cikis:
    call ekranayazdir
hlt    
                              
degistir proc
    push ax
    push si
    mov si,dx
    mov al,[si]
    mov ah,[bx]
    mov [si],ah
    mov [bx],al
    pop si
    pop ax
    ret    
degistir endp    

ekranayazdir proc
    mov cx, 0               ; karakter sayaci
    mov ah, 2               ; int 21, ah=2, ekrana karakter yazdir
    tekrar:  
        mov si,cx
        mov dl, [0100h+si]
        int 21h             ; int 21, ah=2, ekrana karakter yazdir
        inc cx
        cmp cx,11
        je yazmacikisi
        mov dl, ','
        int 21h             ; int 21, ah=2, ekrana karakter yazdir
    jmp tekrar  
    yazmacikisi:  
    mov dl, 0Dh             ; return
    int 21h                 
    mov dl, 0Ah             ; yeni satir
    int 21h
    ret    
ekranayazdir endp

tekcift

; bir dizideki tek sayilari dizinin on kismina
; cift sayilari arka kismina alir
; m.ali akcayol                  
; 01.07.2007

org 0100h
mov [0100h],'1'
mov [0101h],'4'
mov [0102h],'2'
mov [0103h],'8'
mov [0104h],'7'
mov [0105h],'3'
mov [0106h],'5'
mov [0107h],'9'
mov [0108h],'2'
mov [0109h],'6'

call ekranayazdir   ; baslangic durumunu yazdir

mov bx,0100h        ; ilk sayi
mov cx,0109h        ; son sayi
mov dl,2            ; bolen

teksayidongu:       ; soldaki ilk cift sayiyi bulur
    mov si, bx
    mov al,[si]     
    xor ah,ah       ; onceki bolme sonucu atiliyor
    div dl          
    cmp ah,0        ; bolmede kalan varmi?
    jnz devamtek        ; kalan varsa tektir
    jmp ciftsayidongu   ; kalan yoksa cifttir
    
    devamtek:
        inc bx
        cmp bx,cx
        je cikis
        jmp teksayidongu
        
ciftsayidongu:
    mov si,cx
    mov al,[si]
    xor ah,ah
    div dl
    cmp ah,0
    jz devamcift
    jmp degistir
    
    devamcift:
        dec cx
        cmp bx,cx
        je cikis
        jmp ciftsayidongu
        
degistir:
    push ax
    mov al,[bx]
    mov ah,[si]
    mov [bx],ah
    mov [si],al
    pop ax
    jmp teksayidongu
          
cikis:
call ekranayazdir
hlt    
                              
ekranayazdir proc
    mov cx, 0               ; karakter sayaci
    mov ah, 2               ; int 21, ah=2, ekrana karakter yazdir
    tekrar:  
        mov si,cx
        mov dl, [0100h+si]
        int 21h             ; int 21, ah=2, ekrana karakter yazdir
        inc cx
        cmp cx,9
        ja yazmacikisi
        mov dl, ','
        int 21h             ; int 21, ah=2, ekrana karakter yazdir
    jmp tekrar  
    yazmacikisi:  
    mov dl, 0Dh             ; return
    int 21h                 
    mov dl, 0Ah             ; yeni satir
    int 21h
    ret    
ekranayazdir endp

deci to hex

; decibin - get decimal digits from keyboard
; and convert them to binary in BX register

.model tiny

.code
.startup

;- - - - - - - - - - - -

; main program loop

start:
  call    read_num
  call    print_crlf
  call    print_hex
  call    print_crlf
  jmp     start       ; loop endlessly


; *********************************************
; print_crlf
; prints out a carriage return and linefeed
; *********************************************

print_crlf  proc

    mov   ah, 2h    ; print character function
    mov   dl, 0dh   ; carriage return
    int   21h       ; print it
    mov   dl, 0ah   ; linefeed
    int   21h       ; print it
    
  ret
print_crlf endp



; *********************************************
; read_num
; reads a number from keyboard input
; and stores it in BX in binary
; *********************************************

read_num  proc

    mov   bx, 0h      ; clear bx for number
  
  ;
  ; get digit from keyboard and
  ; convert it to binary
  ;
  newchar:
    mov   ah, 1h      ; keyboard input function
    int   21h         ; execute ^ with dos
    sub   al, 30h     ; ascii to binary
    jl    endinpt     ; jump if < 0
    cmp   al, 9d      ; is it > 9d?
    jg    endinpt     ; yes, not decimal digit
    cbw               ; byte in al to word in ax
    
  ;
  ; digit is now in AX
  ; multiply number in BX by 10d
  ;
    xchg  ax, bx      ; trade digit and number
    mov   cx, 10d     ; put 10d in CX
    mul   cx          ; number times 10d
    xchg  ax, bx      ; trade number and digit
  
  ; 
  ; add digit in AX to number in BX
  ;
    add   bx, ax      ; add digit to number
    jmp   newchar     ; get next digit
  
  ;
  ; check to see what they entered
  ; if nothing, exit
  ; otherwise, return from process
  ;
  endinpt:
    cmp   bx, 0h      ; is it 0?
    jne   return      ; nope, return from process
    .exit             ; yup, exit program
  
  return:
  
  ret
read_num endp



; *********************************************
; print_hex
; prints in hex to the screen the contents of 
; BX
; *********************************************

print_hex proc

    mov   ch, 4h    ; number of digits to print
  
  ; start with first digit in BX
  ; register

  rotate:
    mov   cl, 4h    ; set count to 4 bits
    rol   bx, cl    ; left digit to right
  
  ; convert to number

    mov   al, bl    ; mov to AL
    and   al, 0fh   ; mask off left digit
    add   al, 30h   ; convert hex to ascii
    cmp   al, 3ah   ; is it > 9?
    jl    printit   ; jump if digit =0 to 9
    add   al, 27h   ; digit is A to F
  
  ; print the digit in
  ; the AL register

  printit:
    mov   dl, al    ; put ASCII char in DL
    mov   ah, 2h    ; display output function
    int   21h       ; call DOS
    dec   ch        ; done 4 digits?
    jnz   rotate    ; not yet
    
  ; fallthrough and return
  
  ret
print_hex endp

    
;- - - - - - - - - - - -

  end

hex-dec çevrimi

                .MODEL SMALL
		.STACK 64
		.DATA
DATA1		DB	6H
DATA2		DB	?
MAIN		PROC	FAR
MOV AX,DATA1
MOV BX,0AH
DIV BX
MOV DH,AL
MUL BX
MOV CX,DATA1
SUB CX,AX
MOV DL,CL
http://eng.harran.edu.tr/~nbesli/RBT/80x86_Komut.pdf

eem332-assembly-algoritmalar.zip

ZIP arşivi · 13 KB · 09.04.2015

⬇ (13 KB)