Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: omar_cdg en 9 Septiembre 2015, 02:03 am



Título: explicacion loop
Publicado por: omar_cdg en 9 Septiembre 2015, 02:03 am
Hola amigos, estoy dando mis primeros pasos en asembler y quisiera que alguien me explique por que la salida del siguiente codigo es 40, y no 56. La verdad que no puedo encontrar la razon. Gracias

Código
  1. .data
  2. i: .long 24
  3. n: .long 32
  4.  
  5. .bss
  6. .comm r,4,4
  7.  
  8. .text
  9. .global main
  10. main:
  11. movl i, %eax
  12. movl $1, %ecx
  13. loop:                  
  14.      cmpl n, %ecx      
  15.      jg endloop  
  16.      addl %ecx, %eax
  17.      incl %ecx
  18.      jmp loop
  19. endloop:
  20.        movl %eax, r
  21.  
  22. #linux exit
  23. movl $0, %ebx
  24. movl r, %ebx
  25. movl $1, %eax
  26. int $0x80


Título: Re: explicacion loop
Publicado por: someRandomCode en 9 Septiembre 2015, 02:21 am
Código
  1. main:
  2. movl i, %eax # cargar 24 long a eax
  3. movl $1, %ecx # cargar 1 en el valor de ecx
  4. loop:                  
  5.      cmpl n, %ecx      #comparar n el valor de ecx con n
  6.      jg endloop          # si es mas grande, saltar a endloop
  7.      addl %ecx, %eax # si no es mas grande, sumarle al contenido de eax, el contenido de ecx
  8.      incl %ecx           # incrementar el valor de ecx
  9.      jmp loop            # saltar a loop
  10. endloop:
  11.        movl %eax, r    # cargar  en r el valor de eax
  12.  
  13. #linux exit ----> aca hace la interrupcion para sacarlo por pantalla
  14. movl $0, %ebx         # cargar el valor 0 en ebx
  15. movl r, %ebx            # cargar el valor de r en ebx
  16. movl $1, %eax          # cargar el valor de 1 en eax
  17. int $0x80                 # interrupcion para sacar por pantalla
  18.  



Título: Re: explicacion loop
Publicado por: omar_cdg en 9 Septiembre 2015, 02:31 am
Hola, gracias. Por esta misam razón cuando n lleag a 32 %eax vale 32+24, no es así??
la salida debería ser, creo, es mi tercer programa, 56. Perdón mi ignorancia



Título: Re: explicacion loop
Publicado por: someRandomCode en 9 Septiembre 2015, 03:56 am
Nop, n nunca se incrementa..
Solo se compara n con el valor de ecx, este ultimo es el que se incrementa
Cuando se han dado 31(no 32, porque empezamos en 1 el valor de ecx) vueltas al loop vamos al siguiente tag.

el tema es como se incrementa eax, que es la que al final le da el valor a r.
eax = eax + ecx;
o sea, primera vuelta:
eax = 24;
ecx = 1;
eax = 24 + 1;
segunda vuelta:
eax =25;
ecx = 2;
eax = 25+2;
...

A mi de seguirlo a ojo me parece que da algo asi como 520


Título: Re: explicacion loop
Publicado por: omar_cdg en 9 Septiembre 2015, 04:42 am
sí tenes razon, yo me equivoque, da como 500 y pico, hoy a la tarde saque la cuenta :p
igualmente no entiendo por que me sale 40 en la salida
De todas formas agradezco mucho tu atención. Saludos


Título: Re: explicacion loop
Publicado por: someRandomCode en 9 Septiembre 2015, 16:05 pm
A todo esto, que ensamblador estas usando?
No deberia cambiar el resultado, es solo curiosidad, porque ese codigo tal cual como esta NASM me lo rechaza.. Requiere bastantes cambios..

EDIT: antes de que no se entienda :P me da falla de segmentacion


Título: Re: explicacion loop
Publicado por: xv0 en 10 Septiembre 2015, 03:24 am
@omar_cdg

Revisa lo que hace el salto jg y sabras porque no te da bien la suma, por otro lado el resultado sigue siendo incorrecto, tendria que devolver 24.

A todo esto, que ensamblador estas usando?
No deberia cambiar el resultado, es solo curiosidad, porque ese codigo tal cual como esta NASM me lo rechaza.. Requiere bastantes cambios..

EDIT: antes de que no se entienda :P me da falla de segmentacion

Es la sintaxis de AT&T, ensamblalo con GAS.

Un saludo.

Modifico:

Me acaba de dar bien el resultado, explica como consultas el resultado.


Título: Re: explicacion loop
Publicado por: someRandomCode en 10 Septiembre 2015, 05:00 am
Ni con gcc ni con as lo puedo compilar y evitar que me haga una falla de segmentacion, que raro..

Por que deberia dar 24? Se me acaba de perder el tren de pensamientos


Título: Re: explicacion loop
Publicado por: xv0 en 10 Septiembre 2015, 15:16 pm
Fue un error mio lo de 24, estuve mirando el cmp en los manuales, y este tenia la sintaxis de intel, y claro es invertido, y me confundi.

Me da como resultado 552, muy raro que te falle, donde precisamente? tracealo.

Es de 64 bits el S.O.?

Un saludo.


Título: Re: explicacion loop
Publicado por: someRandomCode en 10 Septiembre 2015, 15:56 pm
El mio sisi, pero no deberia dar SIGSEGV..

EDITO: en endloop() es  donde tengo la violacion de segmento


Título: Re: explicacion loop
Publicado por: xv0 en 11 Septiembre 2015, 00:30 am
No podrás escribir, en la sección bss. Igualmente no hace falta utilizarla.

Un saludo.


Título: Re: explicacion loop
Publicado por: someRandomCode en 11 Septiembre 2015, 02:58 am
Tenes razon, se me paso :P
Pero el resultado no deberia dar 40, da al final los 5XX?


Título: Re: explicacion loop
Publicado por: xv0 en 11 Septiembre 2015, 14:47 pm
Si deve de dar los 552, compruebalo.

Un saludo.


Título: Re: explicacion loop
Publicado por: omar_cdg en 15 Septiembre 2015, 04:12 am
Hola, perdon por la tardanza. Te explico. uso linux, ubuntu 14.04.
estoy usando la siguiente version

A-32 (i386)
(sintaxis AT&T)

si bien mi maquina soporta 64 bits, por alguna razon estoy usando un SO de 32
igualmente mi procesador en un intel
 compilo con gcc que es el compilador por defecto que trae ubuntu, no sé si te sirve de algo estos datos.
soy nuevo en ensamblador.
gracias por preocuparte



chicos agradezco muchisimo su aporte... uds, probaron el código?? qué resulado obtuvieron
les doy los pasos que sigo para compilar y ejecutar

gcc -g -o nombre_archivo nombre_archivo.s

./nombre_archivo

echo $?

40

eso el lo que hago y esa es la salida



Título: Re: explicacion loop
Publicado por: xv0 en 17 Septiembre 2015, 01:31 am
Si lo compruebo a traves de echo y esa variable tabien obtengo 40, pero si lo traceo tengo el resultado correcto, tienes strace? Si es asi compruebalo.

Un saludo.


Título: Re: explicacion loop
Publicado por: T. Collins en 17 Septiembre 2015, 03:51 am
552 % 256 = 40