Logo ITP-NEWS
RSS | Contatti | Login|Registrati| Home
giornali
Conversione di un numero da stringa ad intero e viceversa
Di Fusco Francesco::2016-02-13


;Conversione di un numero da stringa ad intero e viceversa
;Versione 1
;Assemblare con nasm -f elf converti_stampa_numero.asm
;Linkare con ld -m elf_i386 -s -o converti_stampa_numero converti_stampa_numero.o
;seguire con ./converti_stampa_numero

%define STDIN 0
%define STDOUT 1
%define SYS_READ 3
%define SYS_WRITE 4
%define NEWLINE 10
%define base 10
%define STRING_TERMINATOR 0

;Sezione text
;Inizio del programma
section .text
global _start ;deve esser dichiarato per il linker (ld)
_start: ; informa il linker sul punto di ingresso al programma
;--------------------------------------------------------------------------------------
;Input dei dati
;--------------------------------------------------------------------------------------
;Messaggio di prompt per la lettura del numero
mov eax,SYS_WRITE ;numero di chiamata di sistema (sys_write)
mov ebx,STDOUT ;descrittore di file (stdout)
mov ecx,prompt1 ;Messaggio Lettura numero
mov edx,lenprompt1 ;lunghezza del messaggio
int 0x80 ;chiamata di sistema (kernel)
;--------------------------------------------------------------------------------------
;Lettura del numero
;--------------------------------------------------------------------------------------
mov eax,SYS_READ ;numero di chiamata di sistema (sys_read)
mov ebx,STDIN ;descrittore di file (stdin)
mov ecx,anumero
mov edx,len_numero
int 0x80 ;chiamata di sistema (kernel)
;--------------------------------------------------------------------------------------
;Converti stringa in numero
;--------------------------------------------------------------------------------------
mov esi,anumero ; copia nel registro esi l'indirizzo della stringa contenente il numero
mov ecx,eax ; copia in ecx la lunghezza della stringa contenente il numero
dec ecx ;non conteggia il carattere di invio
xor ebx,ebx ; azzera il contenuto di ebx
ripeti:
movzx eax,byte[esi] ; MOVZX sposta un valore unsigned (senza segno) in un registro più grande e lo estende con zero.
sub al,'0' ; Converte il codice ascii del numero nella cifra corrispondente
imul ebx,10 ; ebx=ebx*10 --> Moltiplica ebx per 10
add ebx,eax ; Calcola il valore numerico ebx=ebx*10+eax
inc esi
loop ripeti
;--------------------------------------------------------------------------------------
;Converti numero in stringa
;--------------------------------------------------------------------------------------
mov eax,ebx ; EAX = valore intero da convertire
mov esi,inumero ; ESI = puntatore al buffer per memorizzare la stringa (deve avere spazio per almeno 10 byte)
add esi,9
mov byte [esi],STRING_TERMINATOR
mov ebx,10
.next_digit:
xor edx,edx ; Azzera edx prima di dividere edx:eax per ebx
div ebx ; eax /= 10
add dl,'0' ; Converte il resto in ASCII
dec esi ; memorizza i caratteri in ordine inverso
mov [esi],dl
test eax,eax
jnz .next_digit ; Ripeti finché eax==0
;--------------------------------------------------------------------------------------
; Output:
;--------------------------------------------------------------------------------------
mov ecx,esi ; ECX = puntatore al primo carattere della stringa generata
mov eax,SYS_WRITE ; numero di chiamata di sistema (sys_write)
mov ebx,STDOUT ; descrittore di file (stdout)
mov edx,10 ; lunghezza della stringa
int 0x80 ; chiamata di sistema (kernel)
;--------------------------------------------------------------------------------------
;termina il programma
;--------------------------------------------------------------------------------------
mov eax,1 ;numero chiamata di sistema (sys_exit)
mov ebx, 0 ;codice di ritorno
int 0x80 ;chiamata di sistema (kernel)

;Sezione data
section .data
prompt1 db 'Inserisci il numero:'
lenprompt1 equ $-prompt1

;Sezione bss (Block Started by Symbol)
section .bss
anumero resb 25 ;numero da leggere
inumero resb 25 ;numero convertito in stringa
len_numero equ 25
intnumero equ 0 ;numero trasformato in intero
numero equ 0
valore equ 0