Conversione di una stringa di numeri nel valore numerico corrispondente

;Conversione di una stringa di numeri nel valore numerico corrispondente
;La stringa “12345” viene convertita nel valore numerico 12345
;(valore hex 3039, memorizzato in BX)
;Procedimento:
;le singole cifre di myNumber vengono memorizzate in AL (lodsb)
;conversione della cifra da carattere a numero: sottrazione di ’30’
;il valore numerico viene moltiplicato per 10: shift del numero verso destra
;si somma al valore cosi’ ottenuto la cifra successiva e cosi’ via.
;si utilizza lo stack come memoria di transito
;il risultato si viene formando, passo passo, in BX
;’1′ in AL (valore ASCII ’31’)
;viene sottratto ’30’ per avere il valore numerico 1
;AX copiato nello STACK
;in AX valore di BX (inizialmente 0000)
;moltiplica AX * 10 risultato in AX e trasferito in BX
;STACK -> AX e somma a BX; risultato in BX (1)
;in AL il valore 32
;sottrae ’30’ quindi in AL troviamo 2
;trasferisce 2 nello stack
;in BX copiato in AX quindi in AX troviamo 1
;moltiplica AX * 10 quindi in AX troviamo 10, lo trasferisce in BX (10)
;STACK -> AX e somma a BX risultato in BX (12)
;e cosi’ via fino a prendere tutte le cifre
;in BX alla fine si trova il valore 12345 scritto in HEX (3039)

data segment
myNumber db “12345”,0
pkey db “press any key…$”
ends

stack segment
db 128 dup(?) ;128 byte non inizializzati (?)
top db ? ;1 byte non inizializzato
ends

code segment
assume cs:code,ds:data,ss:stack
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

mov ax, stack ;in ax indirizzo dello stack segment
mov ss, ax ;copia valore di AX in SS
lea sp,top ;indiirizzo di top in SP

xor bx,bx ;esclusive-or di bx: metodo per azzerare un registro;
;nell’or esclusivo il risultato e’ 0 se i 2 bit sono uguali
;pertanto nel caso ci sia 1 si 1 xor 1 –> 0
mov si,offset myNumber ;indirizzo (di offset) di mynumber in si

loopme:
lodsb ;trasferisce in AL il dato puntato da SI
;(indirizzo del I byte di myNumber)
;e incrementa SI

;controllo che la cifra sia compresa tra ‘0’ e ‘9’
cmp al, ‘0’ ;confronto tramite sottrazione tra al e 0
jb noascii ;Salta a noascii se Minore
cmp al, ‘9’ ;confronto al e 9 con sottrazione
ja noascii ;Salta a noascii se Maggiore

sub al, 30h ;sottazione di 30h risultato in al
cbw ;converte un Byte in una Word: azzera la parte alta di AX: 00 in AH

push ax ;inserisce AX in cima allo stack
mov ax, bx ;copio valore di BX in AX
mov cx, 10 ;copio 10 in CX
mul cx ;moltiplico CX con AX (risultato in DX + AX)
mov bx, ax ;copio valore di AX in BX
pop ax ;prelevo dalla cima dello stack in AX
add bx, ax ;addizione tra AX e BX risultato in BX
jmp loopme ;salto incondizionato alla etichetta loopme

noascii:
;——– operazioni di chiusura
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key….
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start

Lascia un commento