Archivi tag: iterazione

Ciclo precondizionato in Assembly: somma dei primi N

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!