conversione da numero a stringa - Agentgroup
conversione da numero a stringa - Agentgroup
conversione da numero a stringa - Agentgroup
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