Que cosa mas rara

Iniciado por lapras, 2 Noviembre 2009, 23:19 PM

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

lapras

que alguien compile y pruve este codigo ensamblador en linux.
yo de verdad no entiendo nada, pero cada vez esto me atrae mas:



.text  

       .globl main  

main:

       movl    $1, %edx
addl     $1, %edx

movl    $1, %ebx      
       movl    $4, %eax        
       int     $0x80          

movl $msg, %edx
movl    $1, %ebx        
       movl    $4, %eax      
       int     $0x80        




       movl    $0, %ebx      
       movl    $1, %eax      
       int     $0x80          

.data
msg:
.string "\n"

Eternal Idol

A grosso modo en Linux se pone en eax el numero del servicio y los siguientes parametros van en ebx, ecx, edx, esi, edi y ebp.

En /usr/include/asm/ unistd.h/unistd_32.h/unistd_64.h encontraras los numeros de los servicios.

1 es __NR_exit y el 0 que se le pasa como parametro en ebx es el valor de retorno del programa (http://linux.die.net/man/2/exit).

4 es __NR_write y el 1 que le pasas como primer parametro en ebx es STDOUT (salida por consola), el segundo parametro (ecx) deberia ser el puntero a la cadena y el tercer parametro (edx) el tamaño de la cadena.

http://linux.die.net/man/2/write


Un ejemplo funcional:
Código (asm) [Seleccionar]
movl $6, %edx
movl $msg, %ecx
movl    $1, %ebx        
movl    $4, %eax      
int     $0x80

;;resto del codigo
.data
msg:
.string "DAAAA\n"
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

lapras

lo de edx seria la longitud de la cadena no? vale creo que ya lo pillo.
por cierto has provado a compilarlo? es algo bastante raro

Eternal Idol

Si, edx es el tercer parametro es decir: size_t count.

Si, lo ensamble y enlace (con as y ld) pero no hace nada, no funciona tal como esta, si pones lo que te dije si escribira eso en la consola.


La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

lapras

a mi me salian un monton de caracteres raros.
mira como me ha quedado al final:


.text   
        .globl main   

main:

        movl    $1, %ecx
addl     $1, %ecx

movl $1, %edx
movl    $1, %ebx       
        movl    $4, %eax       
        int     $0x80         

movl $1, %edx
movl  $msg, %ecx
movl    $1, %ebx       
        movl    $4, %eax       
        int     $0x80         




      movl    $0, %ebx       
      movl    $1, %eax       
       int     $0x80           

.data
msg:
.string "\n"


El problema es que ahora lo ejecuto y me sale una sola linea en blanco y no sale un 2.

Graciassss

Eternal Idol

#5
En el primer codigo eso depende del contenido de ecx ... a lo que apunte y lo que haya en esa direccion.

El segundo parametro de write es un puntero asi que lo primero que le pasas es un puntero erroneo (ecx=2). En el segundo caso le pasas un puntero a una cadena que contiene un solo caracter, \n, es decir un salto de linea, si queres ver algo de texto usa una cadena como la que puse antes ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

lapras

y como hago para que me imprima el resultado de la suma?

Eternal Idol

Transformandolo a cadena, cada digito del numero en cuestion debe ser transformado a caracter (no olvides el cero terminador de cadena). Otra opcion es usar la libc (printf/sprintf por ejemplo).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

lapras

#8
como hago para pasarlo a cadena

Eternal Idol

Sino usas funciones existentes en la g/libc entonces tenes que aplicar la misma logica que en cualquier otro lenguaje de programacion. Tomas el numero y usando divisiones y restos averiguas todos sus digitos, a cada uno de ellos le sumas 48 (es decir '0') para transformarlo en un caracter.

Ejemplo simple:

253= 253 / 10 = 25
        253 % 10 = 3 + 48 = 51 = '3'
        25 / 10 = 2
        25 % 10 = 5 + 48 = 53 = '5'
        2 + 48 = 50 = '2'
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón