|
.MODEL TINY
.CODE
JUMPS
LOCALS
NULL EQU 0
CR EQU 13
LF EQU 10
UP EQU 'H'
DOWN EQU 'P'
ESCAPE EQU 1bh
INVIO EQU 13
ROSSO EQU 0C0h
VERDE EQU 0A0H
BLU EQU 90H
NERO EQU 0fh
BIANCO_NERO EQU 0fh
PASSACOLORE MACRO opzione
LOCAL SELEZIONE0
LOCAL VAI0
cmp INDICE, opzione
je SELEZIONE0
push BIANCO_NERO
jmp VAI0
SELEZIONE0: push ROSSO
VAI0:
ENDM
ORG 100h
INIZIO: jmp MAIN
;area dati0
TITOLO DB "Menu' di Nicola Sagliano:",NULL
OPZ1 DB "opzione1",NULL
OPZ2 DB "opzione2",NULL
OPZ3 DB "STAMPARRAYMMM",NULL
OPZ4 DB "opzione3",NULL
USCITA DB "(premere Esc per terminare)",NULL
STRINGAOP1 DB "BLU",NULL
STRINGAOP2 DB "ROSSO",NULL
STRINGAOP3 DB "STAMPARRAYMMM",NULL
STRINGAOP4 DB "VERDE",NULL
STRINGAINOPZ DB "Premere un tasto per tornare al menu'...",NULL
STRINGAARRAY DB "Array: ",NULL
STRINGAMAX DB "Max: ",NULL
STRINGAMIN DB "Min: ",NULL
STRINGAMEDIA DB "Media: ",NULL
ARRAY DB 4,3,102,250,3
INDICE DB 0
; Pulisce schermo
; ...........................................................
; abstract: funzione per pulire lo schermo, con un qualunque colore (semiregistro bh)
;
; In: nessun passaggio di parametri, colore impostato nel semiregistro bh
;
; Dep: nulla
; ...........................................................
CLRSCR PROC
push ax
push bx
push cx
push dx
mov bl,0
mov al,0
mov cx,0
mov dh,24
mov dl,79
mov ah,6
int 10h
pop dx
pop cx
pop bx
pop ax
ret
ENDP
; Stampa colorata in una posizione x,y
; ...........................................................
; abstract: la funzione stampa una stringa colorata (colore in bh) ad una posizione x,y (dl = x, dh = y)
;
; In: passaggio del colore (semiregristro bh)
;
; Dep: dipende da GOTOXY
; ...........................................................
STAMPACOL PROC
push bp
mov bp, sp
STAMPA:
push ax
push dx
push cx
call GOTOXY
CICLOSTAMPA:
mov dl,[bx]
push bx
cmp dl,NULL
je CORDINIZIO
mov bh,0
mov bl,byte ptr[bp+4]
mov cx,1
mov ah,9
int 10h
mov ah,2
int 21h
pop bx
inc bx
jmp CICLOSTAMPA
CORDINIZIO:
pop ax
pop cx
pop bx
pop dx
pop bp
ret
ENDP
; GOTOXY
; ...........................................................
; abstract: sposta il cursore ad una cordinata x, y
;
; In: nessun parametro in ingresso, posizione x nel semiregistro dl e posizione y nel semiregistro dh
;
; Dep: nulla
; ...........................................................
GOTOXY PROC
push ax
push bx
mov bh,0
mov ah,2
int 10h
pop bx
pop ax
ret
ENDP
; STAMPAOPZIONI
; ...........................................................
; abstract: stampa le 4 opzioni del menų colorando la selezionata
;
; In: nessun parametro
;
; Dep: dipende dalla macro passacolore e dalla funzione stampacol
; ...........................................................
STAMPAOPZIONI PROC
mov dl, 0
mov dh, 4
lea bx, OPZ1
PASSACOLORE 0
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 5
lea bx, OPZ2
PASSACOLORE 1
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 6
lea bx, OPZ3
PASSACOLORE 2
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 7
lea bx, OPZ4
PASSACOLORE 3
call STAMPACOL
add sp,2
ret
ENDP
; (nome funzione)
; ...........................................................
; abstract: stampa i codici ascii dei numeri in memoria altrimenti visualizzati come codici ascii (itoa)
;
; In: primo parametro la base in cui stampare(divisore) secondo il numero da stampare
;
; Dep: nessuna
; ...........................................................
STAMPANUM PROC
push bp
mov bp, sp
push AX
push BX
push CX
push DX
mov ax, [bp+4] ; il numero da stampare
mov bl, [bp+6] ; il divisore
mov cx,0 ; conterā il numero di divisioni, cioč il numero di cifre binarie
ANCORA:
div bl ; divisione per il parametro, in AH il resto, in AL il risultato
push ax ; salvataggio del resto e del risultato sullo stack
inc cx ; conteggio del numero delle cifre binarie
mov ah,0 ; annullamento del resto, rimarrā solo il risultato per la prossima divisione
cmp al,0 ; il risultato č zero?
jne ANCORA ; se no, si continua la divisione per due
STAMPA1:
pop dx ; si preleva dallo stack il valore, tra cui il resto della divisione per due
mov dl,dh ; si mette il resto in DL per la stampa a schermo
cmp dl,9
jg ESA
add dl,'0' ; si aggiunge il codice Ascii dello zero per ottenere il codice Ascii del numero (0 o 1) corrispondente
jmp RESTO
ESA: add dl, 55
RESTO:
mov ah,2
int 21h ; stampa a schermo della cifra binaria
loop STAMPA1 ; ancora cifre da stampare?
pop DX
pop CX
pop BX
pop AX
pop bp
ret
ENDP
; STAMPAMAX
; ...........................................................
; abstract: stampa il numero maggiore in un array
;
; In: primo parametro n. elementi, secondo parametro indirizzo dell'array
;
; Dep: dipende da STAMPANUM
; ...........................................................
STAMPAMAX PROC
PIndirizzo EQU word ptr [BP+6]
PNumElementi EQU word ptr [BP+4]
Max EQU [BP-2]
push bp
mov bp, sp
mov cx, PNumElementi ; il primo parametro (n. elementi)
mov bx, PIndirizzo ; il secondo parametro (indirizzo dell'array)
sub sp,2 ; Max: allocazione della variabile locale. Conterra' il massimo
mov word ptr Max,0 ; scrittura della variabile locale. La azzero
@@CICLO:
mov dx,0
mov dl,[bx] ; suppongo che in bx ci sia l'indirizzo dell'array
cmp dx, Max
jg @@AGGIORNAMAX
jmp @@PROSSIMO
@@AGGIORNAMAX:
mov word ptr Max, dx
@@PROSSIMO:
inc bx
loop @@CICLO
; Ora in di c'e' il massimo. Lo stampo
push 10
push Max
call STAMPANUM
add sp, 4
mov sp,bp ; deallocazione della variabile locale
pop bp
ret
ENDP
; STAMPAMIN
; ...........................................................
; abstract: stampa il numero minore in un array
;
; In: primo parametro n. elementi, secondo parametro indirizzo dell'array
;
; Dep: dipende da STAMPANUM
; ...........................................................
STAMPAMIN PROC
PIndirizzo EQU word ptr [BP+6]
PNumElementi EQU word ptr [BP+4]
Min EQU [BP-2]
push bp
mov bp, sp
mov cx, PNumElementi ; il primo parametro (n. elementi)
mov bx, PIndirizzo ; il secondo parametro (indirizzo dell'array)
sub sp,2 ; Min: allocazione della variabile locale.
mov word ptr Min,255 ; scrittura della variabile locale. La azzero
@@CICLO:
mov dx,0
mov dl,[bx] ; suppongo che in bx ci sia l'indirizzo dell'array
cmp dx, Min
jl @@AGGIORNAMIN
jmp @@PROSSIMO
@@AGGIORNAMIN:
mov word ptr Min, dx
@@PROSSIMO:
inc bx
loop @@CICLO
; Ora in di c'e' il minimo. Lo stampo
push 10
push Min
call STAMPANUM
add sp, 4
mov sp,bp ; deallocazione della variabile locale
pop bp
ret
ENDP
; STAMPAMAX
; ...........................................................
; abstract: stampa la media in un array
;
; In: primo parametro n. elementi, secondo parametro indirizzo dell'array
;
; Dep: dipende da STAMPANUM
; ...........................................................
STAMPAMEDIA PROC
PIndirizzo EQU word ptr [BP+6]
PNumElementi EQU word ptr [BP+4]
Media EQU [BP-2]
push bp
mov bp, sp
mov cx, PNumElementi ; il primo parametro (n. elementi)
mov bx, PIndirizzo ; il secondo parametro (indirizzo dell'array)
mov di,PNumElementi
sub sp,2 ; Media: allocazione della variabile locale.
mov word ptr Media,0 ; scrittura della variabile locale. La azzero
@@CICLO:
mov dx,0
mov dl,[bx] ; suppongo che in bx ci sia l'indirizzo dell'array
cmp dx, Media
add word ptr Media, dx
inc bx
loop @@CICLO
mov dx,0
mov ax, word ptr Media
mov cx,5
div cx
mov word ptr Media,ax
push 10
push Media
call STAMPANUM
add sp, 4
mov sp,bp ; deallocazione della variabile locale
pop bp
ret
ENDP
; area codice
MAIN:
mov bh,BIANCO_NERO
call CLRSCR
mov dl, 20
mov dh, 2
push NERO
lea bx, TITOLO
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 10
push NERO
lea bx, USCITA
call STAMPACOL
add sp,2
OPZIONI:
call STAMPAOPZIONI
mov dl, 0
mov dh, 40
call GOTOXY
INPUT:
mov ah,7
int 21h
cmp al,ESCAPE
je FINE
cmp al,INVIO
je ESEGUIOPZIONE
cmp al,0
je TASTOSPEC
jmp INPUT
TASTOSPEC:
mov ah,7
int 21h
cmp al, DOWN
je FRECCIAGIU
cmp al, UP
je FRECCIASU
jmp INPUT
FRECCIAGIU:
inc INDICE
cmp INDICE, 4
je SELEZIONEINIZIO
jmp OPZIONI
SELEZIONEINIZIO:
mov INDICE, 0
jmp OPZIONI
FRECCIASU:
dec INDICE
cmp INDICE, 255
je SELEZIONEFINE
jmp OPZIONI
SELEZIONEFINE:
mov INDICE, 3
jmp OPZIONI
ESEGUIOPZIONE:
cmp INDICE, 0
je ESEGUIOPZIONE1
cmp INDICE, 1
je ESEGUIOPZIONE2
cmp INDICE, 2
je ESEGUIOPZIONE3
cmp INDICE, 3
je ESEGUIOPZIONE4
ESEGUIOPZIONE1:
mov bh, BLU
call CLRSCR
mov dl, 35
mov dh, 2
push BLU
lea bx, STRINGAOP1
call STAMPACOL
add sp,2
mov dl, 20
mov dh, 3
push BLU
lea bx,STRINGAINOPZ
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 40
call GOTOXY
mov ah,1
int 21h
jmp MAIN
ESEGUIOPZIONE2:
mov bh, ROSSO
call CLRSCR
mov dl, 35
mov dh, 2
push ROSSO
lea bx, STRINGAOP2
call STAMPACOL
add sp,2
mov dl, 20
mov dh, 3
push ROSSO
lea bx,STRINGAINOPZ
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 40
call GOTOXY
mov ah,1
int 21h
jmp MAIN
ESEGUIOPZIONE3:
mov bh, BIANCO_NERO
call CLRSCR
mov dl, 35
mov dh, 2
push BIANCO_NERO
lea bx, STRINGAOP3
call STAMPACOL
add sp,2
mov dl,0
mov dh,4
call GOTOXY
push BIANCO_NERO
lea bx,STRINGAARRAY
call STAMPACOL
add sp,2
lea bx,ARRAY
mov cx,5
NUM:
mov ah,0
mov al,[bx]
push 10
push AX
call STAMPANUM
add sp,4
mov dl,' '
mov ah,2
int 21h
inc bx
loop NUM
mov dl, 0
mov dh, 6
call GOTOXY
push BIANCO_NERO
lea bx,STRINGAMAX
call STAMPACOL
add sp,2
lea bx,ARRAY
push bx
push 5
call STAMPAMAX
add sp, 4
mov dl, 0
mov dh, 8
call GOTOXY
push BIANCO_NERO
lea bx,STRINGAMIN
call STAMPACOL
add sp,2
lea bx,ARRAY
push bx
push 5
call STAMPAMIN
add sp, 4
mov dl, 0
mov dh, 10
call GOTOXY
push BIANCO_NERO
lea bx,STRINGAMEDIA
call STAMPACOL
add sp,2
lea bx,ARRAY
push bx
push 5
call STAMPAMEDIA
add sp, 4
mov dl, 0
mov dh, 12
push BIANCO_NERO
lea bx,STRINGAINOPZ
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 40
call GOTOXY
mov ah,1
int 21h
jmp MAIN
ESEGUIOPZIONE4:
mov bh, VERDE
call CLRSCR
mov dl, 35
mov dh, 2
push VERDE
lea bx, STRINGAOP4
call STAMPACOL
add sp,2
mov dl, 20
mov dh, 3
push VERDE
lea bx,STRINGAINOPZ
call STAMPACOL
add sp,2
mov dl, 0
mov dh, 40
call GOTOXY
mov ah,1
int 21h
jmp MAIN
FINE:
int 20h
end INIZIO
|
|