;ZADANIE c.4 ;Vytvorte program, ktory: ;a) pomocou direktivy STRUC vytvori tabulku 4x5 (4 riadky a 5 stlpcov) ;b) naplni tabulku hodnotami mocnin tak, ze v prvom riadku sa bude ; nachadzat prvych 5 mocnin cisla 2, v druhom riadku cisla 8, ; v tretom cisla 10 a vo stvrtom cisla 16 ;c) spristupni a vypise lubovolnu polozku tabulky. ;Termin odovzdania: na cviceni do 12. tyzdna semestra ;Hodnotenie: maximalne 4 body ;Autor: Ludovit Fulop ;Kruzok: Info b-9 ;Datum odovzdania: 26.11.1999 ;Skolsky rok: 1999/2000 zas segment stack dw 64 dup (?) zas ends data segment riadok struc r dw 10 dup (?) riadok ends tab riadok 4 dup(<>) info0 db 10,13,'Zadavanie ukonci stlacenim ESC',10,13,'$' info1 db 10,13,'Zadaj riadok hladaneho prvku: $' info2 db 10,13,'Zadaj stlpec hladaneho prvku: $' err1 db 10,13,'Hodnota je mimo rozsah!$' nr db 10,13,'$' row db 0 col db 0 tmp db 0 data ends code segment assume ss:zas,ds:data,cs:code pisznak proc ; procedura pre vypis znaku push ax ; ocakava ascii hodnotu znako v dl mov ah,2 int 21h pop ax ret pisznak endp pisret proc ; procedura pre vypis retazca push ax ; ocakava pripravenost dat v ds:dx mov ah,9 int 21h pop ax ret pisret endp getznak proc ; procedura pre nacitanie znaku z klavesnice mov ah,1 ; nacitany znak je v al int 21h ret getznak endp uloz macro ; makro - vypocet vyssej mocniny a jej ulozenie mul bx mov [ds:di],ax ; ulozenie spodneho slova do tabulky add di,2 ; nastavenie adresy na vyssie slovo mov [ds:di],dx ; a jeho ulozenie add di,2 ; nasledujuci prvok tabulky endm napln proc push seg tab pop ds mov di, offset tab mov ax,1 ; ulozenie mocnin 2 mov bx,2 mov cx,5 nav1: uloz loop nav1 mov ax,1 ; ulozenie mocnin 8 mov bx,8 mov cx,5 nav2: uloz loop nav2 mov ax,1 ; ulozenie mocnin 10 mov bx,10 mov cx,5 nav3: uloz loop nav3 mov ax,1 ; ulozenie mocnin 16 mov bx,16 mov cx,4 nav4: uloz loop nav4 mov ax,dx mul bx mov dx,ax xor ax,ax mov [ds:di],ax add di,2 mov [ds:di],dx add di,6 ret napln endp piscislo proc ; procedura pre vypis 32bit cisla v dx:ax push ax push bx push cx push dx mov tmp,0 mov bx,10000 mov cx,10 opak1: div bx cmp ax,10 jl pis1 push dx xor dx,dx call piscislo pop dx jmp pnav1 pis1: push dx mov dl,al add dl,'0' cmp al,0 jne n0 cmp tmp,1 jne n00 n0: call pisznak mov tmp,1 n00: pop dx pnav1: mov ax,bx push dx xor dx,dx div cx pop dx mov bx,ax mov ax,dx xor dx,dx cmp bx,10 jnl opak1 mov dl,al add dl,'0' call pisznak pop dx pop cx pop bx pop ax ret piscislo endp ukonc macro mov ax,4c00h int 21h endm volba proc push seg info1 ; nacitanie riadku pop ds mov dx,offset info1 call pisret call getznak cmp al,27 jne n2 ukonc n2: cmp al,'1' jl er1 cmp al,'4' jg er1 sub al,'0' mov row,al push seg info2 ; nacitanie stlpca pop ds mov dx,offset info2 call pisret call getznak cmp al,27 jne n4 ukonc n4: cmp al,'1' jl er1 cmp al,'5' jg er1 push seg nr pop ds mov dx,offset nr call pisret sub al,'0' mov col,al mov ah,0 dec al mov bl,4 mul bl mov di,ax xor ax,ax mov al,row dec al mov bl,size r mul bl mov bx,ax mov ax,tab[bx].r+di ; natiahnutie prislusneho prvku do dx:ax add di,2 mov dx,tab[bx].r+di call piscislo jmp kon1 er1: push seg err1 pop ds mov dx,offset err1 call pisret kon1: push seg nr pop ds mov dx,offset nr call pisret ret volba endp start: call napln ; naplnenie tabulky hodnotami push seg info0 pop ds mov dx,offset info0 call pisret rep1: call volba jmp rep1 code ends end start ; System: ; Dany program bol kompilovany v programovom prostredi Turbo Assembler v2.02, ; v systeme MS Dos 5.0. V tomto prostredi nevykazoval ziadne problemy, program ; fungoval spravne. Vzhladom na pouzite zakladne instrukcie procesora rady ; 80x86, by mal program fungovat na lubovolnom PC kompatibilnom systeme. ; Obmedzenia programu: ; Program nema ziadne technicke obmedzenia, jeho funkcia zodpoveda zadaniu. ; Moznosti vylepsenia: ; Ziadne