name "toplacikar"              
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; 
; BU PROGRAM 
; - GEREKLİ MESAJLAR GOSTERİLİR 
; - KLAVYEDEN İKİ SAYI ALIR VE HAFIZAYA YAZAR 
; - ASCII SAYILAR KONTROL EDİLEREK GERCEK  
;   SAYIYA DONUSTURULUP HAFIZAYA YAZILIR  
; - TOPLAR VE SONUCU EKRANDA GOSTERİR 
; - BUYUK OLAN SAYIDAN KUCUGU CIKARIP 
;   FARKI EKRANDA GOSTERİR 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
 
 
org 100h    
 
jmp BASLA 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
, 
; BU MACRO BİR KARAKTERİ al'YE OKUR 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
  
HARFOKU    MACRO    
            MOV     AH, 01H     ; karakter oku 
            INT     21H   
ENDM 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; 
; BU MACRO BUFFER DAKI  STRING i EKRANA 
; YAZAR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
  
YAZMSJ      MACRO   BUFFER 
            LEA     DX, BUFFER 
            MOV     AH, 09H     ; BUFFER daki Mesaji ekrana yaz 
            INT     21H   
ENDM 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;  
; BU MACRO BUFFER A  KLAVYEDEN STRING   
; OKUR  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
OKUNUM     MACRO   BUFFER 
            LEA     DX, BUFFER 
            MOV     AH, 0AH     ; Klavyeden BUFFER'a oku 
            INT     21H   
ENDM 
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; 
; MESAJLAR:                                 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
msg0 db  0Dh,0Ah, "NOT: -32768 ILE 32767 ARASINDA TAMSAYILAR GIRINIZ",0Dh,0Ah,0Dh,0Ah, '$' 
msg1 db  0Dh,0Ah, "ILK SAYIYI GIRINIZ:    $" 
msg2 db  0Dh,0Ah, "IKINCI SAYIYI GIRINIZ: $" 
msg3 db  0dh,0ah, "TEKRAR İCİN: t CIKIS İCİN: c $" 
msg4 db  0dh,0ah, "                    İYİ GUNLER", 0Dh,0Ah,'$' 
err1 db  0dh,0ah, "   HATALI GİRİS YAPILDI!",0Dh,0Ah,'$' 
 
yenisatir  db 0dh,0ah,'$'                       ; Yeni satir 
asciisayi1 db "                 ",0dh,0ah,'$'   ; İlk sayi buffer 
asciisayi2 db "                 ",0dh,0ah,'$'   ; ikinci sayi buffer 
asciitopla db "         +_______",0dh,0ah,'$'   ; TOPLA islem cizgisi 
asciicikar db "         -_______",0dh,0ah,'$'   ; CIKARMA islem cizgisi 
asciisayi3 db "TOPLAM:          ",0dh,0ah,'$'   ; TOPLAM sonuc buffer 
asciisayi4 db "FARK  :          ",0dh,0ah,'$'   ; FARK sonuc buffer 
 
; GECİCİ ASCII SAYI HAFIZASI: 
numascii db 9,?,7 DUP(0Dh) 
 
; İLK VE İKİNCİ SAYI: 
num1 dw ? 
num2 dw ? 
 
; KATSAYILAR 
ON dw 10                            ; Onluk basamak katsayisi 
EKSI dw -1                          ; Negatif sayilar icin carpim katsayisi 
 
BASLA:                              ; Program Basliyor 
tekrar1:    YAZMSJ msg0             ; uyari mesaji goster 
            YAZMSJ msg1             ; ilk sayi giris istegi 
            OKUNUM numascii         ; sayi okuma 
            lea bx,numascii 
            call CHECKNUM           ; sayi kontrol ve cevrim 
            cmp bx,"OK"             ; sayi hatali mi? 
            je sakla1                
            YAZMSJ err1             ; Varsa, hata mesaji goster 
            jmp tekrar1 
sakla1:     mov num1,ax              
tekrar2:    YAZMSJ msg2             ; İkinci sayi istegi 
            OKUNUM numascii         ; sayi okuma 
            lea bx,numascii 
            call CHECKNUM           ; sayi kontrol ve cevrim 
            cmp bx,"OK"             ; sayi hatali mi? 
            je sakla2 
            YAZMSJ err1             ; Varsa, hata mesaji goster 
            jmp tekrar2 
sakla2:     mov num2,ax 
            YAZMSJ yenisatir 
; toplamaya basla 
            mov ax,num1             ; Cevrilecek sayi ax'e yuklenir 
            lea bx,asciisayi1+10    ; ilk sayi bufferini ayarla 
            call ASCIINUM           ; Hex ten ASCII ye donustur 
            YAZMSJ asciisayi1       ; Ekrana yaz 
            mov ax,num2              
            lea bx,asciisayi2+10    ; İkinci sayi bufferini ayarla 
            call ASCIINUM           ; Hex ten ASCII ye donustur 
            YAZMSJ asciisayi2       ; Ekrana yaz 
            YAZMSJ asciitopla       ; Toplam cizgisini goster 
; toplama yap 
            mov ax,num1 
            add ax,num2             ; Toplamayi yap 
            lea bx,asciisayi3+10    ; 
            call ASCIINUM           ; Hexten ASCII ye donustur 
            YAZMSJ asciisayi3       ; Ekrana yaz 
; farki bul             
            mov ax,num1             ; Buyuk olan sayi num1'de saklanir 
            cmp ax,num2 
            jg cikar 
            xchg ax,num2 
            mov num1,ax 
cikar:      lea bx,asciisayi1+10    ; Buyuk sayi ASCII cevrilir 
            call ASCIINUM 
            YAZMSJ asciisayi1       ; Ekrana yazilir 
            mov ax,num2 
            lea bx,asciisayi2+10    ; Kucuk sayi ASCII cevrilir 
            call ASCIINUM 
            YAZMSJ asciisayi2       ; Ekrana yazilir 
            YAZMSJ asciicikar       ; Cıkarma cizgisini goster 
; farki bul 
            mov ax,num1 
            sub ax,num2 
            lea bx,asciisayi4+10    ; Farki bul 
            call ASCIINUM           ; ASCII ye cevir 
            YAZMSJ asciisayi4       ; Ekrana yaz 
; cikis              
            YAZMSJ msg3             ; Cikmak istiyor musunuz? 
            HARFOKU                 ; Cevabi oku t: TEKRAR c: CIKIS 
            cmp al,'t'              ; Tekrar isteniyorsa BASLAT'a git  
            je BASLA               
            YAZMSJ msg4             ; Gule gule mesaji 
            ret 
                         
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; 
; BU PROCEDURE, 
;   - bx İLE İSARET EDİLEN BUFFERDAKİ BUTUN 
;     GİRİLEN KARAKTERLERİN SAYI OLDUGUNU 
;     KONTROL EDER. 
;   - EGER SAYI İSE DEGER ax'E YUKLENIR VE 
;     bx:"OK" OLARAK AYARLANIR 
;   - EGER SAYI DEGİLSE bx:"Er" OLARAK  
;     AYARLANIR     
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
CHECKNUM    PROC NEAR 
            mov ax,0            ; Sayinin degeri 
            mov cx,0            ; Sayidaki dijit sayisi 
            mov dx,0            ; gecici 
            mov di,0            ; 0:Pozitif/1:Negatif Sayi 
            mov cl,[bx+1]       ; Dijit sayicisini kur 
            mov si,2            ; Dijit İndisini ilk sayiya kur 
            cmp [bx+si],'-'     ; Sayi negatif mi? 
            jne pozitif 
            add si,1            ; Bir sonraki dijit icin indisi arttir 
            sub cl,1            ; Dijit sayisini azalt 
pozitif:    cmp [bx+si],0Dh     ; Bos sayi mi? 
            je cik 
devam:      mov dl,[bx+si]      ; Dijiti gecici saklayiciya aktir 
            cmp dl,30h          ; Girilen gercekten sayi mi? 
            jl sayidegil         
            cmp dl,39h 
            jg sayidegil 
            sub dl,30h          ; ASCII sayiyi gercek sayiya cevir 
            push dx 
            mul ON              ; Onceki desimal dijitleri sola kaydir  
            pop dx 
            add ax,dx           ; Yeni dijiti ekle 
            inc si 
            loop devam          ; Dijitler bitti mi? 
            cmp [bx+2],'-'      ; Sayi negatif mi? 
            jne cikOK               
            imul EKSI           ; Eger negatifse (-1)le carpim  
cikOK:      mov bx,"OK"         ; Girilen gecerli sayidir 
cik:        ret 
sayidegil:  mov bx,"Er"         ;Hatali giris 
            ret 
CHECKNUM    ENDP  
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;                                                ; 
; BU PROCEDURE,                                  ; 
;   - ax DEKİ SAYİYİ ASCII OLARAK bx'İN İSARET   ; 
;     ETTİGİ ALANA YAZAR                         ; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 
ASCIINUM        PROC    NEAR 
                mov cx,5 
                mov si,0 
bosluk:         mov [bx+si]," " 
                add si,1 
                loop bosluk 
                mov [bx+si],'0'                         
                mov [bx+si+1],0Dh                         
                mov [bx+si+2],0Ah                         
                mov [bx+si+3],'$'                         
                mov si,5 
                cmp ax,0 
                jg  pozitifsayi 
                jl  negatifsayi   
                ret 
negatifsayi:    mov cx,1 
                imul EKSI 
pozitifsayi:    mov dx,0 
                div ON 
                add dl,30h 
                mov [bx+si],dl 
                dec si 
                cmp ax,0 
                jne pozitifsayi 
                cmp cx,1 
                jne tmm 
                mov [bx+si],'-'     
tmm:            ret 
ASCIINUM        ENDP