20.01.2015 Views

conversione da numero a stringa - Agentgroup

conversione da numero a stringa - Agentgroup

conversione da numero a stringa - Agentgroup

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Traduzione della funzione convNS<br />

<strong>da</strong> C ad assembler<br />

Converte un intero in una <strong>stringa</strong><br />

void convNS(int i, char ris[7])<br />

{<br />

int negativo, cont;<br />

negativo = (i < 0);<br />

if (negativo)<br />

i = -i;<br />

ris[6] = '\0'; /* fine <strong>stringa</strong> */<br />

cont = 5;<br />

do<br />

{<br />

ris[cont] = (i % 10) + '0';<br />

i = i / 10;<br />

cont--;<br />

}<br />

while (i > 0);<br />

if (negativo)<br />

{<br />

ris[cont] = '-';<br />

cont--;<br />

}<br />

for (; cont >=0; cont--)<br />

ris[cont] = ' ';<br />

}


DGROUP group _DATA,_BSS<br />

_TEXT segment byte public 'CODE'<br />

assume cs:_TEXT,ds:DGROUP<br />

;<br />

; void convNS(int i, char ris[7])<br />

;<br />

_convNS proc near<br />

push bp ; salva bp<br />

mov bp,sp ; memorizza sp in bp<br />

push si ; salva si<br />

;<br />

; {<br />

; int negativo, cont;<br />

;<br />

sub sp,4 ; alloco memoria per 2 interi<br />

; uso nomi simbolici per aumentare la leggibilità<br />

ris EQU word ptr [bp+6]<br />

i EQU word ptr [bp+4]<br />

negativo EQU word ptr [bp-2]<br />

cont EQU word ptr [bp-4]<br />

;<br />

; negativo = (i < 0);<br />

;<br />

cmp i,0 ; se i è >= a 0<br />

jge short falso ; salto<br />

; altrimenti<br />

mov negativo,1 ; imposto negativo a 1<br />

jmp short vero ;<br />

falso:<br />

mov negativo,0 ; imposto negativo a 0<br />

vero:<br />

;<br />

; if (negativo)<br />

;<br />

cmp negativo,0 ; se negativo è falso<br />

je short else ; salto


; altrimenti nego i<br />

;<br />

; i = -i;<br />

;<br />

mov ax,i ; carico i in ax<br />

neg ax ; complemento a 2<br />

mov i,ax ; carico ax in i<br />

else:<br />

;<br />

; ris[6] = '\0'; /* fine <strong>stringa</strong> */<br />

;<br />

mov bx,ris ; carico in bx<br />

; l’indirizzo di ris<br />

mov<br />

byte ptr [bx+6],0 ; metto 0 in ris[6]<br />

; fine <strong>stringa</strong><br />

;<br />

; cont = 5;<br />

;<br />

mov cont,5 ; inizializzo cont a 4<br />

; l’ultimo carattere prima<br />

; del fine <strong>stringa</strong><br />

; ciclo di <strong>conversione</strong><br />

;<br />

; do<br />

; {<br />

; ris[cont] = (i % 10) + '0';<br />

;<br />

inizio_do:<br />

mov ax,i ; carico i in ax<br />

mov bx,10 ; carico 10 in bx<br />

idiv bx ; divido ax per bx<br />

; (con segno)<br />

add<br />

mov<br />

mov<br />

mov<br />

dl,'0' ; in dl ho il resto<br />

; aggiungo il car '0'<br />

bx,ris ; carico in bx<br />

; l’indirizzo di ris<br />

si,cont ; carico cont in si<br />

byte ptr [bx+si],dl<br />

; carico in ris[cont]


; il carattere dl<br />

;<br />

; i = i / 10;<br />

;<br />

mov ax,i ; carico i in ax<br />

mov bx,10 ; carico 10 in bx<br />

idiv bx ; divido ax per bx<br />

; (con segno)<br />

mov i,ax ; metto il risultato in i<br />

;<br />

; cont--;<br />

;<br />

dec cont ; decremento cont<br />

; per spostarmi a sinistra<br />

; nell’array<br />

;<br />

; }<br />

; while (i > 0);<br />

;<br />

cmp i,0 ; finché i è maggiore di 0<br />

jg short inizio_do<br />

;<br />

; if (negativo)<br />

;<br />

cmp<br />

je<br />

negativo,0 ; se negativo è falso<br />

short else_2 ; salto<br />

; altrimenti inserisco un '-'<br />

; nella posizione cont<br />

;<br />

; {<br />

; ris[cont] =;<br />

;<br />

mov<br />

mov<br />

mov<br />

;<br />

; cont--;<br />

bx,ris ; carico in bx<br />

; l’indirizzo di ris<br />

si,cont ; carico cont in si<br />

byte ptr [bx+si],'-'<br />

; carico '-' in ris[cont]


;<br />

dec cont ; decremento cont<br />

else_2:<br />

;<br />

; }<br />

; inserisco spazi <strong>da</strong>lla posizione cont a 0<br />

; for (; cont >=0; cont--)<br />

; non ho inizializzazione<br />

inizio_for:<br />

; ris[cont] = ' ';<br />

;<br />

cmp cont,0 ; se cont è minore di 0<br />

jl short fine_for ; salto alla fine<br />

mov bx,ris ; carico in bx<br />

; l’indirizzo di ris<br />

mov<br />

mov<br />

si,cont ; carico cont in si<br />

byte ptr [bx+si],' '<br />

; carico ' ' in ris[cont]<br />

dec cont ; decremento cont<br />

jmp short inizio_for<br />

fine_for:<br />

;<br />

;}<br />

;<br />

add sp,4 ; dealloco le var locali<br />

pop si ; ripristina si<br />

pop bp ; ripristina bp<br />

ret<br />

_convNS<br />

_TEXT<br />

_DATA<br />

_DATA<br />

public _convNS<br />

end<br />

; ritorna<br />

endp<br />

ends<br />

segment word public 'DATA'<br />

ends

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!