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
.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
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
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
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
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
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
@omar_cdgRevisa 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.
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
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.
El mio sisi, pero no deberia dar SIGSEGV..
EDITO: en endloop() es donde tengo la violacion de segmento
No podrás escribir, en la sección bss. Igualmente no hace falta utilizarla.
Un saludo.
Tenes razon, se me paso :P
Pero el resultado no deberia dar 40, da al final los 5XX?
Si deve de dar los 552, compruebalo.
Un saludo.
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
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.
552 % 256 = 40