Esempio 01: le variabili

Un altro semplice esempio in cui dichiariamo una variabile con un valore iniziale per spostarla quindi in un registro dove potremo usarla. In assembly le operazioni devono essere eseguite esclusivamente attraverso i registri!

Prima di tutto, per gestire le variabili, dobbiamo riservarci uno spazio di memoria. In assembly, le variabili altro non sono infatti che ridenominazione di spazi di memoria raggiungibili col proprio nome o l’indirizzo. Questo è facilmente fattibile all’interno della sezione .data dove vengono dichiarate le variabili inizializzate e per le quali è necessario specificare quanto spazio occupano ma non il tipo:

db -> 8 bit (1 byte)

dw-> 16 bit (1 word)

dd->  32 bit (1 doubleword se supportato dall’architettura)

dq-> 64 bit (1 quadword, ovvero 2 doubleword se supportato dall’architettura)

Nel seguente  codice un esempio di utilizzo e dichiarazione.

; esempio 01
; scrive un valore in memoria 5
; lo trasferisce in DX

.MODEL small
.STACK 256
.DATA
    VARIABILE DW ?

; le variabili sono dichiarate con
; NOMEVAR DIMESINONEVAR VALOREINIZIALE    
; NOMEVAR è a scelta
; DIMENSIONEVAR può essere DB o DW B->Byte->8 bit  W->Word->2Byte->16 bit
; VALOREINIZIALE può essere un numero decimale es. 29
;         o esadecimale es. 2Bh o 0Ah
;         o binario es. 11101010b       

.CODE
.STARTUP

MOV VARIABILE, 5D
MOV DX, VARIABILE

.EXIT
END

;

Lo stesso esercizio in SASM, ragionando a 32bit. Qui per motivi tecnologici e di sintassi, non possiamo definire una variabile ? ma dobbiamo assegnare un valore iniziale, zero ad esempio.

L’esercizio è arrichito dai comandi per prendere in ingresso una valore e stampare il risultato nelle apposite finestrelle previste dall’IDE.

 %include “io.inc”

; ris= x+2y-3z con x,y,z assegnati
 

section .data

x dd 0
y dd 11110000b
z dd 0Ah
 

; ris = 126 + 2(11110000b) – 3(0Ah)
ris dd 0

section .text
global CMAIN

CMAIN:

mov ebp, esp ; for correct debugging
;write your code here
 
GET_DEC 4, x

mov edx, [x]
add edx, [y]
add edx, [y]

sub edx, [z]
sub edx, [z]
sub edx, [z]
 
mov [ris], edx
PRINT_DEC 4, ris

xor eax, eax
ret

Ultima modifica 1 Giugno 2022