Ecco a voi la soluzione dell'esercizio presentato all'esame. Spero sia utile a qualcuno...:
Laboratorio di architettura degli elaboratori (corso A) 11-09-2008
Traccia
Scrivere un programma assembly che ordini in maniera crescente un vettore di 6 numeri interi (da 0 a 99) e lo stampi a video.
Fare uso delle seguenti subroutine da definire:
inserimento ordinamento stampa
COPY&PASTE-----------------------------------
include 'emu8086.inc' ; Inclusione della libreria standard dell'emulatore
data segment vet db 6 dup (0) ; Dichiaro un vettorei di 6 elementi inizializzati a 0 elementi dw 6 ; Numero di elementi del vettore inizializzato al valore 6 ends
stack segment dw 128 dup(0) ends
code segment start: ; set segment registers: mov ax, data mov ds, ax mov es, ax call Inserimento ; Ciclo di inserimento dei 6 valori call CLEAR_SCREEN ; Pulizia dello schermo call Ordinamento ; Il vettore viene ordinato... call Stampa ; ...e stampato mov ax, 4c00h ; exit to operating system. int 21h ends Proc Inserimento lea bx,vet ; Indirizzo effettivo del vettore in bx(base) mov si,0 ; indice del vettore ciclo_inserisci: call SCAN_NUM ; acquisisci numero e memorizza in CX mov [bx+si],cl ; parte bassa di CX nella locazione puntata da bx+si (base+offset) mov ah,0Eh mov al,10d int 10h mov al,13d int 10h ; Vai a capo stampando i caratteri ASCII 10 e 13 inc si ; incrementa l'offset e quindi l'indice del vettore cmp si,elementi ; acquisito tutto il vettore? jl ciclo_inserisci ; no: acquisisci di nuovo; si: termina procedura ret endp
Proc Ordinamento ; Algoritmo Ordinamento Bubble Sort lea bx,vet ; Indirizzo effettivo del vettore in bx(base) mov di,elementi sub di,2 ; in DI elementi_del_vettore-2=range di confronti ciclo_esterno: mov si,0 ; indice a 0 ciclo_interno: mov al,[bx+si] ; in AL elemento del vettore puntato da (base+offset) mov ah, [bx+si+1] ; in AH elemento successivo del vettore cmp al,ah jle continua ; se AL>AH allora scambia elementi altrimenti continua mov [bx+si+1],al mov [bx+si],ah continua: inc si ; incrementa l'offset e quindi l'indice del vettore cmp si,di ; confrontati tutti gli elementi? jle ciclo_interno ; no: continua a confrontare dec di ; si: decrementa DI (range di confronti) cmp di,0 ; se DI=0 sono stati effettuati tutti i confronti jge ciclo_esterno ; altrimenti continua a confrontare ret endp
Proc Stampa lea bx,vet ; Indirizzo effettivo del vettore in bx(base) mov si,0 ; indice del vettore ciclo_stampa: mov ah,0 mov al,[bx+si] call PRINT_NUM ; stampa numero contenuto in AX mov ah,0Eh mov al,10d int 10h mov al,13d int 10h ; Vai a capo stampando i caratteri ASCII 10 e 13 inc si ; incrementa l'offset e quindi l'indice del vettore cmp si,elementi; stampato tutto il vettore? jl ciclo_stampa ; no: stampa ancora; si: termina procedura ret endp
DEFINE_SCAN_NUM ; Macro per l'acquisizione di un numero da tastiera DEFINE_PRINT_NUM ; Macro per la stampa di un numero DEFINE_PRINT_NUM_UNS ; Macro per la stampa di un numero unsigned (richiesto) DEFINE_CLEAR_SCREEN ; Macro per la pulizia dello schermo
end start ; set entry point and stop the assembler.
COPY&PASTE-----------------
|