.model small .stack 100h DATA SEGMENT MENUT DB 10,13,10,13,'MENU:' DB 10,13,'1 - Vypis cisiel v doplnkovom kode' DB 10,13,'2 - Suma vsetkych cisel' DB 10,13,'3 - Usporiada cisla vzostupne -> VYSTUP.TXT' DB 10,13,'4 - Usporiada cisla zostupne -> VYSTUP.TXT' DB 10,13,'5 - Vynasobi dve vybrane cisla' DB 10,13,'6 - Vydeli dve vybrane cisla' DB 10,13,'7 - Konec programu',10,13 DB 10,13,'Vasa volba:$' ERROR1 DB 10,13,'Nepodarilo sa otvorit(vytvorit) subor$' ERROR2 DB 10,13,'Nepodarilo sa nacitat data$' ERROR3 DB 10,13,'Nepodarilo sa zatvorit subor$' ERROR4 DB 10,13,'cislo mimo rozsahu<-32768 ; 32767>$' ERROR5 DB 10,13,'poradove cislo je prilis velke, zadajte znova:$' INFO0 DB 10,13,'stlacte lubovolnu klavesu$' INFO2 DB 10,13,'rewrite file , save data, closefile$' NL DB 10,13,'$' text1 DB 10,13,10,13,'Nacitane cisla v tvare doplnkovy BIN=DEC',10,13,'$' text2 DB 10,13,10,13,'Suma cisel tvare BIN=DEC',10,13,'$' text3 DB 10,13,10,13,'Prebieha usporiadanie...',10,13,'$' text4 DB 10,13,'Nasobenie',10,13,'$' text41 DB 10,13,'Urcte prveho clena:$' text42 DB 10,13,'Urcte druheho clena:$' text5 DB 10,13,'vysledok:$' text51 DB 10,13,'zvysok:$' text6 DB 10,13,'Delenie',10,13,'$' text61 DB 10,13,'Urcte menovatel:$' text62 DB 10,13,'Urcte citatel:$' SUBORI DB 'VSTUP.TXT',0 SUBORO DB 'VYSTUP.TXT',0 LDATA DB 255 DUP(0) ;ak zmenim hodnotu treba ju zmenit aj v programe POCET DB 0,0 SUCET DB 10,13,'Sucet vstupnych cisiel je: $' musim_znova DB 0 ;pre otacanie cislo_zobraz DB '0000000000000000= ',13,10,'$' ;formular pre zobrazenie cisla DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: mov AX, SEG DATA mov DS, AX ;-nacitanie cislic so suboru do retazca LDATA- OPENfile: mov AH, 3dH ;otvorenie suboru na citanie mov DX, OFFSET SUBORI ;adresa ASCIIZ retazca mena suboru mov AL, 0 ;subor na nacitavanie int 21H jnc LOADdata mov DX, OFFSET ERROR1 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;inak je AX rukojet suboru LOADdata: ;nacitanie zo suboru mov BX, AX ;premiestni rukojet do BX (budem potrebovat pri zatvarani suboru) mov AH, 3fH ;pre ncitavanie mov DX, OFFSET LDATA ;nacitavam do LDATA mov CX, 255 ;maximalne 255 znakov ;tu int 21H ;v AX je pocet skutocne precitanych bitov jnc CLOSEfile mov DX, OFFSET ERROR2 ;doslo k chybe mov AH, 09H int 21H jmp koniec CLOSEfile: mov AH, 3eH ;zavretie vstupneho suboru int 21H jnc PREVODbin mov DX, OFFSET ERROR3 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;-prevod cisiel z retazca do dvojkovych cisel- PREVODbin: call RDCISLO ;-hlavne menu- menu_0: call zmazobr mov DX, OFFSET MENUT ;vypis menu mov AH, 09H int 21H call citajznak ;nacitanie znaku cmp al,'1' jnz menu_1 ;ak stlac. "1" potom Vypisanie mov DX,offset text1 ;vypis textu mov AH, 09H int 21H call vypis ;vypis znakov call press_any_key ;cakaj na stlacenie lub klavesy jmp menu_0 menu_1: cmp al,'2' jnz menu_2 ;ak stlac. "2" potom Vypisanie mov DX,offset text2 ;vypis textu mov AH, 09H int 21H call SUMAcisel call press_any_key ;cakaj na stlacenie lub klavesy jmp menu_0 menu_2: cmp al,'3' jnz menu_3 ;ak stlac. "2" potom Vypisanie mov DX,offset text3 ;vypis textu mov AH, 09H int 21H call Usporiadaj call press_any_key ;cakaj na stlacenie lub klavesy jmp menu_0 menu_3: cmp al,'4' jnz menu_4 ;ak stlac. "2" potom Vypisanie mov DX,offset text3 ;vypis textu mov AH, 09H int 21H call Usporiadajzos call press_any_key ;cakaj na stlacenie lub klavesy jmp menu_0 menu_4: cmp al,'5' jnz menu_5 ;ak stlac. "2" potom Vypisanie mov DX,offset text4 ;vypis textu mov AH, 09H int 21H call nasob call press_any_key ;cakaj na stlacenie lub klavesy jmp menu_0 menu_5: cmp al,'6' jnz menu_6 ;ak stlac. "2" potom Vypisanie mov DX,offset text6 ;vypis textu mov AH, 09H int 21H call vydel call press_any_key ;cakaj na stlacenie lub klavesy jmp menu_0 menu_6: cmp al,'7' ;ak "7" koniec programu jnz men_0 jmp koniec ;inak opakuj nacitanie znaku men_0: jmp menu_0 ;--------Definicia Procedur------------ ;-------stlacenie lubovolnej klavesy---- proc press_any_key mov DX, OFFSET INFO0 ;stlac lub.klavesu mov AH, 09H int 21H mov ch,1 ;moze byt aj riadiaci znak call citajznak ;nacitanie znaku ret press_any_key endp ;--------Nacitanie znaku--------------- citajznak proc ;nacitanie znaku zac0: xor cl,cl ;nuluj CL zac: mov ah,8 ;AH=8 int 21h ;citame znak s klavesnice [bez vypisu] cmp al,0 ;ak to nie je riadiaci znak jnz kon ;tak skocme na kon mov cl,1 ;inak nastavime CL=1 jmp zac ;a precitame druhu honotu riad. znaku kon: cmp ch,1 ;CH=1 moze byt stlaceny aj riadici znak (vstupny parameter) jz von1 ;je to kvoli "Stlac nieco ..." cmp cl,1 ;inak riad. znaky ignoruje (CH=0) jz zac0 ;po vycitani riad. znaku (2x) je stale CL=0 mov ch,dl ;skace na nacitanie dalsieho znaku CL=0 mov dl,al mov ah,2 int 21h ;vypis nacitaneho znaku ak treba (CH=0) mov dl,ch von1: xor ch,ch ;vynuluje CH ret citajznak endp ;-prevod cisla z retazca do cisla dvojkovom doplnkovom kode- RDCISLO PROC ;vstupny retazec v BX, vystup AX, znamienko CH, nacital som cislo CL=1 inak CL=0 mov bx,offset LDATA znova_citaj: xor cx,cx ;nulovanie registrov xor dx,dx xor ax,ax ;najdenie cisla v retazci analyzuj: mov dl,[bx] cmp dl,47 ;je to cislo ja analyzuj1 jmp zle ;nieje to cislo analyzuj1: cmp dl,57 ;je to cislo jna klad ;cislo je kladne zle: ;tu sa presvecim ze ci som uz spracoval ucelene cislo cmp cl,1 jz konret ;je v AX ucelene cislo ;a v CH znamienko cmp byte ptr [bx],'-' ;je to znamienko jz daj_minus ;nieje to znamienko cmp byte ptr [bx],0 ;kontrola konca retazca jz konret xor cx,cx ;akekolvek znamieko je neplatne inc bx ;idem na dalsi znak jmp analyzuj daj_minus: mov ch,1 ;ak zaporne => do CH=1 inc bx ;posun v retazci jmp analyzuj ;dalsi znak klad: mov cl,1 mov dl,10 ;priprava na nasobenie desiatimi mul dx ;cislo uz prelozene v AX vynasoby desiatimi mov dl,[bx] ;nacitanie znaku cisla sub dl,30h ;znak->cislo add ax,dx ;pripocitanie k uz prelozenemu cislu inc bx ;pohyb va retazci jmp analyzuj ;dalsi znak konret: cmp cl,1 ;je to ucelene cislo? jz rozsah ;je =>dalej ret rozsah: cmp ch,1 ;ak je cislo zaporne jz mns cmp ax,32767 ;skontrolovanie maximalnej hodnoty kladneho cisla ja erro ;ak nepasuju rozsahy cislo neratame do nasej databazi jmp uloz_cislo mns: cmp ax,32768 ;skontrolovanie maximalnej hodnoty zaporneho cisla ja erro ;ak nepasuju rozsahy cislo neratame do nasej databazi uloz_cislo: ;v ch reg. je znamienko ;este ho nespracuvam push bx ;ulozim bx mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] ;do dx ulozim hodnotu, ktora je na POCET mov bx,offset LDATA ;do bx dam adresu LDATA add bx,dx ;bx=bx+dx cmp ch,1 ;je to zaporne cislo jnz kladne_c ;ano, dam ho do doplnkoveho kodu not ax ;ak ano neguj AX add ax,1 ;pripocitaj 1 kladne_c: mov [bx],ah ;na adresu bx ulozim AH reg. inc bx ;bx=bx+1 mov [bx],al ;na adresu bx, ulozim al ; [ah][al],[ah][al],... add dx,2 ;dx=dx+2 mov bx,offset POCET ;do bx dam adresu POCET mov [bx],dh ;do dx ulozim hodnotu, ktora je na POCET inc bx mov [bx],dl ;do dx ulozim hodnotu, ktora je na POCET pop bx ;obnovim bx jmp znova_citaj ;nacitaj dalsie cislo erro: ;nepasuju rozsahy mov DX, OFFSET ERROR4 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;skonci program RDCISLO ENDP ;-------vypis cisla v dekadickom a doplnkovom kode--------- vypiscislo proc ;cislo je v ax mov bx,offset cislo_zobraz ; mov ah,2 push ax mov cx,16 znova_pis: rcl ax,1 jnc vypisNULA mov dl,'1' ;int 21h ;vypise 0 mov [bx],dl inc bx jmp skok_dalej vypisNULA: mov dl,'0' ;int 21h ;vypise 0 mov [bx],dl inc bx skok_dalej: dec cx jnz znova_pis mov dl,'=' ; int 21h ;vypise ' ' mov [bx],dl inc bx pop ax rcl ax,1 ;rotujem do lava CF=znamienko jnc plus ;ak plus ->dalej mov dl,'-' ;takze minus ;int 21h mov [bx],dl inc bx rcr ax,1 ;rotujem do prava CF=znamienko(vratim) ;korekcia pre vypis zaporneho cisla pomocou kladnych sub ax,1 ;odcitame jednotku not ax ;negujeme bx ;clc ;clear carry flaf ; ;pre zapis kladneho rcl ax,1 ;rotujem do lava CF=znamienko plus: ;pre vypis rcr ax,1 ;odrotujem set xor cx,cx ;cislo je v AX s10000: cmp ax,10000 jb s1001 sub ax,10000 inc cl ;v cl je cislica jmp s10000 s1001: cmp cl,0 jz s1000 add cl,30h ;ak nieje nula vypis cislice ; mov dl,cl ; int 21h mov [bx],cl inc bx s1000: cmp ax,1000 jb s101 sub ax,1000 inc ch ;v ch je cislica jmp s1000 s101: cmp ch,0 jnz s103 cmp cl,0 ;ak cislica=0 jz s100 ;a predosla cislica=0 skok na s100 s103: add ch,30h ; mov dl,ch ;inak vypis cislicu ; int 21h mov [bx],ch inc bx s100: xor cl,cl ;zmaz predoslu cislicu s102: cmp ax,100 ;spocita pocet 100 jb s10 sub ax,100 inc cl jmp s102 s10: cmp cl,0 jnz s13 cmp ch,0 jz s12 s13: add cl,30h ;prida 30h k poctu 100-viek ; mov dl,cl ; int 21h ;vypise pocet 100-viek mov [bx],cl inc bx s12: xor ch,ch s11: cmp ax,10 jb s1 sub ax,10 ;spocita 10-tky inc ch jmp s11 s1: cmp ch,0 jnz s3 cmp cl,0 jz s002 s3: add ch,30h ;prida 30h ; mov dl,ch ; int 21h ;vypise 10-tky mov [bx],ch inc bx s002: add ax,30h ;vypise jednotky ; mov dl,al ; int 21h mov [bx],al znovanuluj: inc bx mov dl,[bx] cmp dl,13 jz koniec_vyp mov dl,' ' ;' ' mov [bx],dl jmp znovanuluj koniec_vyp: ret vypiscislo endp ;---------vypis vsetkych cisel----------- vypis proc ;vypis cisel v dec,doplnkovom bin tvare mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] mov bx,offset LDATA ;do bx dam adresu LDATA add dx,bx ;aby som vedel aka je adresa konca pola zase: mov ah,[bx] ;ah dam horne bity inc bx mov al,[bx] ;do al dam dolne bity inc bx push dx push bx ;registe porebujem mat zachovane ;mov bx,ax call vypiscislo ;v ah,al registoch ma byt hodnota v doplnkovom kode mov dx,offset cislo_zobraz; vypis cisla mov AH, 09H int 21H pop bx pop dx cmp bx,dx ;som na konci pola? jnz zase ;ak nie znova vypis cislo ret vypis endp ;---------------- suma vsetkych cisel ------------- SUMAcisel proc mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] mov bx,offset LDATA ;do bx dam adresu LDATA add dx,bx ;aby som vedel aka je adresa konca pola xor cx,cx ;vynulujem pocitadlo znova_pocitaj: mov ah,[bx] ;ah dam horne bity inc bx mov al,[bx] ;do al dam dolne bity inc bx add cx,ax ;cx=cx+ax ..v cx je sucet cmp bx,dx ;je to koniec pola s hodnotami jnz znova_pocitaj ;ak nie spocitaj dalsie cislo mov ax,cx ;bx,cx call vypiscislo ;v ah,al registoch ma byt hodnota v doplnkovom kode mov dx,offset cislo_zobraz; vypis cisla mov AH, 09H int 21H ret SUMAcisel endp ;--------------- usporiadanie cisel -vzostupne--------------- Usporiadaj proc opet_otoc: mov bx,offset musim_znova ;zitujem ci sa musim pokusit o znovuotocenie mov [bx],byte ptr 0 mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] mov bx,offset LDATA ;do bx dam adresu LDATA add dx,bx ;aby som vedel aka je adresa konca pola znova_poc: mov ah,[bx] ;ah dam horne bity inc bx mov al,[bx] ;do al dam dolne bity inc bx mov ch,[bx] ;ah dam horne bity inc bx mov cl,[bx] ;do al dam dolne bity inc bx ;korekcie cmp ax,32768 ;je to zaporne cislo? ja ax_zap ;ak ano cmp cx,32768 ;je to zaporne cislo? ja rozne_zmnamienka ;ak ano (predosle nie) rovnake_znamienka: cmp ax,cx ;teda obe cisla su kladne(zaporne) jb neotacaj jz neotacaj xchg ax,cx ;a este ich musim aj otocit jmp otacaj ax_zap: cmp cx,32768 ;je v cx zaporne ja rovnake_znamienka ;ano maju rovnake minusove znamienka rozne_zmnamienka: ;teda obe cisla maju rozne znamienka cmp ax,cx ja neotacaj jz neotacaj xchg ax,cx ;a este ich musim aj otocit otacaj: push bx ;informacia ze doslo k otoceniu mov bx,offset musim_znova mov [bx],byte ptr 1 pop bx sub bx,4 mov [bx],ah ;ah dam horne bity inc bx mov [bx],al ;do al dam dolne bity inc bx mov [bx],ch ;ah dam horne bity inc bx mov [bx],cl ;do al dam dolne bity inc bx neotacaj: cmp bx,dx ;zistim ci je koniec retazca jz koniec_ot sub bx,2 ;idem na dalsiu dvojicu jmp znova_poc koniec_ot: mov bx,offset musim_znova ;zitim ci sa musim pokusit o znovuotocenie mov dh,[bx] cmp dh,1 jz opet_otoc ;mohol by som to nahrat do vystupneho suboru ;tu potrebujem zalozit subor ;============== NEWfileO: mov DX, OFFSET INFO2 ;doslo k chybe mov AH, 09H int 21H mov AH, 3cH ;otvorenie suboru na citanie mov DX, OFFSET SUBORO ;adresa ASCIIZ retazca mena suboru mov CX, 0 ;nejake atributy souboru int 21H jnc SAVEdata mov DX, OFFSET ERROR1 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;inak je AX rukojet suboru SAVEdata: ;nacitanie zo suboru mov CX,AX ;rukojet budeme potrebovat pri zatvarani push CX ;=================== mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] mov bx,offset LDATA ;do bx dam adresu LDATA add dx,bx ;aby som vedel aka je adresa konca pola zase00: mov ah,[bx] ;ah dam horne bity inc bx mov al,[bx] ;do al dam dolne bity inc bx push dx push bx ;registe porebujem mat zachovane call vypiscislo ;v ah,al registoch ma byt hodnota v doplnkovom kode pop bx pop dx ;tu to potrebujem zapisat do suboru pop cx ;hnusny tach pre ziskane rukojete push cx push dx push bx ;registe porebujem mat zachovane mov ah,40h ;zapis do suboru mov bx,cx ;pre toto ten 'tah' mov dx,offset cislo_zobraz ;vypis cisla mov cx,28 ;pocet int 21H pop bx pop dx cmp bx,dx ;som na konci pola? jnz zase00 ;ak nie znova vypis cislo ;======= CLOSEfile0: pop CX mov bx,cx mov AH, 3eH ;zavretie vstupneho suboru int 21H jnc koniec_usp mov DX, OFFSET ERROR3 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;======= koniec_usp: ret usporiadaj endp ;--------------- usporiadanie cisel -zostupne--------------- Usporiadajzos proc opet_otocZOS: mov bx,offset musim_znova ;zitujem ci sa musim pokusit o znovuotocenie mov [bx],byte ptr 0 mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] mov bx,offset LDATA ;do bx dam adresu LDATA add dx,bx ;aby som vedel aka je adresa konca pola znova_pocZOS: mov ah,[bx] ;ah dam horne bity inc bx mov al,[bx] ;do al dam dolne bity inc bx mov ch,[bx] ;ah dam horne bity inc bx mov cl,[bx] ;do al dam dolne bity inc bx ;korekcie cmp ax,32768 ;je to zaporne cislo? ja ax_zapZOS ;ak ano cmp cx,32768 ;je to zaporne cislo? ja rozne_zmnamienkaZOS ;ak ano (predosle nie) rovnake_znamienkaZOS: cmp ax,cx ;teda obe cisla su kladne(zaporne) ja neotacajZOS jz neotacajZOS xchg ax,cx ;a este ich musim aj otocit jmp otacajZOS ax_zapZOS: cmp cx,32768 ;je v cx zaporne ja rovnake_znamienkaZOS ;ano maju rovnake minusove znamienka rozne_zmnamienkaZOS: ;teda obe cisla maju rozne znamienka cmp ax,cx jb neotacajZOS jz neotacajZOS xchg ax,cx ;a este ich musim aj otocit otacajZOS: push bx ;informacia ze doslo k otoceniu mov bx,offset musim_znova mov [bx],byte ptr 1 pop bx sub bx,4 mov [bx],ah ;ah dam horne bity inc bx mov [bx],al ;do al dam dolne bity inc bx mov [bx],ch ;ah dam horne bity inc bx mov [bx],cl ;do al dam dolne bity inc bx neotacajZOS: cmp bx,dx ;zistim ci je koniec retazca jz koniec_otZOS sub bx,2 ;idem na dalsiu dvojicu jmp znova_pocZOS koniec_otZOS: mov bx,offset musim_znova ;zitim ci sa musim pokusit o znovuotocenie mov dl,[bx] cmp dl,1 jz opet_otocZOS ;mohol by som to nahrat do vystupneho suboru ;tu potrebujem zalozit subor ;============== NEWfileOZOS: mov DX, OFFSET INFO2 ;doslo k chybe mov AH, 09H int 21H mov AH, 3cH ;otvorenie suboru na citanie mov DX, OFFSET SUBORO ;adresa ASCIIZ retazca mena suboru mov CX, 0 ;nejake atributy souboru int 21H jnc SAVEdataZOS mov DX, OFFSET ERROR1 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;inak je AX rukojet suboru SAVEdataZOS: ;nacitanie zo suboru mov CX,AX ;rukojet budeme potrebovat pri zatvarani push CX ;=================== mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] ;do dx ulozim hodnotu, ktora je na POCET mov bx,offset LDATA ;do bx dam adresu LDATA add dx,bx ;aby som vedel aka je adresa konca pola zase00ZOS: mov ah,[bx] ;ah dam horne bity inc bx mov al,[bx] ;do al dam dolne bity inc bx push dx push bx ;registe porebujem mat zachovane call vypiscislo ;v ah,al registoch ma byt hodnota v doplnkovom kode pop bx pop dx ;tu to potrebujem zapisat do suboru pop cx ;hnusny tach pre ziskane rukojete push cx push dx push bx ;registe porebujem mat zachovane mov ah,40h ;zapis do suboru mov bx,cx ;pre toto ten 'tah' mov dx,offset cislo_zobraz ;vypis cisla mov cx,28 ;pocet int 21H pop bx pop dx cmp bx,dx ;som na konci pola? jnz zase00ZOS ;ak nie znova vypis cislo ;======= CLOSEfile0ZOS: pop CX mov bx,cx mov AH, 3eH ;zavretie vstupneho suboru int 21H jnc koniec_uspZOS mov DX, OFFSET ERROR3 ;doslo k chybe mov AH, 09H int 21H jmp koniec ;======= koniec_uspZOS: ret usporiadajzos endp ;--------------- zmazanie obrazovky----------------- zmazobr proc mov ah,6 ; nastavenie registrov mov ch,0 mov cl,0 mov dh,25 mov dl,80 mov al,0 mov bh,07h ;farba (0-pozadie; 2-text) int 10h ;zmazanie obrazovky mov ah,2 ;nastavenie kurzoru mov dh,0 mov dl,0 mov bh,0 int 10h ;kurzor na (0,0) ret zmazobr endp ;---- nacitaj_poradia0 proc opet_nacitaj: xor ax,ax xor cx,cx xor bx,bx pokracuj_nacitavani: sub cl,48 ;aby som mal cislo cmp cl,9 ja zlyznak mov ax,bx ;ax=bx mov dx,10 ;dx=10 mul dx ;ax=ax*dx add ax,cx ;ax=ax+cx mov bx,ax ;bx=ax zlyznak:call citajznak mov ah,0 ;korekcia mov cx,ax cmp cl,13 jnz pokracuj_nacitavani ;v bx mam hodnotu mov cx,bx ;zistim ci su cisla <= pocet prvkov a do registov ulozim ich hodnoty mov bx,offset POCET ;do bx dam adresu POCET mov dh,[bx] ;do dx ulozim hodnotu, ktora je na POCET inc bx mov dl,[bx] ;do dx ulozim hodnotu, ktora je na POCET shr dx,1 ;vlasne delim dvomi cmp cx,dx ;je to cislo mensie(rovne) ako maximum? ja velke_cislo mov bx,offset LDATA ;do bx dam adresu LDATA dec cx ;retazec je od nuly shl cx,1 ;cx*2 add bx,cx ;vlastne nasobim dvomi mov dh,[bx] inc bx mov dl,[bx] ;v dx je cislo ret ;chod prec velke_cislo: ;text a znova mov DX, OFFSET ERROR5 ;doslo k chybe mov AH, 09H int 21H jmp opet_nacitaj ret nacitaj_poradia0 endp ;------------ nasob proc ;nasobenie znaku mov DX, OFFSET text41 ;'prvy clen' mov AH, 09H int 21H call nacitaj_poradia0 push dx mov DX, OFFSET text42 ;'druhy clen' mov AH, 09H int 21H call nacitaj_poradia0 xor cx,cx ;cx=0 (kladne znamienko) ;ak je cislo zaporne cmp dx,32768 ;je to zaporne cislo? jb dx_kladne0 ;ak nie dec dx not dx ;korekcia not cx ;invertujem (je minus) dx_kladne0: mov ax,dx pop dx ;to prve cislo ;ak je cislo zaporne cmp dx,32768 ;je to zaporne cislo? jb dx_kladne1 ;ak ano dec dx not dx ;korekcia not cx ;invertujem dx_kladne1: mul dx ;v ax je vysledok imul cmp cx,0 ;vysledok zaporne cislo? jz ax_kladne2 ;ak nie vypis ;korekcia not ax ;invertuj inc ax ;pripocitaj 1 ax_kladne2: call vypiscislo mov AH, 09H mov DX, OFFSET text5 int 21H mov DX, OFFSET cislo_zobraz int 21H ret nasob endp ;----------- vydel proc ;nasobenie znaku mov DX, OFFSET text61 ;'prvy clen' mov AH, 09H int 21H call nacitaj_poradia0 push dx mov DX, OFFSET text62 ;'druhy clen' mov AH, 09H int 21H call nacitaj_poradia0 xor cx,cx ;ak je cislo zaporne cmp dx,32768 ;je to zaporne cislo? jb dx_kladne01 ;ak ano dec dx not dx ;korekcia not cx ;znamienko vysledku,znamienko zvysku (ch,cl) dx_kladne01: mov ax,dx pop dx ;to prve cislo ;ak je cislo zaporne cmp dx,32768 ;je to zaporne cislo? jb dx_kladne11 ;ak nie dec dx not dx ;korekcia not ch ;znamienko vysledku dx_kladne11: mov bx,dx xor dx,dx div bx ;v ax je vysledok div cmp ch,0 ;je to zaporne cislo? (vysledok) jz ax_kladne21 ;ak nie vypis ;korekcia not ax ;invertuj inc ax ;pripocitaj 1 ax_kladne21: push dx push cx call vypiscislo mov AH, 09H mov DX, OFFSET text5 int 21H mov DX, OFFSET cislo_zobraz int 21H pop cx pop dx cmp cl,0 ;je to zaporne cislo? (zvysok) jz kladnyzvysok ;korekcia not dx ;invertuj inc dx ;pripocitaj 1 kladnyzvysok: mov ax,dx call vypiscislo mov AH, 09H mov DX, OFFSET text51 int 21H mov DX, OFFSET cislo_zobraz int 21H ret vydel endp ;--------Konec Programu---------------- koniec: mov AX,4C00H int 21H CODE ENDS END START