Aunque a muchos os suene a chino eso del Ensamblador, si queréis entender el lenguage maquina.
Os debería de ser algo familiar.

Aquí solo os definiré la función de los registros, el IP y las banderas(flags).

Direccionamiento de Memoria:

Dependiendo del modelo, el procesador puede accesar uno o mas bytes de memoria a la vez.
Consideremos el numero decimal 1025. La representación hexadecimal del mismo es 0401H, requiere de dos bytes (WORD) de memoria.
Consta de un byte de orden alto (más significativo), 04, y un byte de orden bajo ( menos significativo), 01.

El sistema almacena en memoria estos bytes en secuencia inversa de bytes.

registro
04
01
memoria
01
04

El procesador espera que los datos numéricos en la memoria estén en secuencia inversa de bytes y los
procesa de acuerdo con esto. Cuando el procesador recupera la palabra de la memoria, otra vez invierte
los bytes,  restableciéndolos de manera correcta en el registro como 0401H.
Por lo que es importante que tengáis en cuenta esto a la hora de modificar datos en los ejecutables.


Registros
Son catorce, todos de 16 bits (una palabra).

  • Cuatro registros de datos o de almacenamiento temporal. AX= Acumulador. Es el registro principal utilizado en las instrucciones aritméticas. BX= Base. Se usa para indicar un desplazamiento (offset). CX= Contador. Se utiliza como contador en los bucles y en las operaciones de tipo repetitivo. DX= Dato. Se usa tambien en operaciones aritmeticas. Es posible referirse al byte superior (más significativo) XH, o al byte inferior (menos significativo) XL.
  • Cuatro registros de Segmentos. CS= Registro de segmento de código (code segment). Contiene la dirección del segmento de código, es decir las instrucciones del programa. DS= Registro de segmento de datos (data segment). Contiene la dirección del segmento de datos, es decir, el área de memoria donde se encuentran los datos del programa. SS= Registro de segmento de pila (stack segment). Contiene la dirección del segmento de pila. La pila es un espacio de memoria temporal que se utiliza para almacenar valores de 16 bits (palabras). ES= Registro de segmento extra (extra segment). Contiene la dirección del segmento extra, que es un segmento de datos adicional que se utiliza para superar la limitación de los 64 Kb del segmento de datos y para hacer transferencia de datos entre segmentos.
  • Dos registros punteros de la pila. SP (stack Pointer) - Puntero de la pila. Contiene la dirección relativa al segmento de la pila. BP (Base Pointer) - Puntero Base. Se utiliza para fijar el puntero de la pila y así poder acceder a los elementos de la pila.
  • Dos registros indices. Se utilizan como desplazamiento relativo a un campo de datos. SI (Source Index) - Indice fuente. DI (Destination Index) -Indice destino.
  • Un registro puntero de instrucciones. IP (Instuction Pointer). Puntero de instrucciones.
  • Nueve registros de vanderas (flags). OF (overflow, desvordamiento).
    Indica desbordamiento de un bit de orden alto (mas a la izquierda) despues de una operación aritmética.

    DF (dirección). Designa la dirección hacia la izquierda o derecha para mover o comparar cadenas de caracteres.

    IF (interrupción).
    Indica que una interrupción externa, como la entrada desde el teclado, sea procesada o ignorada.

    TF (trampa).
    Permite la operación del procesador en modo de un paso. (DEBUG).

    SF (signo).
    Contiene el signo resultante de una operación aritmetica (0 = positivo y 1 = negativo).

    ZF (cero).
    Indica el resultado de una operación aritmetica (0 = diferente de cero y 1 = igual a cero).
  •  

    Codificación.

    Aunque parezca un concesionario de la Citroen tanto AX, BX.
    Me fue muy útil saber como se codificaban en código máquina mis
    propias instrucciones, para poder parchear con elegancia los ejecutables.

    FORMATO GENERAL DE UNA INSTRUCCIÓN
    código w
    mod reg r/m
    des
    val

    El código de la operación aparece en el primer byte. Es el único que existe siempre.
    Los demás campos pueden aparecer o no, dependiendo del tipo de instrucción.
    Los operandos de la instrucción se reflejan en el byte "mod reg r/m".
    Un operando se especifica mediante "mod" y "r/m". El operando puede ser un registro o una dirección
    de memoria.
    El otro operando se especifica mediante"reg". El operando debe ser un registro.
    El campo "des" es el componente desplazamiento de una dirección de memoria. Puede ser uno o dos bytes.
    Si ocupa dos bytes, el byte menos significativo se almacena primero.
    El campo "val" es un valor inmediato. Puede ocupar uno o dos bytes.
    Como en el caso anterior, si ocupa dos bytes, el byte menos significativo se almacena primero.
    Los campos que aparecen en la codificación de una instrucción ensamblador son:
    
            w = bit que indica la longitud de los operandos. Aparece dentro del byte de código.
    
                   0 - byte.
                   1 - palabra.
    
            d = un bit que indica el destino.  Aparece también dentro del byte de código.
    
                   0 - el operando destino se especifica mediante los campos "mod" y "r/m".
                   1 - el operando destino se especifica mediante el campo "reg".
    
            reg = dos o tres bits que indican el tipo de registro que se va a utilizar como operando.
            
    reg
    w = 0
    w = 1
    000
    AL
    AX/EAX
    001
    CL
    CX/ECX
    010
    DL
    DX/EDX
    011
    BL
    BX/EDX
    100
    AH
    SP
    101
    CH
    BP
    110
    DH
    SI
    111
    BH
    DI
    reg
    registro de segmento
    000
    ES
    001
    CS
    010
    SS
    011
    DS
    r/m = tres bits que indican el tipo de direccionamiento del operando
    r/m
    registro base
    registro índice
    000
    BX
    SI
    001
    BX
    DI
    010
    BP
    SI
    011
    BP
    DI
    100
    ninguno
    SI
    101
    ninguno
    DI
    110
    BP
    ninguno (*)
    111
    BX
    ninguno
    (*) Si mod=00, entonces la instucción contiene el desplazamiento en dos bytes adicionales. mod = dos bits que indican el tipo de desplazamiento.
    mod
    desplazamiento
    00
    ninguno
    01
    8 bits en el byte siguiente
    10
    16 bits en los dos bytes siguientes
    11
    indica que r/m es un registro
    Un ejemplo de codificación: mov ax, 215h Codificación de mov: 1011w reg | val w = 1 es una palabra. reg = 000, se trata del registro ax val = valor inmediato, que se almacena como 1502(hexadecimal)= 0001 0101 0000 0010 El resultaldo juntandolo todo es:
    1011
    1000
    0001
    0101
    0000
    0010
    B
    8
    1
    5
    0
    2
    mov ax, 215h = B8 15 02 mov eax, 0215h = B8 15 02 00 00 en 32 bits.


    Continuara......

    Ensamblador
    Mochilas
    El IDA
    Crypkey
    TimeZero
    Codificación
    Instrucciones
    Proyecto©Julito 2003. Todo este material puede ser copiado o lo que se os ponga de las narices hacer con ello.