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