elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17
61  Programación / ASM / Re: [Gnu AS] BruteForce en: 2 Octubre 2016, 03:01 am
Ayudame a calcular la posición del i del primer for.
Funciona perfecto todo, pero me tira mal la posición del i, del primer for.

Mirá este código lo debuggié con gdb, de todos modos no pude sacar.
Capaz que sea una cuenta mal hecha, este código está ya funcionando.

Código
  1. .text
  2. .global bf
  3. bf:
  4. cld
  5. movq %rcx,%r8
  6.  
  7. subq %rcx,%rdx
  8. incq %rdx
  9.  
  10. movq %rdx,%rcx
  11.  
  12. aca:
  13. lodsb
  14. _1for:
  15. scasb
  16. je Si_eq_s0
  17. loop _1for
  18.  
  19. movq $-1,%rax
  20. ret
  21.  
  22. Si_eq_s0:
  23. movq %rcx,%r13
  24. movq %rsi,%r11
  25. decq %r11 # siempre apunta al primero
  26. movq %rdi,%r12
  27.  
  28. # comprobamos denuevo letra anterior porque sino queda vacio y da true.
  29. # incq %rcx # VER
  30. decq %rsi
  31. decq %rdi
  32.  
  33. subq %rcx,%rdx # este es la posición.
  34.  
  35. # esta bucle se repite ls-1 veces.
  36. movq %r8,%rcx # r8=ls
  37. decq %rcx
  38.  
  39. _2for:
  40. repe cmpsb
  41. jne fail
  42.  
  43. jmp final
  44.  
  45. fail:
  46. cmpq $0,%rcx
  47. je final
  48.  
  49. movq %r13,%rcx
  50. movq %r11,%rsi
  51. movq %r12,%rdi
  52. jmp aca
  53.  
  54. final:
  55. subq %rcx,%rdx
  56. movq %rdx,%rax
  57. ret
  58.  

62  Programación / ASM / Re: [Gnu AS] BruteForce en: 1 Octubre 2016, 18:38 pm
O sea, los dos funcionan perfectamente.
El problema es que devuelvo mal la posición, es decir tengo que retornar el i del primer bucle y lo estoy calculando mal.

Igual lo admito que es cansador esta sintaxis, más tarde lo voy a ver otra vez.

Cualquiera que quiera darme una mano, bienvenido sea.

Saludos!
63  Programación / ASM / Re: [Gnu AS] BruteForce en: 1 Octubre 2016, 11:27 am
Probé con eso y no anduvo.
¿Podés hacerlo vos y mostrarme como te quedó?, sin necesariamente ver el mío.

¡Saludos!
64  Programación / ASM / [Gnu AS] BruteForce en: 1 Octubre 2016, 06:42 am
Voy al grano,

Hecho en C:
Código
  1. #include <stdio.h>
  2.  
  3. int fuerzabruta(char *S, char *s, int lS, int ls)
  4. {
  5.        int i, j;
  6.  
  7.        for(i=0; i<lS-ls+1; i++)
  8.                if(S[i]==s[0]) {
  9.                      for (j=0; j<ls; j++){
  10.                              if (S[i+j] != s[j]) break;
  11.                      }
  12.  
  13.                        if(j==ls) return i;
  14.        }
  15.        return -1;
  16. }  

Lo pasé a ASM y anduvo pero lo quise hacer denuevo y no funcionó:

1era versión:
Código
  1. #int fuerzabruta(char *S, char *s, int lS, int ls){
  2. # int i, j;
  3. # for(i=0; i<lS-ls+1; i++)
  4. # if(S[i]==s[0]) {
  5. # for(j=0; j<ls && S[i+j]==s[j]; j++);
  6. # if(j==ls) return i;
  7. # }
  8. # return -1;
  9. #}
  10.  
  11. # Retorna la posición del primer elemento de la cadena a buscar.
  12. # "sHolasos" "sos" retorna 5.
  13.  
  14.  
  15.  
  16. # lS = %rdx
  17. # ls = %rcx
  18.  
  19. .data
  20. i: .quad 0
  21.  
  22. .text
  23. .global bf
  24. bf:
  25. # iremos incrementando (df = 0)
  26. cld
  27.  
  28. # Guardo variable ls en otro registro.
  29. # rdx = ls
  30. movq %rcx,%r8
  31.  
  32.  
  33. # cuantas veces repetimos al primer for?
  34.  
  35. subq %rcx,%rdx # rdx = rdx - rcx
  36. # es decir: lS = lS - ls
  37.  
  38. addq $1,%rdx # sumo 1
  39.  
  40.  
  41.  
  42. # Lo cargamos al rcx para el bucle.
  43. movq %rdx, %rcx
  44. aca:
  45. lodsb # copiamos el primer caracter de la 2da cadena en el rax
  46. # decq %rsi
  47.  
  48. sigue1:
  49. #lodsb
  50. # primero busco el primer caracter de la cadena 2 en la cadena 1.
  51. # mas tecnico: comparamos rax con rdi
  52. scasb
  53. # si encontramos el primer caracter en algun lugar de la cadena, saltamos al 2do for.
  54.  
  55. je found
  56. loop sigue1
  57. # termina.
  58. # -1 si no lo encontramos el primer caracter de la 2da cadena en la primera.
  59. movq $-1, %rax
  60. ret
  61.  
  62.  
  63. found:
  64. # encontramos el primer caracter de la 2da cadena en la primera.
  65. # estamos dentro del primer if.
  66. # usaremos el registro r8, hasta el momento r8 = ls.
  67.  
  68. # Quiero saber el valor de i
  69. # i = %rdx - %rcx
  70. # i = lS-ls+1 - veces repetido (hacia atras,es decir del tope al 0).
  71.  
  72. # Guardamos informacion del bucle anterior.
  73. movq %rcx,%r13
  74. movq %rdx,%r15
  75. movq %rsi,%r9
  76. subq $1,%r9
  77.  
  78. subq %rcx,%rdx # rdx = rdx - rcx ( i = rdx )
  79.  
  80.  
  81. # Cargamos r8=ls a rcx para el 2do for. Hay que restar uno.
  82. movq %r8,%rcx
  83. decq %rcx
  84. movq %rdi,%r14
  85. sigue2:
  86. # comprobamos si los siguientes caracteres estan en la cadena 1.
  87. # tengo que cambiar adonde apunta rdi, es decir la primer cadena. ( S[i+j] )
  88. # i = rdx
  89. cmpsb
  90. jne fail
  91. loop sigue2
  92. movq %rdx,%rax
  93. addq $1,%rax
  94. ret
  95.  
  96.  
  97. # fallo en el 2do for.
  98. fail:
  99. # el último if ( if j == ls return i )
  100. # si es igual a 0 significa que recorrió todo el bucle.
  101. cmpq $0, %rcx
  102. je final
  103. # si no son iguales vuelvo al 1do for.
  104.  
  105. # antes cargo el rcx y rdi de nuevo, con informacion del i del primer bucle.
  106. # restauro registros
  107. movq %r13,%rcx
  108. movq %r14,%rdi
  109.  
  110. movq %r9, %rsi
  111. movq %r15,%rdx
  112. jmp aca
  113.  
  114. final:
  115. subq %rcx,%rdx # es el i
  116. movq %rdx,%rax
  117. ret
  118.  

Lo implemento usando se, o sea declaro el prototipo en c y llamo a esa funcion, haciendo gcc bf.c bf.s -o bf
Esa primer versión con todo lo que probé funcionó pero esta segunda versión no, capaz me comí algo pero ya me cansé de buscarlo.
Intenté con gdb pero me cansé a ver si alguien me puede dar una manito.
Para usar gdb lo compilaba con -g

Segunda versión:
Código
  1. .text
  2. .global bf
  3. bf:
  4. cld
  5. movq %rcx,%r8
  6.  
  7. subq %rdx,%rcx # rdx = rdx - rcx
  8. # lS = lS - ls
  9. addq $1, %rdx
  10.  
  11. movq %rdx,%r9
  12.  
  13. movq %rdx,%rcx
  14. aca:
  15. lodsb # cargamos el primer caracter de la 2da cadena en el rax.
  16. subq $1,%rsi
  17.  
  18. _1for:
  19. scasb
  20. je si_eq_s0
  21. loop _1for
  22. movq $-1, %rax
  23. ret
  24.  
  25. si_eq_s0:
  26. # Para volver al anterior bucle.
  27. movq %rsi, %r14
  28. addq $1,%rsi
  29. movq %rdi, %r12
  30. movq %rcx, %r13 # valor de i.
  31.  
  32. subq %r13,%r9 # valor de i
  33.  
  34.  
  35. movq %r8,%rcx
  36. subq $1,%rcx
  37.  
  38. _2for:
  39. cmpsb # rsi == rdi?
  40. jne fail
  41. loop _2for
  42. movq %r13,%rax
  43. ret
  44.  
  45. fail:
  46. cmpq $0,%rcx
  47. je final
  48.  
  49. movq %r14,%rsi
  50. movq %r12,%rdi
  51. movq %r13,%rcx
  52. jmp aca
  53.  
  54. final:
  55. movq %r9,%rax
  56. ret
  57.  

Esta es la imp.

Código
  1. #include <stdio.h>
  2. int bf ( char *s1, char *s2, int long_s1, int long_s2);
  3. int main (void){
  4. printf ("Resultado: %d\n",bf("soAdSDsos","sos",9,3));
  5.        return 0;
  6. }
  7.  


Saludos!

65  Programación / Programación C/C++ / Re: [C] ¿Por qué esto no desborda? Malloc en: 2 Julio 2016, 13:17 pm
No debería ser hasta size -1?

Mira si yo en este ejemplo pedí malloc(sizeof(int)*3) y llego hasta a[2] en este caso debería hacer lo mismo
Pido size y llego hasta size-1

Lo loco es que funciona bien de las dos maneras, si ya me paso mucho ahí desborda.
Obviamente que es por lo que me dijste.
66  Programación / Programación C/C++ / Re: [C] ¿Por qué esto no desborda? Malloc en: 2 Julio 2016, 12:35 pm
Código
  1. void astack_reverse (){
  2.  
  3.  int size=5;
  4.  int *pila = malloc (sizeof (int)*size);
  5.  int n_elems=0;
  6.  int i;
  7.  
  8.  // Guardo todos los datos en un arreglo.
  9.  while (head != NULL){
  10.    if (n_elems != size-1){
  11.      pila[n_elems++] = head->data;
  12.      head = head->next;
  13.    }else{
  14.      // ... Si se queda sin memoria
  15.      size+=2;
  16.      pila = realloc (pila, size*sizeof(int));
  17.      pila[n_elems++] = head->data;
  18.      head = head->next;
  19.    }
  20.  }
  21.  // Chau pila actual.
  22.  astack_destroy();
  23.  // Construyo la pila devuelta. Del último al primero.
  24.  for (i=0; i<n_elems; i++)astack_push(pila[i]);
  25.  free(pila);
  26.  
  27. }

¿Así entonces?
¿Por qué size+1? Si voy hasta size-1
67  Programación / Programación C/C++ / Re: [C] ¿Por qué esto no desborda? Malloc en: 2 Julio 2016, 12:10 pm
Bueno, pero la pregunta ahora es hasta donde puedo escribir bien?
¿Hasta a[2] ?
68  Programación / Programación C/C++ / Re: [C] ¿Por qué esto no desborda? Malloc en: 2 Julio 2016, 11:49 am
Buenisimo y era para eso ahora quiero preguntarte si lo que hice está bien:

http://codepad.org/WtFyTHpG
http://codepad.org/oxVtGb6q
http://codepad.org/AotiUB6K

MIrá en el primer link en la linea 50 para hacer el stack reverse, está bien pedida la memoria? O me pedí de más?

Yo hice pruebas y funciona a la perfección pero no estoy seguro si estoy pidiendo más memoria de la cuenta.

Saludos!
69  Programación / Programación C/C++ / [C] ¿Por qué esto no desborda? Malloc en: 2 Julio 2016, 11:30 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void){
  5.  
  6.        int *a= malloc (sizeof (int) * 3);
  7.  
  8.        a[0]=1;
  9.        a[1]=2342;
  10.        a[2]=43;
  11.        a[3]=89;
  12.        a[4]=666;
  13.        a[5]=12312;
  14.        a[6]=43;
  15.        a[7]=89;
  16.        a[8]=666;
  17.        a[9]=12312;
  18.        a[10]=32;
  19.        a[11]=32;
  20.  
  21.        int i;
  22.        for (i=0; i<=11; i++)printf ("%d ",a[i]);
  23.        puts ("");
  24.  
  25.  
  26.        return 0;
  27. }

¿Por qué no desborda? si yo sólo pedí espacio para 3, estoy confundido.

Saludos!  :-\
70  Programación / Programación C/C++ / Re: [C] Listas enlazadas utilizando arreglos en: 7 Mayo 2016, 18:18 pm
AAahhh ¡Claro! que tonto, ahora si entendí
Eso era todo lo que quería que me digas no que me expliques el código entero  :xD


Muchas gracias!
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines