夜の抜ける

A blog about anything and everything :P.

Archive for April 2009

Hola Mundo

without comments

Lamentablemente el concurso de hola mundos de CLD no le hizo justicia a mi versión, así que decidí mejorarla :).

hola-mundo.c:

#include <stdio.h>
#include <stdint.h>

int main()
{
        uint64_t w = 0x29e4755a00b1e8;
        for (int t = w >> 062; t--; w >>= 5)
                putchar((w & 037) + 0100 >> !(w & 037));
        putchar(w);
        return 0;
}

Para compilar: c99 hola-mundo.c -o hola-mundo

Written by Ismael Luceno

2009-04-22 at 14:00

Posted in Uncategorized

¿Cuál es la diferencia entre un archivo .com y un archivo .exe?

with 2 comments

Esta es una pregunta que me hicieron alrededor de Septiembre del 2008, bastante interesante ya que el chico era un recién iniciado. A continuación va una explicación un poco más extendida de la que di en su momento:

Los ejecutables .com son un formato muy simple, lo único que contienen es el código máquina a ser ejecutado, y están limitados a 64KB, tamaño de un segmento en modo real y modo virtual de x86.

Por otra parte, los .exe, poseen una cabecera, en este caso voy a explicar solo el formato MZ (uno de los tantos formatos en los que pueden encontrarse un .exe), que es el que se usa en DOS. Esta cabecera especifica unos cuantos parámetros, entre ellos uno bastante interesante, el punto de entrada, que indica desde donde se tiene que comenzar a ejecutar el programa, además los ejecutables MZ pueden estar divididos en secciones (aunque no necesariamente), lo que permite tener separadas las áreas de datos, la pila, y el código ejecutable, y debido a que permite varias secciones (limitadas al igual que los .com a 64KB, o sea un segmento) permite ejecutables mayores a 64K.

El formato es bastante simple, aquí les dejo una tabla:


Offset Cosa
------- -----
0000 Número mágico, permite identificar el formato. 1
0002 Tamaño del último bloque, en este caso 0 equivale a 512. 2
0004 Número de bloques que son parte del ejecutable. 2
0006 Número de entradas de reubicación al final de la cabecera. 3
0008 Tamaño de la cabecera en parrafos 4
000A Memoria adicional necesaria, en parrafos 5
000C Numero máximo de parrafos adicionales reservados. 6
000E Valor relativo de la pila. 7
0010 Valor inicial del registro SP.
0012 Checksum 8
0014 Valor inicial del registro IP.
0016 Valor inicial del registro CS, relativo al segmento donde fue cargado el ejecutable.
0018 Offset del primer ítem reubicable en el archivo.
001A Número de overlay9, normalmente 0, indicando que es el ejecutable principal.
001C Fin de la cabecera fija, comienzo de los datos y el programa.

Los valores multi-byte están en formato little-endian.

Aclaraciones:

  1. Puede ser 0×5A4D (MZ) o 0×4D5A (ZM), siendo más común la primera.
  2. El tamaño de un bloque es de 512 bytes.
  3. Puede ser 0.
  4. En x86, una palabra o word equivale a 2 bytes, mientras que un
    parrafo equivale a 8 palabras, es decir 16 bytes.
  5. Memoria no inicializada, equivale a la sección BSS en un programa para sistemas tipo UNIX.
  6. Permite limitar la cantidad de memoria extra que el sistema reserva al programa, de ser 0 se reserva toda la memoria
    convencional disponible
  7. Este valor es agregado al segmento en el cual fue guardado el programa, y con el resultado se inicializa el registro SS
  8. En realidad esto es un complementdo del checksum que se calcula de a 16bits en todo el archivo, de modo que el resultado sea cero.
  9. En algún otro artículo explicaré lo que es un overlay

Sobre la reubicación:

A diferencia de los ejecutables .com, un MZ puede ser cargado en cualquier posición de memoria, claro que, dado que en x86 la mayor parte de las instrucciones no permiten una referencia relativa, se usa la tabla de entradas de reubicación en la cabecera para editar el código del ejecutable, ajustando cada referencia a la posición en la que ha sido cargado, sumando la diferencia entre la posición preferida y la posición en la que fue cargado el ejecutable.

Un detalle no menor es que los segmentos siempre van alineados a un parrafo. Luego explicaré esto en más detalle cuando explique el direccionamiento en modo real de x86.

Written by Ismael Luceno

2009-04-12 at 11:33

Posted in Uncategorized

Una función típica de GTK

without comments

Una  función en gtk

Written by Ismael Luceno

2009-04-05 at 08:12

Posted in Humor

Tagged with