Test Foro de elhacker.net SMF 2.1

Programación => Programación General => 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 (asm) [Seleccionar]

.data
i: .long 24
n: .long 32

.bss
.comm r,4,4

.text
.global main
main:
movl i, %eax
movl $1, %ecx
loop:                 
      cmpl n, %ecx     
      jg endloop   
      addl %ecx, %eax
      incl %ecx
      jmp loop
endloop:
        movl %eax, r

#linux exit
movl $0, %ebx
movl r, %ebx
movl $1, %eax
int $0x80
Título: Re: explicacion loop
Publicado por: someRandomCode en 9 Septiembre 2015, 02:21 AM
Código (asm) [Seleccionar]

main:
movl i, %eax # cargar 24 long a eax
movl $1, %ecx # cargar 1 en el valor de ecx
loop:                 
      cmpl n, %ecx      #comparar n el valor de ecx con n
      jg endloop          # si es mas grande, saltar a endloop
      addl %ecx, %eax # si no es mas grande, sumarle al contenido de eax, el contenido de ecx
      incl %ecx           # incrementar el valor de ecx
      jmp loop            # saltar a loop
endloop:
        movl %eax, r    # cargar  en r el valor de eax

#linux exit ----> aca hace la interrupcion para sacarlo por pantalla
movl $0, %ebx         # cargar el valor 0 en ebx
movl r, %ebx            # cargar el valor de r en ebx
movl $1, %eax          # cargar el valor de 1 en eax
int $0x80                 # interrupcion para sacar por pantalla


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: cpu2 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.

Cita de: 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

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: cpu2 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: cpu2 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: cpu2 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: cpu2 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