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