Sottoprogrammi in assembly: somma di due numeri

Vediamo un esempio di utilizzo di sottoprogrammi in Assembly.

Per chiamare una procedura dal programma principale si usa l’istruzione: CALL nome_procedura
Dopo la CALL il controllo passa alla procedura chiamata.
La definizione della procedura è sempre in coda al programma principale. L’istruzione RET consente l’uscita dalla procedura e il rientro al programma chiamante (l’esecuzione riprende dalla prima istruzione dopo quella di chiamata della procedura.

Problema
Voglio sviluppare, in linguaggio Assembly x86, un programma che prende in input 2 numeri interi, ne effettua la somma e fornisce in output il valore della somma. Il programma dovrà chiamare una procedura per il calcolo della somma.

Analisi e progetto
Il programma dovrà acquisire il valore di due numeri e passarli, come parametri di input, alla procedura che effettua la somma, la procedura restituisce, come parametro in output, il valore calcolato.
Dati
num1 variabile di tipo intero a 8 bit (contiene il valore del primo numero);
num2 variabile di tipo intero a 8 bit (contiene il valore del secondo numero);
tot variabile di tipo intero a 8 bit (contiene la somma dei 2 numeri).

Algoritmo in pseudocodice

Programma sommaN
 leggi num1;
 leggi num2;
 addizione(num1, num2, tot);
 scrivi tot;
Fine.
procedura addizione(in n1, in n2, out tot);
  tot ← n1 + n2;
Fine.

Codice sorgente

.model small
.stack 100h
.data
  num1 db 50
  num2 db 250
  tot dw ?
.code
inizio:
   mov ax,@data
   mov ds,ax
 
   ; metti qui l'input di num1 e di num2
 
   mov ax,0
   push ax          ; parametro: risultato
   mov al, num2
   push ax          ; parametro: primo num da sommare
   mov al, num1
   push ax          ; parametro: secondo num da sommare
   call addizione   ; chiamata procedura addizione
   pop ax
   pop ax
   pop tot
 
   ; metti qui la stampa del risultato contenuto in tot
 
   mov ah,4Ch
   int 21h
addizione proc     ; definizione della procedura         
   push bp
   mov bp,sp
   par1 equ [bp+4]
   par2 equ [bp+6]
   par3 equ [bp+8]
 
   mov ax,par1
   add ax,par2
   mov par3,ax
 
   pop bp
   ret
addizione endp       ; fine della procedura
 
end inizio           ; fine del programma

Il programma proposto chiama una procedura passando i paramentri attraverso lo stack.

Proposte di lavoro
1. Aggiungi le istruzioni per l’input e l’output dei valori
2. Verifica il funzionamento del programma.
3. Esegui il programma passo passo: compila la tabella di traccia e uno schema dello stack durante l’esecuzione.
4. Modifica il programma in modo che effettui la somma di 3 valori.

Buon lavoro!