Se me ocurrio programar ésta función cuando estaba trabajando con cadenas de texto.
Claro que existe algo "nuevo" y es que me estoy interiorizando mas con el AT&T y sus sintaxis extendida,
la función en si misma ésta bastante optimizada y es más rapida.
/*--------------------------------------------
  
    Autor: NvK
    Descripción: Obtiene los últimos caracteres de una cadena de texto y lo pone en un buffer.
    Fecha: 25-2-2014
  
----------------------------------------------*/
void strlast(char *str, int last_n, char output_buf[])
{
    volatile register int __ptr_length __asm__("ebx");
    register int __ptr_last_n __asm__("ecx");

    __asm__(
            "mov %%eax, (%%esp);"
            "call _strlen;"
            "movl %%eax, %%ebx;"
            ::"a"(str)
        );
    __asm__("mov %%edx, %%ecx;"
            "sub %%ebx, %%ecx;"
            "neg %%ecx;" :: "d"(last_n) );

    for(int i=0; i<=last_n; i++)
        __asm__ volatile(";":"=r"(output_buf[i]):"a"(str[ __ptr_last_n++ ]));
}
Aquí un ejemplo:
char palabra[256];
strlast("ultima letra", 5, palabra);
Salida:
letra
Responder

Volver a “Fuentes”