Vediamo un esempio di utilizzo di ciclo precondizionato in Assembly.
Non disponiamo di una struttura pronta come accade nei linguaggi ad alto livello quindi dovremmo implementare il ciclo utilizzando opportunamente le istruzioni di salto.
Problema
Voglio sviluppare, in linguaggio Assembly x86, un programma che effettui la somma dei primi N numeri interi con N acquisito in input.
Analisi e progetto
Il programma dovrà acquisire il valore di N in input e sommare tutti i numeri da 1 a N. Esempio: se venisse fornito in input il valore 5 il programma dovrebbe fornire il valore 1+2+3+4+5 ovvero 15 ovvero la somma dei primi 5 numeri interi.
Dati
n variabile di tipo intero a 8 bit (contiene il valore di N);
somma variabile di tipo intero a 8 bit (contiene la somma dei numeri);
conta variabile di tipo intero a 8 bit (contiene il valore da sommare, varia da 1 a N).
Algoritmo in pseudocodice
Programma sommaN leggi n; somma <-- 0; conta <-- 0; Mentre conta < n esegui conta <-- conta + 1; somma <-- somma + conta; FineMentre Fine.
Codice sorgente
.model small .stack 100h .data n db ? somma db 0h .code inizio: mov ax,@data mov ds,ax mov ah,01h ; input di n int 21h sub al,30h mov n,al mov cl,00h ; uso cl come contatore (da 0 a n) iniziociclo: cmp cl,n jnb finementre inc cl add somma,cl jmp iniziociclo finementre: mov ah,4Ch int 21h end inizio |
Il programma proposto utilizza un ciclo a controllo in testa (precondizionato) e un contatore crescente (da 1 a N).
Proposte di lavoro
1. Verifica il funzionamento del programma.
2. Sviluppa un programma per lo stesso problema che utilizzi un contatore decrescente.
3. Sviluppa un programma per lo stesso problema che utilizzi un ciclo a controllo in coda.
4. Modifica il programma in modo che fornisca in output il valore calcolato della somma.
Eventuali domande nei commenti. Buon lavoro!