PDA

View Full Version : [assembly 8086] Programma ordinamento e somma


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

Daniels118
31-01-2014, 08:44
Io ho scritto un motore grafico 3D wireframe in assembly x86 se ti può interessare... ha qualche baco che non ho mai avuto tempo di risolvere, se vuoi divertirti a correggerlo te lo mando :)