explicacion loop

Iniciado por omar_cdg, 9 Septiembre 2015, 02:03 AM

0 Miembros y 1 Visitante están viendo este tema.

omar_cdg

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

someRandomCode

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



omar_cdg

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


someRandomCode

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

omar_cdg

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

someRandomCode

#5
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

cpu2

#6
@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.

someRandomCode

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

cpu2

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.

someRandomCode

#9
El mio sisi, pero no deberia dar SIGSEGV..

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