Esempio 15: Il ciclo while con assembly

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

%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

includeemu8086.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. 

Ultima modifica 3 Aprile 2022

Lascia un commento