Lunedì, 03 Febbraio 2020 09:58

Esempio 15: Il ciclo while con assembly

Scritto da

Abbiamo visto come il costrutto if/else si traduca in assembly con una serie di salti al punto corretto di codice da eseguire in base alla condizione valutata. Il ciclo in realtà è molto simile come approccio, tanto che non esiste una parola while vera e propria ma un if else che risalta su se stesso! Vediamo un esempio.

Partiamo da un frammento di codice C++ più intuitivo per lo studente.

//fai un ciclo while che conta fino a 5
int =0;
while(i<5)
{
 i++;
 cout << i <<endl;
}

 cout <<"finito!"

Il ciclo è molto semplice e non molto utile: si limita a fare la stampa dei numeri 1,2,3,4,5 in pratica e della scritta "finito". Il codice assembly è più semplice di quello che potete immaginare. Ne vediamo un esempio con SASM.

 

%include "io.inc"

section .text

global CMAIN

CMAIN:

mov edx, 0

 

ciclowhile:

inc edx

PRINT_DEC 4, edx 

 

cmp edx, 5

jl ciclowhile 

 

PRINT_STRING "Finito!"

xor eax, eax

ret

 

La versione con EMU8086 è del tutto analoga, usando le funzioni che semplificano le operazioni di stampa, ed è la seguente

include 'emu8086.inc'
.MODEL SMALL

.STACK
.DATA

.CODE
.STARTUP

mov ax, 0

ciclowhile:
inc ax
call PRINT_NUM
PRINTN ''

cmp ax,5
jl ciclowhile

PRINTN 'Finito!'


;mi dichiaro delle funzioni
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS

.EXIT
END

In questo caso abbiamo usato come contatore il registro AX, che "sbianchiamo" a zero, tenendo presente che il suo contenuto viene anche stampato in automatico come parametro di default della funzione PRINT_NUM che invochiamo con la annessa andata a capo PRINTN ''. Le condizioni di salto e comparazione sono equivalenti. 

Letto 107 volte
Prof. Alfredo Centinaro

Docente di "Scienze e tecnologie informatiche", "Tecnologie e progettazione di sistemi informatici", "Sistemi e Reti" presso IIS Alessandrini-Marino (Teramo), consulente e sviluppatore web. Ha collaborato per anni come sviluppatore presso MHT - Treviso, assistente Sistemi ed elaborazione dell'informazione in UniTE Corso di laurea in Scienze del turismo culturale, tutor presso Telecom Italia Learning Services (L'Aquila)

Joomla SEF URLs by Artio