Hola a todos,
A ver si me podeis hechar una mano, porfa. :)
Estoy haciendo un code en c++ (lenguaje que conozco) y necesito usar puntalmente esta rutina en asm (lenguaje que no domino), que he encontrado y me vendría de maravilla.
La rutina es esta:
unsigned char tablasci2[ TABLE_NUM ][ TABLE_SIZE ];
//===================================
#ifndef INLINE_ASM
unsigned char change( unsigned char byte, unsigned int num )
{ num &= 0x7; return tablasci1[num][byte]; }
#endif
//===================================
char *encript_buffer( char *buffer, int len, char *key, int keylen, int pos )
{
#ifdef INLINE_ASM
// esi - buffer edi - key ecx - i ebx - j edx - k pos
asm (
"movl %3, %%edi;\n" // edi contains keylen
"cmp $16, %%edi;\n" // if ( keylen > MAX_KEY_LEN )
"jle _skip_if1;\n"
"mov $16, %%edi;\n" // keylen = MAX_KEY_LEN;
"_skip_if1:\n"
"movb (%%edi,%%ebx),%%al;\n" //al contain key[j]
"addb %%bl,%%al;\n" // key[j]+j in eax
"movl %4, %%edx;\n" // pos in edx
"addl %%ecx, %%edx;\n"// (i + pos) in edx
"andl $7, %%edx;\n" // edx &= 7
"sall $8, %%edx;\n" // edx *= 256
"addl %%edx, %%eax;\n"
"addl $tablasci2, %%eax;\n" // eax += tablasci2 :o
........ etc.. etc...
#else
int i, j, k;
if ( keylen > MAX_KEY_LEN ) keylen = MAX_KEY_LEN;
...... etc... etc....
}
Pues, cuano lo compilo, me da este error:
[Linker error] undefined reference to `tablasci2'
Me podeis hechar una mano esplicandome porqué da este error y como puedo solucionarlo, porfa? Estoy ya en las ultimas....
Uso el Dev-C++ y el micro es un Intel
Gracias :)
¿Y donde esta la tabla? ;D
Aca la declaras:
unsigned char tablasci2[ TABLE_NUM ][ TABLE_SIZE ];
Supongamos que TABLE_NUM y TABLE_SIZE tiene como valor 2, en algun lugar tenes que tener definido el array, ejemplo:
unsigned char tablasci2[ 2 ][ 2 ] =
{
{5,6},
{8,9}
};
Oks. Gracias Idol por la respuesta. :) Pues he probado a definir el array justo a continuacion de su definicion, he compilado y sigue dando error de linker.
Aprovecho para añadir algo de info, por si puede ser de ayuda....
unsigned char tablasci2[ TABLE_NUM ][ TABLE_SIZE ] = { {0,0} , {0,0} };
//===================================
#ifndef INLINE_ASM
...........
...........
...........
El programa comienza con una llamada a " encript_buffer(..... ) " así:
// Get a new expand key with 256 bits
strcpy( newkey, key );
encript_buffer( newkey, 16, "K#ç=+xnNX~Nx6544", 16, 0 );
for ( j=0; j<TABLE_NUM; j++ ){
for ( i=0; i<TABLE_SIZE; i++ ) ascii=i;
for ( i=0; i<TABLE_SIZE; i++ ){
tablasci2[j][ ascii ] = i;
......
.....
.....
Por cierto, tengo entendido que esta sintaxis del asm es para linux, mientras yo uso
el windows.
Talvez en el Dev-C++ hay que activar alguna opcion para que compile el asm??
Lo que pasa es que debería dar error en todo y no solo en la ref de link tabla.
Buwaaa.... :-( a ver como salgo de esta? :)
El error es del enlazador, ya fue compilado el codigo asi que no tiene nada que ver con la sintaxis del codigo en assembly (es mas, si no estas definiendo INLINE_ASM ni siquiera lo usa realmente). Lo que si podria suceder es que el simbolo sea _tablasci2 asi que proba usando $_tablasci2 en lugar de $tablasci2.
PD. La proxima vez deja una version minima compilable asi hay que adivinar menos, el array no estaba declarado como extern asi que ese no era el error.
GRACIASSSSS Idol :)
Diablo!!! era eso.
Pues, es un code de cifrado que vi en Google code search.
No entiendo mucho del tema cifrado, peró me ha dado la sensacion (por las funciones randow que usa) que es algo interesante.
Bueno: con la idea de compartir cosas, si alguien quiere hecharle una ojeada, dejo la dire:
http://www.google.com/codesearch/p?hl=es&sa=N&cd=1&ct=rc#Z0riSPmpmU8/phcript-1.0.1/phcript.c&q=criptografy%20lang:c
This is Google's cached copy of http://downloads.sourceforge.net/magic-cube/phcript-1.0.1.tar.gz
Gracias de nuevo, family (sabia que podía contar con el foro) :)
De nadas ::)