Giupoz
30-01-2014, 20:09
Salve ragazzi, oggi vorrei mettere a disposizione di tutti un programma che ho scritto in assembly che permette di acquisire dei valori da inserire in un vettore, sommarli e ordinarli in maniera crescente e decrescente.
Nello studio di assembly ho incontrato varie difficoltà, ho messo qualche commento per aiutare i meno esperti.
.model small
.data ;qui vanno inserite tutte le dichiarazioni
vet db 5 dup (0)
msg1 db "MENU$"
msg2 db "1 - Inserire elementi $"
msg3 db "2 - Cerca elemento $"
msg4 db "3 - Ordinamento crescente $"
msg5 db "4 - Ordinamento decrescente$"
enter db 10,13, "$"
space db " - $"
msg6 db "Inserire elementi:$"
msg7 db "Inserire elemento da carcare: $"
msg8 db "5 - Stampa array$"
msg9 db "6 - Somma elementi array$"
ERRORE db "Nessun elemento trovato$"
FIND1 DB "Elemento trovato in posizione: $"
scelta db ?
value db ?
i db ?
cont db ?
total db ?
cif1 db ?
cif2 db ?
.stack 100h
.code
.startup
mov ax, @data
mov ds, ax
PROC MENU
;********PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*********************************
;**********MENU*******************
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
;stampe del menu
lea dx, msg1 ; MENU
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg2 ;1-Inserire elementi
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg3 ;2-Cerca elemento
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg4 ;3-ordinamento crescente
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg5 ;4-ordinamento decrescente
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg8 ;5 -stampa array
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg9 ;6 -somma elementi array
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
;****ACQUISIZIONE SCELTA******
read: mov ah, 01h
int 21h
mov scelta, al
sub scelta, 30h
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;****COMPARAZIONE SCELtA*******
cmp scelta,6 ;valore non valido
jg read
cmp scelta,1
je call ACQUISIZIONE
cmp scelta,2
je call CERCA
cmp scelta,3
je call CRESCENTE
cmp scelta,4
je call DECRESCENTE
cmp scelta,5
je call STAMPARRAY
cmp scelta,6
je call SOMMA
ENDP MENU
;****ACQUISIZIONE*************
PROC ACQUISIZIONE
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
lea dx, msg6 ;stampa Inserire elemento
mov ah, 9
int 21h
mov cx, 5 ;ciclo che acquisisce 5 valori
mov si, 0
ACQ:
mov ah, 01h
int 21h
mov bl, al
sub bl, 30h
mov vet [si], bl ;inserisce il valore inserito in vet
lea dx, space
mov ah, 9
int 21h
inc si
LOOP ACQ
CALL MENU
ENDP ACQUISIZIONE
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;****CERCA********************
PROC CERCA
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
lea dx, msg7 ;inserire elem da cercare
mov ah, 9
int 21h
lea dx, space
mov ah, 9
int 21h
mov ah, 01h ;acquisire elem da cercare
int 21h
mov value, al ;sposto in "value" il valore
sub value, 30h
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
;*CICLO*
mov cx, 5
mov si, 0
mov i, 0
mov cont, 0 ;per la posizione
CICLO:mov bl, value
cmp bl, vet [si]
je FIND
CONTINUE: inc cont
inc si
loop CICLO
JMP FINE
FIND:
lea dx, enter ;STAMPA STRINGA
mov ah, 9
int 21h
lea dx, find1 ;STAMPA STRINGA
mov ah, 9
int 21h
mov dl, cont ;STAMPA CIFRA
add dl, 30h
mov ah, 02h
int 21h
inc i
JMP CONTINUE
FINE: CMP i, 0
je NIENTE
JNE END
NIENTE:
lea dx, enter
mov ah, 9
int 21h
lea dx, ERRORE
mov ah, 9
int 21h
END:mov ah, 01h
int 21h
CALL MENU
ENDP CERCA
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
PROC CRESCENTE
mov cx, 5 ; pone cx = N
dec cx ; cx = N-1
loopA: mov di, cx ; salva cx in di per LoopB
mov bx, 0 ; azzera registro bx (i = 0)
loopB: mov ah, vet[bx] ; poni in ax il valore in A[i]
cmp ah, vet[bx+1] ; confronta A[i] con A[i+1]
jle c1 ; salta se A[i] >= A[i+1]
xchg ah, vet[bx+1]; fa lo scambio se A[i]<A[i+1]
mov vet[bx],ah
c1: inc bx ; i = i+1
loop loopB ; continua ciclo interno se cx <> 0
mov cx, di ; ripristina cx per ciclo esterno
loop loopA ; continua ciclo esterno se cx <> 0
CALL MENU
ENDP CRESCENTE
;*****************************
PROC DECRESCENTE
mov cx, 5 ; pone cx = N
dec cx ; cx = N-1
loop1: mov di, cx ;salva cx in di per ciclo esterno
mov bx, 0 ;azzera registro bx (i = 0)
loop2: mov ah, vet[bx] ; poni in ax il valore in A[i]
cmp ah, vet[bx+1] ; confronta A[i] con A[i+1]
jge c ;salta se A[i] >= A[i+1]
xchg ah, vet[bx+1] ; fa lo scambio se A[i]<A[i+1]
mov vet[bx],ah
c: inc bx ; i = i+1
loop loop2 ; continua ciclo interno se cx <> 0
mov cx, di ; ripristina cx per ciclo esterno
loop loop1 ; continua ciclo esterno se cx <> 0
CALL MENU
ENDP DECRESCENTE
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
;*********STAMPA**************
PROC STAMPARRAY
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
mov cx, 5
mov si, 0
ciclostampa:
mov dl, vet[si]
add dl, 30h
mov ah, 02h
int 21h
lea dx, space
mov ah, 9
int 21h
inc si
LOOP ciclostampa
mov ah, 01h
int 21h
call menu
ENDP STAMPARRAY
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
PROC SOMMA
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
mov total, 0
mov cx, 5
mov si, 0
addo:
mov ax, 0 ;pulisco registro
mov bx, 0 ;pulisco registro
mov dx, 0 ;pulisco registro
mov bl, vet [si] ;sposto il contenuto del vettore nel registro bl
add total, bl ;aggiungo il contenuto di bl nella variabile "total"
inc si
loop addo
mov ax, 0
mov al, total
cmp al, 9 ;confronto "total" con 9, se e' maggiore dovra' stampare 2 cifre
jg DIVIDI
mov dl, total
add dl, 30h
mov ah, 02h
int 21h
JMP ultim
DIVIDI: ;procedura neccessaria per stampare 2 cifre
mov al, total
mov bl, 10
div bl
mov cif1, al
mov cif2, ah
mov dl, cif1
add dl, 30h
mov ah, 02h
int 21h
mov dl, cif2
add dl, 30h
mov ah, 02h
int 21h
ultim:mov ah, 01h
int 21h
call menu
ENDP SOMMA
mov ah, 4ch
int 21h
Nello studio di assembly ho incontrato varie difficoltà, ho messo qualche commento per aiutare i meno esperti.
.model small
.data ;qui vanno inserite tutte le dichiarazioni
vet db 5 dup (0)
msg1 db "MENU$"
msg2 db "1 - Inserire elementi $"
msg3 db "2 - Cerca elemento $"
msg4 db "3 - Ordinamento crescente $"
msg5 db "4 - Ordinamento decrescente$"
enter db 10,13, "$"
space db " - $"
msg6 db "Inserire elementi:$"
msg7 db "Inserire elemento da carcare: $"
msg8 db "5 - Stampa array$"
msg9 db "6 - Somma elementi array$"
ERRORE db "Nessun elemento trovato$"
FIND1 DB "Elemento trovato in posizione: $"
scelta db ?
value db ?
i db ?
cont db ?
total db ?
cif1 db ?
cif2 db ?
.stack 100h
.code
.startup
mov ax, @data
mov ds, ax
PROC MENU
;********PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*********************************
;**********MENU*******************
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
;stampe del menu
lea dx, msg1 ; MENU
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg2 ;1-Inserire elementi
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg3 ;2-Cerca elemento
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg4 ;3-ordinamento crescente
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg5 ;4-ordinamento decrescente
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg8 ;5 -stampa array
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
lea dx, msg9 ;6 -somma elementi array
mov ah, 9
int 21h
lea dx, enter
mov ah, 9
int 21h
;****ACQUISIZIONE SCELTA******
read: mov ah, 01h
int 21h
mov scelta, al
sub scelta, 30h
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;****COMPARAZIONE SCELtA*******
cmp scelta,6 ;valore non valido
jg read
cmp scelta,1
je call ACQUISIZIONE
cmp scelta,2
je call CERCA
cmp scelta,3
je call CRESCENTE
cmp scelta,4
je call DECRESCENTE
cmp scelta,5
je call STAMPARRAY
cmp scelta,6
je call SOMMA
ENDP MENU
;****ACQUISIZIONE*************
PROC ACQUISIZIONE
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
lea dx, msg6 ;stampa Inserire elemento
mov ah, 9
int 21h
mov cx, 5 ;ciclo che acquisisce 5 valori
mov si, 0
ACQ:
mov ah, 01h
int 21h
mov bl, al
sub bl, 30h
mov vet [si], bl ;inserisce il valore inserito in vet
lea dx, space
mov ah, 9
int 21h
inc si
LOOP ACQ
CALL MENU
ENDP ACQUISIZIONE
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;****CERCA********************
PROC CERCA
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
lea dx, msg7 ;inserire elem da cercare
mov ah, 9
int 21h
lea dx, space
mov ah, 9
int 21h
mov ah, 01h ;acquisire elem da cercare
int 21h
mov value, al ;sposto in "value" il valore
sub value, 30h
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
;*CICLO*
mov cx, 5
mov si, 0
mov i, 0
mov cont, 0 ;per la posizione
CICLO:mov bl, value
cmp bl, vet [si]
je FIND
CONTINUE: inc cont
inc si
loop CICLO
JMP FINE
FIND:
lea dx, enter ;STAMPA STRINGA
mov ah, 9
int 21h
lea dx, find1 ;STAMPA STRINGA
mov ah, 9
int 21h
mov dl, cont ;STAMPA CIFRA
add dl, 30h
mov ah, 02h
int 21h
inc i
JMP CONTINUE
FINE: CMP i, 0
je NIENTE
JNE END
NIENTE:
lea dx, enter
mov ah, 9
int 21h
lea dx, ERRORE
mov ah, 9
int 21h
END:mov ah, 01h
int 21h
CALL MENU
ENDP CERCA
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
PROC CRESCENTE
mov cx, 5 ; pone cx = N
dec cx ; cx = N-1
loopA: mov di, cx ; salva cx in di per LoopB
mov bx, 0 ; azzera registro bx (i = 0)
loopB: mov ah, vet[bx] ; poni in ax il valore in A[i]
cmp ah, vet[bx+1] ; confronta A[i] con A[i+1]
jle c1 ; salta se A[i] >= A[i+1]
xchg ah, vet[bx+1]; fa lo scambio se A[i]<A[i+1]
mov vet[bx],ah
c1: inc bx ; i = i+1
loop loopB ; continua ciclo interno se cx <> 0
mov cx, di ; ripristina cx per ciclo esterno
loop loopA ; continua ciclo esterno se cx <> 0
CALL MENU
ENDP CRESCENTE
;*****************************
PROC DECRESCENTE
mov cx, 5 ; pone cx = N
dec cx ; cx = N-1
loop1: mov di, cx ;salva cx in di per ciclo esterno
mov bx, 0 ;azzera registro bx (i = 0)
loop2: mov ah, vet[bx] ; poni in ax il valore in A[i]
cmp ah, vet[bx+1] ; confronta A[i] con A[i+1]
jge c ;salta se A[i] >= A[i+1]
xchg ah, vet[bx+1] ; fa lo scambio se A[i]<A[i+1]
mov vet[bx],ah
c: inc bx ; i = i+1
loop loop2 ; continua ciclo interno se cx <> 0
mov cx, di ; ripristina cx per ciclo esterno
loop loop1 ; continua ciclo esterno se cx <> 0
CALL MENU
ENDP DECRESCENTE
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
;*********STAMPA**************
PROC STAMPARRAY
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
mov cx, 5
mov si, 0
ciclostampa:
mov dl, vet[si]
add dl, 30h
mov ah, 02h
int 21h
lea dx, space
mov ah, 9
int 21h
inc si
LOOP ciclostampa
mov ah, 01h
int 21h
call menu
ENDP STAMPARRAY
;****PULIZIA******************
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
;*****************************
PROC SOMMA
MOV AH,00h ;pulizia schermo
MOV AL,03h
INT 10h
mov total, 0
mov cx, 5
mov si, 0
addo:
mov ax, 0 ;pulisco registro
mov bx, 0 ;pulisco registro
mov dx, 0 ;pulisco registro
mov bl, vet [si] ;sposto il contenuto del vettore nel registro bl
add total, bl ;aggiungo il contenuto di bl nella variabile "total"
inc si
loop addo
mov ax, 0
mov al, total
cmp al, 9 ;confronto "total" con 9, se e' maggiore dovra' stampare 2 cifre
jg DIVIDI
mov dl, total
add dl, 30h
mov ah, 02h
int 21h
JMP ultim
DIVIDI: ;procedura neccessaria per stampare 2 cifre
mov al, total
mov bl, 10
div bl
mov cif1, al
mov cif2, ah
mov dl, cif1
add dl, 30h
mov ah, 02h
int 21h
mov dl, cif2
add dl, 30h
mov ah, 02h
int 21h
ultim:mov ah, 01h
int 21h
call menu
ENDP SOMMA
mov ah, 4ch
int 21h