;ZADANIE c.3 ;S vyuzitim retazcovych instrukcii (vsade kde je to mozne) vytvorte ;program, ktory: ;a) nacita z klavesnice dva retazce do dvoch roznych segmentov ; (minimalne 20 Byte), ;b) prvy retazec presunie v segmente o 10 slabik na vyssie adresy, ;c) porovna posunuty retazec s retazcom v druhom segmente, t.j. ; zisti, ci su rovnako dlhe a ci su rovnake, ;d) zisti, ci sa v niektorom z retazcov nachadza zadany podretazec. ;Zdrojovy program mus¡ byt PODROBNE OKOMENTOVANY! ;Vìsledky uk zte v ladiacom prostred¡ TurboDebugg. ;Term¡n odovzdania: na cvicen¡ do 10. tyzdna semestra ;Hodnotenie: maxim lne 8 bodov ; ;Vypracoval: STASAK Ivan ;Kruzok: B-09 ;Datum odovzdania: 26.11.1999 JUMPS data1 segment MENU: db 13,10,13,10,'a) Prekopiruj retazec 1 o 10 bytov',13,10 db 'b) Porovnaj retazce len ci su rovnake',13,10 db 'c) Vyhladanie retazca 2 v retazci 1.',13,10 db 'd) Ukoncenie programu',13,10,'> $' VRETAZEC1_JE_VACSI: db 13,10,'Retazec 1 je vacsi ako retazec 2.',13,10,'$' ZADPODRETAZEC: db 13,10,'Zadaj podretazec :$' VRETAZEC1_JE_MENSI: db 13,10,'Retazec 1 je mensi ako retazec 2.',13,10,'$' VPODRETAZEC_SA_NENACHADZA_1: db 13,10,13,10,'Podretazec sa nenachadza v retazci 1.',13,10,'$' VPODRETAZEC_SA_NACHADZA_1: db 13,10,13,10,'Podretazec sa nachadza v retazci 1.',13,10,'$' VPODRETAZEC_SA_NENACHADZA_2: db 13,10,'Podretazec sa nenachadza v retazci 2.',13,10,'$' VPODRETAZEC_SA_NACHADZA_2: db 13,10,'Podretazec sa nachadza v retazci 2.',13,10,'$' PRENOS: db 13,10,'Prenos bol uskutocneny uspesne...',13,10,'$' ZADRET1: db 13,10,'Zadaj retazec 1 :$' VROVNE: db 13,10,'Retazce sa rovnaju',13,10,'$' VNEROVNE:db 13,10,'Retazce sa nerovnaju',13,10,'$' RETAZEC1:db 200,0,200 DUP(0),'$' ZADRET2: db 13,10,'Zadaj retazac 2 :$' POMOCNY2:db 200,0,200 DUP(0),'$' data1 ends data2 segment RETAZEC2:db 200,0,200 DUP(0),'$' PODRETAZEC: db 200,0,200 DUP(0),'$' POMOCNY1:db 200,0,200 DUP(0),'$' data2 ends code segment assume cs:code,ds:data1,es:data2,ss:sseg Main: mov ax,seg data1 mov ds,ax mov ax,seg data2 mov es,ax ;************ NACITANIE RETAZCOV *********** mov dx,offset ZADRET1 ;nacitanie prveho retazca call VYPIS mov dx,offset RETAZEC1 mov ah,0ah int 21h mov dx,offset ZADRET2 ;nacitanie druheho retazca call VYPIS mov dx,offset POMOCNY2 mov ah,0ah int 21h mov si,offset POMOCNY2 mov di,offset RETAZEC2 mov cl,byte ptr [POMOCNY2+1] ;do cl sa nacita dlzka druheho retazca xor ch,ch add cx,02h cld rep movsb ;prekopirovanie druheho nacitaneho retazca do segmentu data2 mov cl,byte ptr [RETAZEC1+1] ;do cl sa nacita dlzka prveho retazca xor ch,ch add cl,2 mov si, offset RETAZEC1 mov di, offset POMOCNY1 cld rep movsb ;prekopirovanie ret1 do druheho segmentu do POMOCNY1 VMENU: mov dx,offset MENU ;vypis menu na obrazovku call VYPIS NACIT: mov ah,08h ;nacitanie volby menu int 21h cmp al,61h je B cmp al,62h je C cmp al,63h je D cmp al,64h je koniec ;********** POSUNUTIE RETAZCA O 10 BYTOV HORE ************** B: mov di,offset RETAZEC1+2+10 ;do di sa da adresa o 10 bytov vacsia mov si,offset POMOCNY1+2 mov cl,byte ptr [RETAZEC1+1] ;do cl sa ulozi pocet bytov prveho retazca xor ch,ch mov ax,10 add ax,cx mov byte ptr [RETAZEC1+1],al ;o 10 sa zvacsi pocet prvkov v retazci push ds push es ;vymena obsahu ds a es registra pop ds pop es cld rep movsb ;prekopirovanie retazca push es push ds ;spatna vymena obsahu registrov ds a es pop es pop ds mov dx,offset PRENOS ;hlaska o uskutocneni prenosu mov ah,09h int 21h jmp VMENU ;navrat na menu ;*************** POROVNANIE DVOCH RETAZCOV **************** C: mov si,offset RETAZEC1+2 ;nacitanie adries retazcov mov di,offset RETAZEC2+2 mov cl,byte ptr [RETAZEC2+1] ;nacitanie poctu prvkov retazcov mov bl,byte ptr [RETAZEC1+1] xor ch,ch cmp cl,bl ;porovna pocet prvkov retazcov jne NEROVNE ;ak sa nerovnaju tak skoci cld repe cmpsb ;ak sa rovnaju tak porovna retazce jne NEROVNE1 ;ak najde nejaky zly byte tak skoci a skoci mov dx,offset VROVNE ;ak sa dostane az sem tak vypise ze retazce su rovnake call VYPIS jmp VMENU ;skok na menu NEROVNE1: mov dx,offset VNEROVNE ;hlaska o tom ze retazce sa nerovnaju call VYPIS JMP VMENU ;navrat na menu NEROVNE: cmp cl,bl ;ak nie je pocet prvkov rovnaky tak skoci jc RETAZEC1_JE_VACSI ;ak je cl > bl tak vypis ze jeden je vacsi ako druhy mov dx,offset VRETAZEC1_JE_MENSI call VYPIS jmp VMENU RETAZEC1_JE_VACSI: mov dx,offset VRETAZEC1_JE_VACSI call VYPIS jmp VMENU ;************ VYHLADANIE PODRETAZCA **************** D: mov dx,offset ZADPODRETAZEC call VYPIS mov dx,offset PODRETAZEC push ds ;zmena obsahu ds a es push es pop ds mov ah,0ah int 21h ;nacitanie podretazca push ds pop es ;spatna zmena obsahu registrov ds a es pop ds mov si,offset RETAZEC1+2 ;nacitanie adries retazcov mov di,offset PODRETAZEC+2 mov cl,byte ptr [PODRETAZEC+1] ;do cl sa ulozi pocet prvkov podretazca mov bl,byte ptr [RETAZEC1+1] ;a do bl pocet znakov retazca1 xor ch,ch PREJDI_NA_DALSI_1: push di push cx push si push bx cmp cl,bl ;najskor porovna pocet prvkov retazca a podretazca je POROVNAJD_1 ;ak su rovnake tak ide na POROVNAJD_1 jnc PODRETAZEC_SA_NENACHADZA_1 ;ak je podretazec dlhsi ako retazec tak ;vypise ze ho nenasiel POROVNAJD_1: cld rep cmpsb ;porovna retazec1 a podretazec jne NENASIEL_ROVNAKE_1 ;ak sa nerovnaju tak skoci pop bx pop si pop cx pop di ;ak sa rovnaju tak zahlasi ze ho nasiel mov dx,offset VPODRETAZEC_SA_NACHADZA_1 call VYPIS jmp POKRACUJ_V_RET_2 ;po najdeni podretazca pokracuje v hladani v druhom retazci PODRETAZEC_SA_NENACHADZA_1: pop bx pop si pop cx ;vypis hlasky o tom ze nenasiel podretazec pop di mov dx,offset VPODRETAZEC_SA_NENACHADZA_1 call VYPIS jmp POKRACUJ_V_RET_2 ;pokracovanie v druhom retazci NENASIEL_ROVNAKE_1: pop bx ;ak na prvy raz nenasiel rovnaky tak zvacsi pop si ;si o jedna a pokracuje v hladani pop cx pop di dec bx ;dec sa pocet prvkov retazca 1 v bx inc si jmp PREJDI_NA_DALSI_1 ;pokracovanie v hladani POKRACUJ_V_RET_2: ;prehladavanie DRUHEHO retazca mov si,offset POMOCNY2+2 mov di,offset PODRETAZEC+2 mov cl,byte ptr [PODRETAZEC+1] ;nacitanie poctov znakov mov bl,byte ptr [POMOCNY2+1] xor ch,ch PREJDI_NA_DALSI_2: push di push cx ;najskor porovna pocty znakov push si push bx cmp cl,bl je POROVNAJD_2 ;ak su rovnake porovna ich pricom berie do uvahy iba cl znakov jnc PODRETAZEC_SA_NENACHADZA_2 POROVNAJD_2: cld rep cmpsb ;porovna retazce jne NENASIEL_ROVNAKE_2 pop bx pop si pop cx ;ak je vsetko OK tak vypise ze ho nasiel pop di mov dx,offset VPODRETAZEC_SA_NACHADZA_2 call VYPIS jmp VMENU ;navrat na menu PODRETAZEC_SA_NENACHADZA_2: pop bx ;ak ma podretazec vacsi pocet znakov pop si ;ako retazec tak vypise ze nenasiel pop cx pop di mov dx,offset VPODRETAZEC_SA_NENACHADZA_2 call VYPIS jmp VMENU NENASIEL_ROVNAKE_2: ;ak pri porovnavani zistil rozdiel tak pop bx ;inkrementuje si a dekrementuje bx v pop si ;ktorom je ulozeny pocet prvkov retazca2 pop cx ;a nasledne skoci na porovnavanie pop di dec bx inc si jmp PREJDI_NA_DALSI_2 koniec: mov ax,4c00h ;ukoncenie programu int 21h VYPIS: ;procedurka pre vypis na obrazovku mov ah,09h int 21h ret code ends ;ukoncenie code seg sseg segment stack 'STACK' ;deklaracia zasobnika dw 20h dup (0) sseg ends end Main ;uplny totalny koniec :-) ;Zhodnotenie programu: ;Dany program funguje podla zadaneho zadania. Tento program je schopny ;pracovat s retazcami dlzky najviac 200 bytov. Pri svojej praci som co ;najviac vyuzil retazcove instrukcie. Pokial viem tak program nevykazuje ;ziadne podstatne chyby. Vypracovany bol v programe Assembler verzia 2.2 ;a odladeny v programe TurboDebugger verzia 2.2.