
02/06/2005, 10:23
|
| | Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 10 meses Puntos: 17 | |
Para quien lo quiera para VC++ o una DLL para llamar y que sea rápido, he hecho una función estilo a las ANSI-C en inline ASM...
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*******************************************
* Rellena con ceros a la izquierda - MaxExtreme
*
**** Argumentos ****
* numero - Número origen al que se añadirán ceros
* destino - Puntero donde se guardará el resultado
* cifras - Cifras totales que tendrá la string destino
*
**** Devuelve ****
* ret==0 OK
* ret!=0 ERROR
******************************************/
int Rellenar(int numero, char * destino, int cifras)
{
static char buffer[11];
__asm
{
pusha
lea edx, buffer
push 10d
push edx
push numero
call itoa
add esp, 0Ch
push eax
call strlen
pop edx
mov ebx, destino
mov ecx, cifras
mov byte ptr [ebx+ecx], 0h
sub ecx, eax
mov edx, ecx
cmp eax, cifras
jg error
je igual
ceros: mov byte ptr [ebx+ecx-1], 30h
loop ceros
igual: add ebx, edx
mov ecx, eax
lea edx, buffer
num: mov al, byte ptr [edx+ecx-1]
mov byte ptr [ebx+ecx-1], al
loop num
popa
mov eax, 0h
jmp fin
error: popa
mov eax, 1h
fin:
}
}
void main()
{
// Rellenamos parte de la cadena para comprobar que se incluye el terminador \0
char destino[100]="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// Rellenamos con el número 12345 con 10 cifras -> OK
if(Rellenar(12345,destino,10)==0) printf("%s\n",destino);
else printf("Error\n");
// Rellenamos con el número 12345 con 5 cifras -> OK
if(Rellenar(12345,destino,5)==0) printf("%s\n",destino);
else printf("Error\n");
// Rellenamos con el número 12345 con 3 cifras -> ERROR
if(Rellenar(12345,destino,3)==0) printf("%s\n",destino);
else printf("Error\n");
}
Ese ejemplo devuelve lo que se espera: No sé si se puede optimizar más, pero ahí queda como curiosidad...
** EDIT: pops sustituidos por add dado que itoa devuelve el puntero que se le pasa y por lo tanto lo tenemos en eax para hacer push a strlen sin usar edx - Eternal Idol
Última edición por MaxExtreme; 02/06/2005 a las 14:01 |