; Assemblatore NASM 2.07
;
; convert a decimal ASCII string in a 16-bit unsigned int
; the string is read from std input
;
global _start
section .data
buffer resb 32
string resb 32
msg db 'the char pointed to by ESI is: '
number db '0000'
db 0ah,0
section .text
_start:
mov ecx,buffer
mov edx,32
call read
mov al,0ah
mov edx,buffer
call strlen ; ECX=string lenght
mov byte [buffer+ecx],0 ; make ASCIIZ
mov edx,buffer
call str2uint16 ; AX=binary number
mov edx,string
call bin2dec16 ; EXC=length
mov byte [edx+ecx],0ah
mov byte [edx+ecx+1],0
call printasciiz
; now print the char pointed to by ESI (in hex)
mov al,[esi]
xor ah,ah
mov edx,number
call bin2hex16
mov edx,msg
call printasciiz
exit:
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
; FUNCTION: str2uint16 (V0.2)
; converte una stringa ASCIIZ decimale in un numero intero
; a 16 bit senza segno
;
; Parametri:
; EDX = indirizzo del buffer ASCII
; Return:
; AX = numero binario 16 bit senza segno
; ESI = puntatore al primo char non valido (oppure al NULL)
;
section .data
pow10_16 dw 1,10,100,1000,10000
section .text
str2uint16:
push ebx
push ecx
push edx
push edi
mov esi,edx
mov ecx,0 ; contatore digits sullo stack
.loop1:
xor ah,ah
mov al,[esi] ; carica la cifra decimale
cmp al,0
je .end
cmp al,'0'
jb .notvalid
cmp al,'9'
ja .notvalid
sub al,30h
inc esi
push ax
inc ecx
cmp ecx,5
jbe .loop1
.overflow:
pop ax
dec ecx ; converte solo le prime 5 cifre
.notvalid:
.end:
mov di,0 ; totalizzatore
mov ebx,pow10_16
cmp ecx,0
je .exit
.loop2:
pop ax
mov dx,[ebx] ; carica potenza del 10
mul dx ; mult cifra per potenza del 10 dx:ax
add di,ax
inc ebx
inc ebx
loop .loop2
.exit:
mov ax,di
pop edi
pop edx
pop ecx
pop ebx
ret
; FUNCTION: bin2dec16
; converte un numero binario a 16 bit in una stringa ASCII decimale
; Parametri:
; AX = numero da stampare
; EDX = indirizzo del buffer ASCII (5 cifre)
; Return:
; ECX = lunghezza della strinag
bin2dec16:
push eax
push ebx
push edx
push esi
mov esi,edx
mov ecx,0 ; contatore cifre significative
mov bx,10 ; divisore
.loop1:
xor dx,dx ; DX:AX = dividendo
div bx ; ax=quoziente, dx=resto
add dl,30h
push dx ; salva il digit sullo stack
inc ecx ; incrementa contatore cifre
cmp ax,0
jne .loop1
mov eax,ecx ; salva numero digits
.loop2: ;recupera i digit dallo stack in ordine inverso (almeno 1)
pop dx
mov [esi],dl
inc esi
loop .loop2
mov ecx,eax ; return ECX
pop esi
pop edx
pop ebx
pop eax
ret
; FUNCTION: bin2hex16
; converte il numero a 16 bit in AX in 4 cifre hex
; Parametri:
; AX = numero binario
; EDX = buffer di 4 cifre hex (es: XXXX)
; Return:
; none
bin2hex16:
push eax
push ebx
push ecx
push edx
push edi
mov edi,edx ; usa edi per indirizzare il buffer
add edi,3
mov cx,4
.loop1:
xor dx,dx ; DX:AX = dividendo
mov bx,16 ; divisore
div bx ; AX=quoziente, DX=resto
add dl,30h
cmp dl,'9'
jbe .digit
add dl,7
.digit:
mov [edi],dl
dec edi
loop .loop1
pop edi
pop edx
pop ecx
pop ebx
pop eax
ret
; FUNCTION: printasciiz
; stampa la stringa ASCIIZ in ingresso. La stringa è terminata da un NULL byte
; Parametri:
; EDX = indirizzo della stringa ASCIIZ
; Return:
; none
;
printasciiz:
push eax
push ecx
push edx
mov al,0
call strlen ; ecx=length
mov eax,ecx ; scambia ecx ed edx
mov ecx,edx ; indirizzo buffer in ecx
mov edx,eax ; length in edx
call write
pop edx
pop ecx
pop eax
ret
; FUNCTION: strlen
; calcola la lunghezza della stringa terminata dal char AL
; Parametri:
; AL = carattere terminatore
; EDX = indirizzo della stringa
; Return:
; ECX = lunghezza stringa
strlen:
push eax
push edx
push esi
mov esi,edx ; EDX=start string
.loop1:
mov ah,[esi]
cmp ah,al
je .end
inc esi
jmp .loop1
.end:
mov ecx,esi ; ECX=end string
sub ecx,edx ; sottrae dalla fine del buffer l'inizio
pop esi
pop edx
pop eax
ret
; FUNCTION: read
; legge un buffer da standard input
; Parametri:
; ECX = indirizzo del buffer
; EDX = lunghezza del buffer
;
read:
push eax
push ebx
mov eax, 03h ; read()
mov ebx, 00h ; stdin
int 80h
pop ebx
pop eax
ret
; FUNCTION: write
; scrive un buffer su standard input
; Parametri:
; ECX = indirizzo del buffer
; EDX = lunghezza del buffer
;
write:
push eax
push ebx
mov eax, 04h ; write()
mov ebx, 01h ; stdout
int 80h
pop ebx
pop eax
ret
OyBBc3NlbWJsYXRvcmUgTkFTTSAyLjA3CjsKOyBjb252ZXJ0IGEgZGVjaW1hbCBBU0NJSSBzdHJpbmcgaW4gYSAxNi1iaXQgdW5zaWduZWQgaW50CjsgdGhlIHN0cmluZyBpcyByZWFkIGZyb20gc3RkIGlucHV0CjsKCWdsb2JhbCBfc3RhcnQKIApzZWN0aW9uIC5kYXRhCglidWZmZXIJcmVzYgkzMgoJc3RyaW5nCXJlc2IJMzIgCgoJbXNnCWRiCSd0aGUgY2hhciBwb2ludGVkIHRvIGJ5IEVTSSBpczogJwoJbnVtYmVyCWRiCScwMDAwJwoJCWRiCTBhaCwwCgpzZWN0aW9uIC50ZXh0CiAKX3N0YXJ0OgoJbW92CWVjeCxidWZmZXIKCW1vdgllZHgsMzIKCWNhbGwJcmVhZAoKCW1vdglhbCwwYWgKCW1vdgllZHgsYnVmZmVyCgljYWxsCXN0cmxlbgkJCTsgRUNYPXN0cmluZyBsZW5naHQKCW1vdglieXRlIFtidWZmZXIrZWN4XSwwCTsgbWFrZSBBU0NJSVoKCW1vdgllZHgsYnVmZmVyCgljYWxsCXN0cjJ1aW50MTYJOyBBWD1iaW5hcnkgbnVtYmVyCgoJbW92CWVkeCxzdHJpbmcKCWNhbGwJYmluMmRlYzE2CTsgRVhDPWxlbmd0aAoJbW92CWJ5dGUgW2VkeCtlY3hdLDBhaAoJbW92CWJ5dGUgW2VkeCtlY3grMV0sMAoJY2FsbAlwcmludGFzY2lpegoKCTsgbm93IHByaW50IHRoZSBjaGFyIHBvaW50ZWQgdG8gYnkgRVNJIChpbiBoZXgpCgoJbW92CWFsLFtlc2ldCgl4b3IJYWgsYWgKCW1vdgllZHgsbnVtYmVyCgljYWxsCWJpbjJoZXgxNgoJbW92CWVkeCxtc2cKCWNhbGwJcHJpbnRhc2NpaXoKIApleGl0OgoJbW92CWVheCwgMDFoIDsgZXhpdCgpCgl4b3IJZWJ4LCBlYnggOyBlcnJubwoJaW50CTgwaAoKCgo7IEZVTkNUSU9OOiBzdHIydWludDE2IChWMC4yKQo7IGNvbnZlcnRlIHVuYSBzdHJpbmdhIEFTQ0lJWiBkZWNpbWFsZSBpbiB1biBudW1lcm8gaW50ZXJvCjsgYSAxNiBiaXQgc2VuemEgc2Vnbm8KOwo7IFBhcmFtZXRyaToKOwlFRFggPSBpbmRpcml6em8gZGVsIGJ1ZmZlciBBU0NJSQo7IFJldHVybjoKOwlBWCA9IG51bWVybyBiaW5hcmlvIDE2IGJpdCBzZW56YSBzZWdubwo7CUVTSSA9IHB1bnRhdG9yZSBhbCBwcmltbyBjaGFyIG5vbiB2YWxpZG8gKG9wcHVyZSBhbCBOVUxMKQo7CnNlY3Rpb24gLmRhdGEKCXBvdzEwXzE2IGR3CTEsMTAsMTAwLDEwMDAsMTAwMDAKCnNlY3Rpb24gLnRleHQKc3RyMnVpbnQxNjoKCXB1c2gJZWJ4CglwdXNoCWVjeAoJcHVzaAllZHgKCXB1c2gJZWRpCgltb3YJZXNpLGVkeAoJbW92CWVjeCwwCQk7IGNvbnRhdG9yZSBkaWdpdHMgc3VsbG8gc3RhY2sKLmxvb3AxOgoJeG9yCWFoLGFoCgltb3YJYWwsW2VzaV0JOyBjYXJpY2EgbGEgY2lmcmEgZGVjaW1hbGUKCWNtcAlhbCwwCglqZQkuZW5kCgljbXAJYWwsJzAnCglqYgkubm90dmFsaWQKCWNtcAlhbCwnOScKCWphCS5ub3R2YWxpZAoJc3ViCWFsLDMwaAoJaW5jCWVzaQoJcHVzaAlheAoJaW5jCWVjeAoJY21wCWVjeCw1CglqYmUJLmxvb3AxCi5vdmVyZmxvdzoKCXBvcAlheAoJZGVjCWVjeAkJOyBjb252ZXJ0ZSBzb2xvIGxlIHByaW1lIDUgY2lmcmUKLm5vdHZhbGlkOgouZW5kOgkKCW1vdglkaSwwCQk7IHRvdGFsaXp6YXRvcmUKCW1vdgllYngscG93MTBfMTYKCWNtcAllY3gsMAoJamUJLmV4aXQKLmxvb3AyOgoJcG9wCWF4Cgltb3YJZHgsW2VieF0JOyBjYXJpY2EgcG90ZW56YSBkZWwgMTAKCW11bAlkeAkJOyBtdWx0IGNpZnJhIHBlciBwb3RlbnphIGRlbCAxMCBkeDpheAoJYWRkCWRpLGF4CglpbmMJZWJ4CglpbmMJZWJ4Cglsb29wCS5sb29wMgouZXhpdDoKCW1vdglheCxkaQoJcG9wCWVkaQoJcG9wCWVkeAoJcG9wCWVjeAoJcG9wCWVieAoJcmV0Cgo7IEZVTkNUSU9OOiBiaW4yZGVjMTYKOyBjb252ZXJ0ZSB1biBudW1lcm8gYmluYXJpbyBhIDE2IGJpdCBpbiB1bmEgc3RyaW5nYSBBU0NJSSBkZWNpbWFsZQo7IFBhcmFtZXRyaToKOwlBWCAgPSBudW1lcm8gZGEgc3RhbXBhcmUKOwlFRFggPSBpbmRpcml6em8gZGVsIGJ1ZmZlciBBU0NJSSAoNSBjaWZyZSkKOyBSZXR1cm46CjsJRUNYID0gbHVuZ2hlenphIGRlbGxhIHN0cmluYWcKYmluMmRlYzE2OgogICAgICAgIHB1c2ggICAgZWF4CiAgICAgICAgcHVzaCAgICBlYngKICAgICAgICBwdXNoICAgIGVkeAogICAgICAgIHB1c2ggICAgZXNpCiAgICAgICAgbW92ICAgICBlc2ksZWR4CiAgICAgICAgbW92ICAgICBlY3gsMCAgIDsgY29udGF0b3JlIGNpZnJlIHNpZ25pZmljYXRpdmUgCiAgICAgICAgbW92ICAgICBieCwxMCAgIDsgZGl2aXNvcmUKLmxvb3AxOgogICAgICAgIHhvciAgICAgZHgsZHgJOyBEWDpBWCA9IGRpdmlkZW5kbwogICAgICAgIGRpdiAgICAgYnggICAgICA7IGF4PXF1b3ppZW50ZSwgZHg9cmVzdG8KICAgICAgICBhZGQgICAgIGRsLDMwaAogICAgICAgIHB1c2ggICAgZHggICAgICA7IHNhbHZhIGlsIGRpZ2l0IHN1bGxvIHN0YWNrCiAgICAgICAgaW5jICAgICBlY3ggICAgIDsgaW5jcmVtZW50YSBjb250YXRvcmUgY2lmcmUKICAgICAgICBjbXAgICAgIGF4LDAKICAgICAgICBqbmUgICAgIC5sb29wMQoKICAgICAgICBtb3YgICAgIGVheCxlY3ggOyBzYWx2YSBudW1lcm8gZGlnaXRzCgoubG9vcDI6CQk7cmVjdXBlcmEgaSBkaWdpdCBkYWxsbyBzdGFjayBpbiBvcmRpbmUgaW52ZXJzbyAoYWxtZW5vIDEpCiAgICAgICAgcG9wICAgICBkeAogICAgICAgIG1vdiAgICAgW2VzaV0sZGwKICAgICAgICBpbmMgICAgIGVzaQogICAgICAgIGxvb3AgICAgLmxvb3AyCiAgICAgICAgbW92ICAgICBlY3gsZWF4IDsgcmV0dXJuIEVDWAogICAgICAgIHBvcCAgICAgZXNpCiAgICAgICAgcG9wICAgICBlZHgKICAgICAgICBwb3AgICAgIGVieAogICAgICAgIHBvcCAgICAgZWF4CiAgICAgICAgcmV0Cgo7IEZVTkNUSU9OOiBiaW4yaGV4MTYKOyBjb252ZXJ0ZSBpbCBudW1lcm8gYSAxNiBiaXQgaW4gQVggaW4gNCBjaWZyZSBoZXgKOyBQYXJhbWV0cmk6CjsJQVggID0gbnVtZXJvIGJpbmFyaW8KOwlFRFggPSBidWZmZXIgZGkgNCBjaWZyZSBoZXggKGVzOiBYWFhYKQo7IFJldHVybjoKOwlub25lCmJpbjJoZXgxNjoKCXB1c2gJZWF4CglwdXNoCWVieAoJcHVzaAllY3gKCXB1c2gJZWR4CglwdXNoCWVkaQoJbW92CWVkaSxlZHgJOyB1c2EgZWRpIHBlciBpbmRpcml6emFyZSBpbCBidWZmZXIKCWFkZAllZGksMwoJbW92CWN4LDQKLmxvb3AxOgoJeG9yCWR4LGR4CQk7IERYOkFYID0gZGl2aWRlbmRvCgltb3YJYngsMTYJCTsgZGl2aXNvcmUKCWRpdglieAkJOyBBWD1xdW96aWVudGUsIERYPXJlc3RvCglhZGQJZGwsMzBoCgljbXAJZGwsJzknCglqYmUJLmRpZ2l0CglhZGQJZGwsNwouZGlnaXQ6Cgltb3YJW2VkaV0sZGwKCWRlYwllZGkKCWxvb3AJLmxvb3AxCgkKCXBvcAllZGkKCXBvcAllZHgKCXBvcAllY3gKCXBvcAllYngKCXBvcAllYXgKCXJldAoKCjsgRlVOQ1RJT046IHByaW50YXNjaWl6Cjsgc3RhbXBhIGxhIHN0cmluZ2EgQVNDSUlaIGluIGluZ3Jlc3NvLiBMYSBzdHJpbmdhIMOoIHRlcm1pbmF0YSBkYSB1biBOVUxMIGJ5dGUKOyBQYXJhbWV0cmk6CjsJRURYID0gaW5kaXJpenpvIGRlbGxhIHN0cmluZ2EgQVNDSUlaCjsgUmV0dXJuOgo7CW5vbmUKOwpwcmludGFzY2lpejoKCXB1c2gJZWF4CglwdXNoCWVjeAoJcHVzaAllZHgKCW1vdglhbCwwCgljYWxsCXN0cmxlbgk7IGVjeD1sZW5ndGgKCW1vdgllYXgsZWN4CTsgc2NhbWJpYSBlY3ggZWQgZWR4Cgltb3YJZWN4LGVkeAk7IGluZGlyaXp6byBidWZmZXIgaW4gZWN4Cgltb3YJZWR4LGVheAk7IGxlbmd0aCBpbiBlZHgKCWNhbGwJd3JpdGUKCXBvcAllZHgKCXBvcAllY3gKCXBvcAllYXgKCXJldAoKCjsgRlVOQ1RJT046IHN0cmxlbgo7IGNhbGNvbGEgbGEgbHVuZ2hlenphIGRlbGxhIHN0cmluZ2EgdGVybWluYXRhIGRhbCBjaGFyIEFMCjsgUGFyYW1ldHJpOgo7CUFMICA9IGNhcmF0dGVyZSB0ZXJtaW5hdG9yZQo7CUVEWCA9IGluZGlyaXp6byBkZWxsYSBzdHJpbmdhCjsgUmV0dXJuOgo7CUVDWCA9IGx1bmdoZXp6YSBzdHJpbmdhCnN0cmxlbjoKCXB1c2gJZWF4CglwdXNoCWVkeAoJcHVzaAllc2kKCW1vdgllc2ksZWR4CTsgRURYPXN0YXJ0IHN0cmluZwoubG9vcDE6Cgltb3YJYWgsW2VzaV0KCWNtcAlhaCxhbAoJamUJLmVuZAoJaW5jCWVzaQoJam1wCS5sb29wMQouZW5kOgoJbW92CWVjeCxlc2kJCTsgRUNYPWVuZCBzdHJpbmcKCXN1YgllY3gsZWR4CQk7IHNvdHRyYWUgZGFsbGEgZmluZSBkZWwgYnVmZmVyIGwnaW5pemlvCglwb3AJZXNpCglwb3AJZWR4Cglwb3AJZWF4CglyZXQKCgo7IEZVTkNUSU9OOiByZWFkCjsgbGVnZ2UgdW4gYnVmZmVyIGRhIHN0YW5kYXJkIGlucHV0CjsgUGFyYW1ldHJpOgo7CUVDWCA9IGluZGlyaXp6byBkZWwgYnVmZmVyCjsJRURYID0gbHVuZ2hlenphIGRlbCBidWZmZXIKOwpyZWFkOgoJcHVzaAllYXgKCXB1c2gJZWJ4Cgltb3YJZWF4LCAwM2gJCTsgcmVhZCgpCgltb3YJZWJ4LCAwMGgJCTsgc3RkaW4KCWludAk4MGgKCXBvcAllYngKCXBvcAllYXgKCXJldAoKOyBGVU5DVElPTjogd3JpdGUKOyBzY3JpdmUgdW4gYnVmZmVyIHN1IHN0YW5kYXJkIGlucHV0CjsgUGFyYW1ldHJpOgo7CUVDWCA9IGluZGlyaXp6byBkZWwgYnVmZmVyCjsJRURYID0gbHVuZ2hlenphIGRlbCBidWZmZXIKOwp3cml0ZToKCXB1c2gJZWF4CglwdXNoCWVieAoJbW92CWVheCwgMDRoCQk7IHdyaXRlKCkKCW1vdgllYngsIDAxaAkJOyBzdGRvdXQKCWludAk4MGgKCXBvcAllYngKCXBvcAllYXgKCXJldAoK