1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
function FGIntToStr(Nb: GInt): AnsiString; register;
var buffer, lb, ls, ln : longword;
asm
push edx
test eax,eax // cas Nb=0 ?
jnz @Init
call RetZero
mov byte ptr[eax],$30
pop edx
mov [edx],eax
jmp @Retour
@init:
push eax
mov eax,edx
call System.@LStrClr
pop eax
push ebx
push esi
push edi
mov ebx,eax // ebx pointe nb
mov eax,[eax]-$04
mov ln,eax // ln = longueur de Nb
shl eax,2 // ln x 4
mov lb,eax // réserver un buffer de 4 fois la capacité Nb
call System.@GetMem //obtenir adr buffer
mov buffer,eax
mov edi,eax // eax pointe début de buffer
add edi,lb // edi pointe fin buffer +1
xor edx,edx // copier Nb en début de buffer
@Copy:
mov cl,byte ptr[ebx]+edx
mov byte ptr[eax]+edx,cl
inc edx
cmp edx,ln
jne @Copy
xor edx,edx // Conversion des octets en base 100 en fin de buffer
mov ls,edx // compteur octets décimaux
xor ecx,ecx
mov ebx,$64
@RConv2: //lecture, conversion, stockage
mov esi,buffer
mov ecx,ln
@RConv1:
xor eax,eax
mov al,byte ptr[esi]
mov byte ptr[esi],0
inc esi
dec ecx
jz @finConv
test al,al
jz @RConv1
mov dl,al
@RConv0:
mov ah,dl
xor dx,dx
mov al,byte ptr[esi]
div bx
add byte ptr[esi]-1,ah // report de retenue
mov byte ptr[esi],al // place quotient
inc esi
dec ecx
jnz @RConv0
dec edi
mov byte ptr[edi],dl // sauve dernier reste de ligne ligne
inc ls // compteur octets convertis
jmp @RConv2
@FinConv:
xor dx,dx
div bx
dec edi
mov byte ptr[edi],dl // dernier reste
inc ls
dec edi
mov byte ptr[edi],al // dernier quotient
inc ls
mov esi,buffer // Conversion en Ascii et stockage en buffer
mov ecx,ls
xor ebx,ebx
@Ascii:
mov al,byte ptr[edi]
inc edi
aam
add ax,$3030
mov byte ptr[esi],ah
inc esi
mov byte ptr[esi],al
inc esi
add ebx,2
dec ecx
jnz @Ascii
mov eax,ebx // Chaîne de retour
mov esi,buffer
@Ret0: //sauter les '0' de devant
cmp eax,1
je @SStr
cmp byte ptr[esi],$30
jne @SStr
inc esi
dec eax
jmp @Ret0
@SStr:
call Restring
pop edi
pop esi
pop ebx
pop edx
mov [edx],eax //Result
mov eax,buffer //Libérer buffer
mov edx,lb
call system.@FreeMem
@Retour:
end; |
Partager