SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado por: su - en Domingo 4 de Septiembre de 2005, 23:15
-
Hey, Hey, Solocodige@s!
me pregunto, de que depende un programa compilado (de ASM) para correr en una maquina.
libc.so.6, ld...?
-
Hey, Hey, Solocodige@s!
me pregunto, de que depende un programa compilado (de ASM) para correr en una maquina.
libc.so.6, ld...?
Si el programa es para un Sistema Operativo en concreto y este tiene un formato de ejecutable el programa debera seguirlo, teniendo sus respectivas cabeceras.
Desde ese momento el programa no depende de nadie, un programa puede ser tan corto como una instruccion ret. En Linux concretamente ld es un enlazador que generara un archivo ejecutable con el formato requerido (elf comunmente) partiendo del codigo objeto. En este S.O. es posible interactuar directament a base de interrupciones por lo tanto la libc tampoco es indispensable.
Lo mismo pasaria en Windows, aunque sus servicios no estan definidos estaticamente y varian version a version. De cualquier manera el ejemplo del ret sigue siendo valido.
Si el programa es para MS-DOS los ejecutables tipo COM no tienen ningun tipo de cabecera, son el codigo simplemente con lo cual no necesitan ni dependen absolutamente de nada. Incluso pueden no usar los servicios de MS-DOS sino de la BIOS directamente.
Por cierto el termino correcto es ensamblar y no compilar. Ese es mas o menos un panorama, si tenes alguna duda mas concreta tal vez te pueda responder mejor :devil: :comp: :ph34r:
-
:o Je-Ni-Al!
Gracias, esta :good:
Lo siento por lo de compilar, tienes razon es ensamblar.
Bueno, entonses es pocible ensamblar un programa en x OS y correrlo en otro OS totalmente diferente?
Tiene que ser directo al BIOS?
Ha, si, los codigos ensamblados son mas pequeños que los de c, c++, cobolt...?
Grasias una vez mas.
:hola:
-
:o Je-Ni-Al!
Gracias, esta :good:
Lo siento por lo de compilar, tienes razon es ensamblar.
Bueno, entonses es pocible ensamblar un programa en x OS y correrlo en otro OS totalmente diferente?
Tiene que ser directo al BIOS?
Ha, si, los codigos ensamblados son mas pequeños que los de c, c++, cobolt...?
Grasias una vez mas.
:hola:
En la practica no es posible porque, como te comentaba antes, los Sistemas Operativos suelen tener un formato de ejecutable propio. Sin tener en cuenta que la BIOS solo es accesible directamente en S.O. de 16 bits (MS-DOS) y no en S.O. de 32 bits como Windows o Linux.
Por lo tanto no es posible hacer siquiera un programa que solo haga ret ya que no es reconocido como un ejecutable por los dos S.O. al mismo tiempo.
Si lo podrias hacer para CP/M y MS-DOS (el segundo esta MUY basado en el primero) con un ejecutable COM que justamente no tiene cabecera.
Olvidandonos del formato que seria solo un problema del binario y no del codigo el verdadero inconveniente es la interfaz de los servicios que hace imposible portar un programa hecho en assembly de un S.O. a otro.
En general al carecer de libreria de run time (rutinas de IO, cadenas, etc) el programa de assembly suele ser mas chico por menos codigo. El tamaño de las rutinas existentes en ambos binarios ya depende de la calidad del programador vs la calidad del compilador :devil:
-
:o Je-Ni-Al!
Gracias, esta :good:
Lo siento por lo de compilar, tienes razon es ensamblar.
Bueno, entonses es pocible ensamblar un programa en x OS y correrlo en otro OS totalmente diferente?
Tiene que ser directo al BIOS?
Ha, si, los codigos ensamblados son mas pequeños que los de c, c++, cobolt...?
Grasias una vez mas.
:hola:
Bueno, entonses es pocible ensamblar un programa en x OS y correrlo en otro OS totalmente diferente?
Ademas debes tener en cuenta que no solo se depende del sistema operativo,
puedes crear u programa en assembler que solo funcione en algunos tipos de pentium 4 y en otros no...
adicionalmente maquinas con arquitetura diferente tampoco correrian tu programa, por ejemplo una maquina que use procesadores RISC generalmente no ejecutaria un programa hecho para un 8086... esto tambien implica que hay sistemas operativos que solo corren en un tipo determinado de maquina como ( por el momento) los Apple.
Programar en assembler siempre produce código mucho mas rápido, como lo dice eternal depende en gran parte del programador, pero tienes desventajas en ese sentido ya que el código muchas veces nisiquiera es portable de una maquina a otra aunque sean de la misma familia, cosa que con un lenguaje de mas alto nivel no sucede pues el compilador o la maquina virtual o como se llame en punto net el JIT del MSIL o lo que sea... se encarga de producir código de alta calidad de acuerdo a las caracteristicas propias de la maquina y/o del sistema operativo.
En este punto creo que se podria decir que el asm mas 'portable' hoy en dia seria el bytecode que se ejecuta para la maquina virtual de java.. pero tambien resulta ser falso ya que mauina virtual es una sola aunque este instalada en maquinas diferentes :huh:
-
Ademas debes tener en cuenta que no solo se depende del sistema operativo,
puedes crear u programa en assembler que solo funcione en algunos tipos de pentium 4 y en otros no...
adicionalmente maquinas con arquitetura diferente tampoco correrian tu programa, por ejemplo una maquina que use procesadores RISC generalmente no ejecutaria un programa hecho para un 8086... esto tambien implica que hay sistemas operativos que solo corren en un tipo determinado de maquina como ( por el momento) los Apple.
Sin lugar a dudas un apunte correcto, practicamente cada arquitectura tiene sus instrucciones y codigo binario propio.
Programar en assembler siempre produce código mucho mas rápido, como lo dice eternal depende en gran parte del programador, pero tienes desventajas en ese sentido ya que el código muchas veces nisiquiera es portable de una maquina a otra aunque sean de la misma familia, cosa que con un lenguaje de mas alto nivel no sucede pues el compilador o la maquina virtual o como se llame en punto net el JIT del MSIL o lo que sea... se encarga de producir código de alta calidad de acuerdo a las caracteristicas propias de la maquina y/o del sistema operativo.
En este punto creo que se podria decir que el asm mas 'portable' hoy en dia seria el bytecode que se ejecuta para la maquina virtual de java.. pero tambien resulta ser falso ya que mauina virtual es una sola aunque este instalada en maquinas diferentes :huh:
Yo no dije eso en ningun momento, no hable sobre la velocidad del codigo. En ese aspecto es incluso mucho mas dificil ganarle al compilador y se necesitan muchos mas conocimientos. No es lo mismo optimizar para tamaño que optimizar para velocidad.
Y si, .NET y Java son muy portables, mientras esten sus respectivos 'ayudantes' instalados :devil:
PD. El lenguaje es assembly, assembler es el programa que ensambla.
-
PD. El lenguaje es assembly, assembler es el programa que ensambla
:blink:
y en español?
-
PD. El lenguaje es assembly, assembler es el programa que ensambla
:blink:
y en español?
Es ensamblador en ambos casos y al no existir esa distincion es que se produce con regularidad el equivoco en Ingles.
-
Grachie, ¿mejor documentacion es deifcil no?
Gracias una vez mas.
:think:
-
Grachie, ¿mejor documentacion es deifcil no?
Gracias una vez mas.
:think:
De nadas, ¿mejor documentacion?