viernes, 19 de abril de 2013

Sistemas Numéricos

Los sistemas de numeración son conjuntos de dígitos usados para representar cantidades, así se tienen los sistemas de numeración decimal, binario, octal, hexadecimal, romano, etc. Los cuatro primeros se caracterizan por tener una base (número de dígitos diferentes: diez, dos, ocho, dieciseis respectivamente) mientras que el sistema romano no posee base y resulta más complicado su manejo tanto con números, así como en las operaciones básicas.

Sistema Binario

1893 El sistema de numeración más simple que usa la notación posicional es el sistema de numeración binario. Este sistema, como su nombre lo indica, usa solamente dos dígitos (0,1). Por su simplicidad y por poseer únicamente dos dígitos diferentes, el sistema de numeración binario se usa en computación para el manejo de datos e información. Normalmente al dígito cero se le asocia con cero voltios, apagado, desenergizado, inhibido (de la computadora) y el dígito 1 se asocia con +5, +12 volts, encendido, energizado (de la computadora) con el cual se forma la lógica positiva. Si la asociación es inversa, o sea el número cero se asocia con +5 volts o encendido y al número 1 se asocia con cero volts o apagado, entonces se genera la lógica negativa.
En un sentido estricto, cada número binario contiene una cantidad infinita de dígitos, también llamados bits que es una abreviatura de binary digits, por ejemplo, podemos representar el número siete de las siguientes formas: 111 00000111 000000000000111

Sistema Octal

El sistema de numeración octal es también muy usado en la computación por tener una base que es potencia exacta de 2 o de la numeración binaria. Esta característica hace que la conversión a binario o viceversa sea bastante simple. El sistema octal usa 8 dígitos (0,1,2,3,4,5,6,7) y tienen el mismo valor que en el sistema de numeración decimal. Como el sistema de numeración octal usa la notación posicional entonces para el número 3452.32q tenemos:
2*(80) + 5*(81) + 4*(82) + 3*(83) + 3*(8-1) + 2*(8-2) = 2 + 40 + 4*64 + 64 + 3*512 + 3*0.125 + 2*0.015625 = 2 + 40 + 256 + 1536 + 0.375 + 0.03125 = 1834 + 40625dentonces, 3452.32q = 1834.40625d El subindice q indica número octal, se usa la letra q para evitar confusión entre la letra o y el número 0.



El sistema numérico decimal

El sistema de numeración decimal es el más usado, tiene como base el número 10, o sea que posee 10 dígitos (o simbolos) diferentes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). El sistema de numeración decimal fué desarrollado por los hindúes, posteriormente lo introducen los árabes en Europa, donde recibe el nombre de sistema de numeración decimal o arábigo. Si se aplica la notación posicional al sistema de numeración decimal entonces el dígito número n tiene el valor: (10n)* A
Este valor es positivo y es mayor o igual que uno si el dígito se localiza a la izquierda del punto decimal y depende del dígito A, en cambio el valor es menor que uno si el dígito se localiza a la derecha del punto decimal.

Conversión entre bases numericas : 
Conversión entre números decimales y binarios

Convertir un número decimal al sistema binario es muy sencillo: basta con realizar divisiones sucesivas por 2 y escribir los restos obtenidos en cada división en orden inverso al que han sido obtenidos.

Por ejemplo, para convertir al sistema binario el númeroharemos una serie de divisiones que arrojarán los restos siguientes:

77 : 2 = 38 Resto: 1
38 : 2 = 19 Resto: 0
19 : 2 = 9 Resto: 1
9 : 2 = 4 Resto: 1
4 : 2 = 2 Resto: 0
2 : 2 = 1 Resto: 0
1 : 2 = 0 Resto: 1

y, tomando los restos en orden inverso obtenemos la cifra binaria:

Conversión de binario a decimal

El proceso para convertir un número del sistema binario al decimal es aún más sencillo; basta con desarrollar el número, teniendo en cuenta el valor de cada dígito en su posición, que es el de una potencia de 2, cuyo exponente es 0 en el bit situado más a la derecha, y se incrementa en una unidad según vamos avanzando posiciones hacia la izquierda.

Por ejemplo, para convertir el número binario 10100112 a decimal, lo desarrollamos teniendo en cuenta el valor de cada bit:

Conversión de un número decimal a octal

La conversión de un número decimal a octal se hace con la misma técnica que ya hemos utilizado en la conversión a binario, mediante divisiones sucesivas por 8 y colocando los restos obtenidos en orden inverso. Por ejemplo, para escribir en octal el número decimal tendremos que hacer las siguientes divisiones:

122 : 8 = 15 Resto: 2
15 : 8 = 1 Resto: 7
1 : 8 = 0 Resto: 1

Tomando los restos obtenidos en orden inverso tendremos la cifra octal:

Conversión octal a decimal

La conversión de un número octal a decimal es igualmente sencilla, conociendo el peso de cada posición en una cifra octal. Por ejemplo, para convertir el númeroa decimal basta con desarrollar el valor de cada dígito:


Representación de datos



Para entender la manera en que las computadoras procesan datos, es importante conocer cómo la computadora representa los datos. Las personas se comunican a través del habla combinando palabras en oraciones. El habla humana es análoga porque utiliza señales continuas que varían en fortaleza y calidad. Las computadoras son digitales, pues reconocen solo dos estados: encendido (on) y apagado (off). Esto es así porque las computadoras son equipos electrónicos que utilizan electricidad, que también tiene solo dos estados: on y off. Los dos dígitos 0 y 1 pueden fácilmente representar estos dos estados. El dígito cero representa el estado electrónico apagado (la ausencia de carga electrónica). El dígito uno representa el estado electrónico encendido (presencia de carga electrónica).




El sistema binario es un sistema numérico que tiene tan solo dos dígitos, 0 y 1, llamados bits. Un bit (binary digit) es la unidad de datos más pequeña que la computadora puede representar. Por sí solo, un bit no es muy informativo. Cuando ocho bits se agrupan como una unidad, forman un byte. El byte es informativo porque provee suficientes combinaciones diferentes de 0 y 1 para representar 256 caracteres individuales. Esos caracteres incluyen números, letras mayúsculas y minúsculas, signos de puntuación y otros.



Las combinaciones de 0 y 1 que representan caracteres son definidas por patrones llamados esquemas de códigos (coding scheme). Esquemas de códigos populares son:


1. ASCII – American Standard Code for Information Interchange – es el sistema de código para representar datos que más se utiliza. La mayoría de las computadoras personales y servidores mid-range utilizan el esquema de código ASCII.


2. EBCDIC – Extended Binary Coded Decimal Interchange Code – es utilizado principalmente en computadoras mainframe.


3. Unicode – es el único esquema de código capaz de representar todos los lenguajes del mundo actual. Se desarrolló precisamente porque el ASCII y el EBCDIC no eran suficientes para representar lenguajes para alfabetos diferentes al inglés o Europeo, como los asiáticos y otros.

REPRESENTACIÓN DE NUMEROS NEGATIVOS

Normalmente utilizamos el símbolo “-” precediendo a un número para indicar qué este


es menor que cero. Esta es una notación muy práctica en la vida cotidiana pero no puede ser


utilizada en la representación que se hace de los números en una computadora, recordemos


que sólo se pueden utilizar los dígitos binarios para representar cualquier cosa en ellas y el


“-” no es ningún bit.


Pero podemos utilizar la misma idea, preceder el número de un bit que indique su signo,


después de todo sólo hay dos posibles signos, a saber: “+”y “-”. Todo lo que tenemos que


hacer es asignar arbitrariamente un bit a cada signo. Convencionalmente se hace: “+” =


0, “-” = 1.


A este método de representación de números negativos se le denomina



signo y magnitud

porque, análogamente a lo que solemos hacer, se coloca un símbolo que precede al número y

que indica su signo y luego se pone la magnitud del número. En esta notación por ejemplo:


1 010102 = 1010

FUNCIONAMIENTO DE UN MICROPROCESADOR

El microprocesador es un circuito electrónico que actúa como Unidad Central de Proceso de un ordenador, proporcionando el control de las operaciones de cálculo. Se identifica rápido en una tarjeta madre porque esta acoplado a la misma en un socket, tiene forma cuadrada con un pequeño ventilador arriba y generan mucho calor.
Desde el punto de vista lógico, singular y funcional, el microprocesador está compuesto básicamente por: varios registros, una unidad de control, una unidad aritmético-lógica, y dependiendo del procesador, puede contener una unidad en coma flotante.

Estructura y funcionamiento:

El microprocesador ejecuta instrucciones almacenadas como números binarios organizados secuencialmente en la memoria principal. La ejecución de las instrucciones se puede realizar en varias fases. Cada una de estas fases se realiza en uno o varios ciclos de CPU, dependiendo de la estructura del procesador, y concretamente de su grado de segmentación. La duración de estos ciclos viene determinada por la frecuencia de reloj, y nunca podrá ser inferior al tiempo requerido para realizar la tarea individual.
cpu.png

En un microprocesador podemos diferenciar diversas partes:
§ Puerto de E/S
§ Memoria cache
§ Coprocesador matemático
§ Registros
§ Memoria
§ Puertos

Arquitectura de un procesador


El procesador se compone de un grupo de unidades interrelacionadas (o unidades de control). Aunque la arquitectura del microprocesador varía considerablemente de un diseño a otro, los elementos principales del microprocesador son los siguientes:

unidad de control: que vincula la información entrante para luego decodificarla y enviarla a la unidad de ejecución:La unidad de control se compone de los siguientes elementos:

Secuenciador (o unidad lógica y de supervisión ), que sincroniza la ejecución de la instrucción con la velocidad de reloj. También envía señales de control:
Contador ordinal, que contiene la dirección de la instrucción que se está ejecutando actualmente;
Registro de instrucción, que contiene la instrucción siguiente.
Unidad de ejecución (o unidad de procesamiento), que cumple las tareas que le asigna la unidad de instrucción. La unidad de ejecución se compone de los siguientes elementos:
La unidad aritmética lógica (se escribe ALU); sirve para la ejecución de cálculos aritméticos básicos y funciones lógicas (Y, O, O EXCLUSIVO, etc.);
La unidad de punto flotante (se escribe FPU), que ejecuta cálculos complejos parciales que la unidad aritmética lógica no puede realizar;

Instrucciones de acumuladores y memoria

Las instrucciones de esta grupo suelen tener dos operandos: uno es un acumulador o registro índice y el otro es una posición de memoria. Se dividen en 6 subgrupos:

Movimiento de datos (Cargas, almacenamientos y transferencias)

En esta están la carga de datos en acumuladores y memoria, las de almacenamiento en la pila y las de intercambio de registros.  

Operaciones aritméticas

Están disponibles operaciones aritméticas para operandos de 8 y 16 bits, tanto en binario sin signo como en complemento a 2 (con signo). Se pueden realizar fácilmente operaciones en múltiple precisión. Operaciones en BCD se consiguen ejecutando la instrucción DAA tras instrucción aritmética normal. Las comparaciones consisten en realizar internamente la substracción para modificar CCR pero no el operando destino

Multiplicación y división


MUL
La multiplicación opera con dos bytes en A y B dando un resultado de 16 bits en D. Tarda 10 ciclos.
IDIV
División entera: Divide en contenido de D entre X dejando el cociente en X y el resto en D. Los datos y el resultado se consideran números enteros. Tarda 41 ciclos. División por 0 pone c=1 y cociente X=$FFFF.
FDIV
División fraccional: Divide en contenido de D entre X dejando el cociente en X y el resto en D. En este caso los datos se consideran números decimales en punto fijo (en la misma posición para ambos). El resultado se considera que tiene el punto decimal a la izquierda del bit más significativo. Es necesario, por tanto, que le numerador sea menor que el denominador (D<X). En caso contrario se activa overflow (flag V del CCR). Tarda 41 ciclos.División por 0 pone c=1 y cociente X=$FFFF


Operaciones lógicas (booleanas)


Es posible la realización de y-lógica, o-lógica, o-exclusiva-lógica y no-lógica.
Direccionamiento
Función Nemónico Inm. Dir. Ext. Ind.X Ind.Y Imp
y-lógica A con memoria ANDA X X X X X
y-lógica B con memoria ANDB X X X X X
Testeo de bits de A con memoria BITA X X X X X
Testeo de bits de B con memoria BITB X X X X X
no-lógica de byte en memoria COM X X X
no-lógica de A COMA X
no-lógica de B COMB X
o-exclusiva de A con memoria EORA X X X X X
o-exclusiva de B con memoria EORB X X X X X
o-lógica de A con memoria ORAA X X X X X
o-lógica de B con memoria ORAB X X X X X


Desplazamientos y rotaciones

Todas las operaciones de rotación y desplazamiento involucran al bit a acarreo (C) del CCR, lo cual permite una fácil manipulación de datos en múltiple precisión. Poniendo el bit C a 0 o a 1 antes de la operación se controla el bit que entra por el desplazamiento. El desplazamiento aritmético a la derecha conserva el bit de signo: es posible dividir números en complemento a 2. Los desplazamientos lógicos a la izquierda (LSL) son totalmente equivalentes a los desplazamientos aritméticos a la izquierda (ASL).  

Saltos relativos

Permiten a la CPU modificar el flujo del programa el base a los banderines del CCR. Están restringidos a un rango entre -128 a +127 por usar direccionamiento relativo.  NIVELES DE MEMORIA - Registros de procesador: Estos registros interaccionan continuamente con la CPU (porque forman parte de ella). Los registros tienen un tiempo de acceso muy pequeño y una capacidad mínima, normalmente igual a la palabra del procesador (1 a 8 bytes).- Registros intermedios: Constituyen un paso intermedio entre el procesador y la memoria, tienen un tiempo de acceso muy breve y muy poca capacidad.
- Memorias caché: Son memorias de pequeña capacidad. Normalmente una pequeña fracción de la memoria principal. y pequeño tiempo de acceso. Este nivel de memoria se coloca entre la CPU y la memoria central. Hace algunos años este nivel era exclusivo de los ordenadores grandes pero actualmente todos los ordenadores lo incorporan. Dentro de la memoria caché puede haber, a su vez, dos niveles denominados caché on chip, memoria caché dentro del circuito integrado, y caché on board, memoria caché en la placa de circuito impreso pero fuera del circuito integrado, evidentemente, por razones físicas, la primera es mucho más rápida que la segunda. Existe también una técnica, denominada Arquitectura Harvard, en cierto modo contrapuesta a la idea de Von Newmann, que utiliza memorias caché separadas para código y datos. Esto tiene algunas ventajas como se verá en este capítulo.
- Memoria central o principal: En este nivel residen los programas y los datos. La CPU lee y escribe datos en él aunque con menos frecuencia que en los niveles anteriores. Tiene un tiempo de acceso relativamente rápido y gran capacidad.
- Extensiones de memoria central: Son memorias de la misma naturaleza que la memoria central que amplían su capacidad de forma modular. El tiempo de similar, a lo sumo un poco mayor, al de la memoria central y su capacidad puede ser algunas veces mayor.
- Memorias de masas o auxiliares: Son memorias que residen en dispositivos externos al ordenador, en ellas se archivan programas y datos para su uso posterior. También se usan estas memorias para apoyo de la memoria central en caso de que ésta sea insuficiente (memoria virtual). Estas memorias suelen tener gran capacidad pero pueden llegar a tener un tiempo de acceso muy lento. Dentro de ellas también se pueden establecer varios niveles de jerarquía.

BUS DEL SISTEMA
El bus se puede definir como un conjunto de líneas conductoras de hardware utilizadas para la transmisión de datos entre los componentes de un sistema informático. Un bus es en esencia una ruta compartida que conecta diferentes partes del sistema, como el microprocesador, la controladora de unidad de disco, la memoria y los puertos de entrada/salida (E/S), para permitir la transmisión de información.

En el bus se encuentran dos pistas separadas, el bus de datos y el bus de direcciones. La CPU escribe la dirección de la posición deseada de la memoria en el bus de direcciones accediendo a la memoria, teniendo cada una de las líneas carácter binario. Es decir solo pueden representar 0 o 1 y de esta manera forman conjuntamente el número de la posición dentro de la memoria (es decir: la dirección). Cuantas más líneas hayan disponibles, mayor es la dirección máxima y mayor es la memoria a la cual puede dirigirse de esta forma. En el bus de direcciones original habían ya 20 direcciones, ya que con 20 bits se puede dirigir a una memoria de 1 Mb y esto era exactamente lo que correspondía a la CPU.      




















Procesadores familia intel 





 registros de propósito general ( GPRs o General Purpose Registers) pueden guardar tanto datos como direcciones. Son fundamentales en la arquitectura de von neumann. La mayor parte de las computadoras modernas usa GPR

Modos de direccionamiento


Los llamados modos de direccionamiento son las diferentes maneras de especificar en informática un operando dentro de una instrucción. Cómo se especifican e interpretan las direcciones de memoria según las instrucciones. Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y / o constantes, contenida dentro de una instrucción de la máquina o en otra parte



transferencia de registros

Se le conoce por las siglas RTL( Register Transfer Languaje) que como su nombre indica es una forma simbolica de describir las transferencias de la informaciòn y las operaciones entre elementos de memoria 

Se pueden concebir infinitas versiones de un lenguaje RTL cuyas principales diferencias son sintacticas.


MODALIDADES DE OPERACION

El procesador soporta numerosos modos de operación para código x86, en los cuáles no todas las instrucciones están disponibles. Un sub-repertorio de instrucciones de 16-bit está disponible en “modo real” (disponible en todos los procesadores x86), “modo protegido 16-bit” (disponible desde el Intel 80286), o en el “modo v86” (disponible desde el Intel 80386). Por su parte, las instrucciones de 32-bits están disponibles para el “modo protegido 32-bit” y para el “modo heredado” (disponible con las extensiones de 64 bits). El repertorio de instrucciones parte de ideas similares en cada modo, pero da lugar a distintas formas de acceso a memoria y de este modo emplea estrategias de programación diferentes.

Los modos en los que el código x86 puede ser ejecutado son:
• Modo real (16-bit)
• Modo protegido (16-bit y 32-bit)
• Modo 8086 virtual (16-bit)
• System Management Mode (16-bit)
• Modo largo (64-bit)




MODO REAL

El modo real (también llamado modo de dirección real en los manuales de Intel) es un modo de operación del 80286 y anteriores CPUs compatibles de la arquitectura x86. El modo real está caracterizado por 20 bits de espacio de direcciones segmentado (significando que solamente se puede direccionar 1 MB de memoria), acceso directo del software a las rutinas del BIOS y el hardware periférico, y no tiene conceptos de protección de memoria o multitarea a nivel de hardware. Todos los CPUs x86 de las series del 80286 y posteriores empiezan en modo real al encenderse el computador; los CPUs 80186 y anteriores tenían solo un modo operacional, que era equivalente al modo real en chips posteriores.

La arquitectura 286 introdujo el modo protegido, permitiendo, entre otras cosas, la protección de la memoria a nivel de hardware. Sin embargo, usar estas nuevas características requirió instrucciones de software adicionales no necesarias previamente. Puesto que una especificación de diseño primaria de los microprocesadores x86 es que sean completamente compatibles hacia atrás con el software escrito para todos los chips x86 antes de ellos, el chip 286 fue hecho para iniciarse en ' modo real ' - es decir, en un modo que tenía apagadas las nuevas características de protección de memoria, de modo que pudieran correr sistemas operativos escritos para microprocesadores más viejos. Al día de hoy, incluso los más recientes CPUs x86 se inician en modo real al encenderse, y pueden correr el software escrito para cualquier chip anterior.

Los sistemas operativos DOS (MS-DOS, DR-DOS, etc.) trabajan en modo real. Las primeras versiones de Microsoft Windows, que eran esencialmente un shell de interface gráfica de usuario corriendo sobre el DOS, no eran realmente un sistema operativo por sí mismas, corrían en modo real, hasta Windows 3.0, que podía correr tanto en modo real como en modo protegido. Windows 3.0 podía correr de hecho en dos "sabores" de modo protegido - el "modo estándar", que corría usando modo protegido, y el "modo mejorado 386", que además usaba direccionamiento de 32 bits y por lo tanto no corría en un 286 (que a pesar de tener modo protegido, seguía siendo un chip de 16 bits; los registros de 32 bits fueron introducidos en la serie 80386). El Windows 3.1 removió el soporte para el modo real, y fue el primer ambiente operativo de uso masivo que requirió por lo menos un procesador 80286 (no contando con el Windows 2.0 que no fue un producto masivo). Casi todos los sistemas operativos modernos x86 (Linux, Windows 95 y posteriores, OS/2, etc.) cambian el CPU a modo protegido o a modo largo en el arranque.



MODO PROTEGIDO

El modo protegido es un modo operacional de los CPUs compatibles x86 de la serie 80286 y posteriores. El modo protegido tiene un número de nuevas características diseñadas para mejorar las multitareas y la estabilidad del sistema, como protección de memoria, y soporte de hardware para memoria virtual así como de conmutación de tareas. A veces es abreviado como p-mode y también llamado Protected Virtual Address Mode (Modo de Dirección Virtual Protegido) en el manual de referencia de programador del iAPX 286 de Intel, (Nota, iAPX 286 es solo otro nombre para el Intel 80286). En el 80386 y procesadores de 32 bits posteriores se agregó un sistema de paginación que es parte del modo protegido.

La mayoría de los sistemas operativos x86 modernos corren en modo protegido, incluyendo Linux, FreeBSD, OpenBSD, NetBSD, y Microsoft Windows 3.0 y posteriores. (Windows 3.0 también corría en el modo real para la compatibilidad con las aplicaciones de Windows 2.x).

El otro modo operacional principal del 286 y CPUs posteriores es el modo real, un modo de compatibilidad hacia atrás que desactiva las características propias del modo protegido, diseñado para permitir al software viejo correr en los chips más recientes. Como una especificación de diseño, todos los CPUs x86 comienzan en modo real en el momento de carga (boot time) para asegurar compatibilidad hacia atrás con los sistemas operativos heredados, excepto el oscuro Intel 80376 diseñado para aplicaciones empotradas. Estos procesadores deben ser cambiados a modo protegido por un programa antes de que esté disponible cualquier característica de este modo. En computadores modernos, este cambio es generalmente una de las primeras tareas realizadas por el sistema operativo en el tiempo de carga.

Mientras que la multitarea en sistemas corriendo en modo real es ciertamente posible mediada por software, las características de protección de memoria del modo protegido previenen que un programa erróneo pueda dañar la memoria "propia" de otra tarea o del núcleo del sistema operativo. El modo protegido también tiene soporte de hardware para interrumpir un programa en ejecución y cambiar el contexto de ejecución a otro, permitiendo pre-emptive multitasking. 





MODO 8086 VIRTUAL

En el microprocesador 80386 y posteriores, el modo 8086 virtual, también llamado modo real virtual o VM86, permite la ejecución de aplicaciones de modo real que violan las reglas bajo control de un sistema operativo de modo protegido.

El VM86 usaba la forma de segmentación del modo real, pero usaba la dirección resultante de 20 bits (realmente 21 bits), tratándola como una dirección lineal, de tal manera que era sujeta a paginación.

Era usado para ejecutar programas DOS en Microsoft Windows/386, Windows 3.x, Windows 95, Windows 98, Windows Me, y OS/2 2.x y más adelante, a través de las máquinas DOS virtuales, también en SCO UNIX a través de Merge, y en Linux por medio de dosemu.

Los programas de DOS de modo protegido, tanto de 16 como de 32 bits, no se ejecutan en el modo 8086 virtual, sino en modo usuario, siempre y cuando fueran compatibles con DPMI. Así que los emuladores arriba mencionados hacen de hecho más que solo el soporte para el modo 8086 virtual. 






MODO DE GERENCIA DEL SISTEMA

El Modo de Gerencia de Sistema, o System Management Mode (SMM) en inglés, es un modo de operación lanzado por primera vez con el Intel 386SL y disponible en microprocesadores posteriores de la arquitectura x86, en el que es suspendida toda la ejecución normal (incluyendo el sistema operativo), y es ejecutado un software especial separado en un modo de alto privilegio (usualmente un depurador en firmware o asistido por hardware).

Algunos usos comunes del SMM son:

• Para emular hardware de la tarjeta madre que no está implementado o tiene errores (bugs).
• Operaciones de gerencia de energía, como encendido de ventiladores.
• Para emular un ratón o un teclado PS/2 desde un USB.
• Funciones de seguridad del sistema, como apagar el computador cuando hay alta temperatura en el CPU.
• Configuración del sistema, como por ejemplo en los computadores notebook de Toshiba e IBM. 




MODO LARGO

En la arquitectura de computador AMD64 (x86-64), el modo largo (long mode) es el modo donde una aplicación o sistema operativo de 64 bits pueden acceder a las instrucciones y los registros de 64 bits del procesador, mientras que los programas de 32 bits y 16 bits se ejecutan en un sub-modo de compatibilidad.

Un procesador x86-64 actúa de la misma manera que un procesador IA-32 cuando corre en modo real o modo protegido, que son sub-modos soportados cuando el procesador no está en el modo largo.

Un bit en el campo de los atributos extendidos del CPUID informa a programas en los modos real o protegido, si el procesador puede ir a modo largo, lo que permite que el programa detecte un procesador x86-64. Esto es similar al bit de atributos del CPUID que los procesadores Intel IA-64 usan para permitir que los programas detecten que están funcionando bajo emulación IA-32. 



MODALIDADES DEL DIRECCIONAMIENTO

  • Direccionamiento directo por registro: Se mencionó anteriormente que el campo de dirección de una instrucción puede especificar una palabra de memoria o un registro M procesador. Cuando se da este último caso se dice que el operando está especificado con direccionamiento directo por registro, en tal caso, el operando reside en uno de los registros del procesador que es seleccionado por un campo de registro de k bits en la instrucción. Un campo de k bits puede especificar uno de 2k registros. Este modo es típico de los ordenadores con organización de registros de uso general.

    Las ventajas de este modo son:
    • El acceso a los registros es muy rápido, por tanto el direccionamiento por registro debe usarse en las variables que se usen con más frecuencia para evitar accesos a memoria que son más lentos, un ejemplo muy típico del uso de este direccionamiento son los índices de los bucles.
    • El número de bits necesarios para especificar un registro es mucho más pequeño que el necesario para especificar una dirección de memoria, esto es debido a que el número de registros del procesador es muy pequeño comparado con el número de direcciones de memoria. Sin embargo, hay que tener en cuenta que en los ordenadores modernos el número de registros ha aumentado considerablemente.
  • Direccionamiento inmediato (o literal): En este modo es el operando el que figura en la instrucción no su dirección. En otras palabras el campo de operando contiene él mismo, sin transformación alguna, la información sobre la que hay que operar. Este modo es útil para inicializar registros o palabras de memoria con un valor constante.
  • Direccionamiento directo (o absoluto): Este es el modo de direccionamiento más sencillo. El campo de dirección no necesita transformación alguna para dar la dirección efectiva, es decir la función que transforma el campo de operando en la dirección efectiva es la identidad. Esto significa que el campo de operando es ya la dirección efectiva.
    Este direccionamiento sólo se usa en ordenadores pequeños en que el programa siempre se sitúa en la misma zona de memoria ya que dificulta la relocalización de los programas, es decir que el código de los programas no dependa de su situación en memoria. Ordinariamente este modo sólo se usa para acceder a direcciones del sistema que normalmente se refieren a operaciones de entrada y salida ya que estas direcciones no dependen del programa.
  • Direccionamiento indirecto: En este modo el campo de operando de la instrucción indica la localización de la dirección efectiva del operando. El modo de direccionamiento indirecto puede adquirir diferentes formas según cuál sea el lugar donde se encuentre la dirección del operando. En general, todos los modos de direccionamiento tienen su versión indirecta que añade un eslabón más a la cadena del direccionamiento. Por ejemplo existe el direccionamiento indirecto por registro, en el que el registro especificado contiene la dirección del operando, no el operando mismo.
    Este direccionamiento es útil cuando se trabaja con punteros ya que los punteros son variables que contienen las direcciones de los operandos, no los operandos mismos.
  • Direccionamiento relativo: Hay algunos modos de direccionamiento en que se hace uso de una propiedad muy generalizada de los programas denominada localidad de referencia, esta propiedad consiste en que las direcciones referenciadas por los programas no suelen alejarse mucho unas de otras y, por tanto, suelen estar concentradas en una parte de la memoria. Estas consideraciones nos llevan a la conclusión de que no es necesario utilizar todos los bits de la dirección de memoria en el campo de operando, basta utilizar los bits precisos para cubrir la parte de memoria donde estén incluidas las direcciones a las que el programa hace referencia. Esto puede hacerse tomando corno referencia un punto de la memoria y tomando como campo de operando la diferencia entre ese punto y la dirección efectiva del operando. La dirección que se toma como punto de referencia puede residir en un registro de la CPU y, por tanto, sumando el contenido de ese registro con el campo de operando obtendremos la dirección efectiva. Hay varios direccionamientos basados en esta técnica que reciben diferentes nombres dependiendo de cuál sea el registro en el que radica la dirección tomada como referencia. Todos ellos podrían catalogarse como direccionamientos relativos a un registro.
    El direccionamiento denominado habitualmente relativo toma como valor de referencia el registro contador de programa. Cuando se usa este modo de direccionamiento, el campo de operando consiste en un número (normalmente con signo) que expresa la diferencia entre la dirección del dato y la dirección siguiente a la instrucción en curso (contenida en el contador de programa). Si el campo de operando, llamado en este caso desplazamiento u offset, es positivo el operando residirá en una dirección posterior a la de la instrucción y si es negativo, en una dirección anterior.
    Este modo de direccionamiento es usado muy frecuentemente en programas cuyo código deba ser independiente de la posición de memoria donde estén situados (programas relocalizables) ya que el desplazamiento es independiente de la localización del programa. También se usa con mucha frecuencia en instrucciones de bifurcación.
    Los apartados siguientes se refieren a diferentes versiones de direccionamientos relativos a registros.

  • SEGMENTOS
    • De desplazamiento: Combina el modo directo e indirecto mediante registros
    • De pila: Se utiliza cuando el operando está en memoria y en la cabecera de la pila. Este direccionamiento se basa en las estructuras denominadas Pila(tipo LIFO), las cuales estan marcados por el fondo de la pila y el puntero de pila (*SP), El puntero de pila apunta a la última posición ocupada. Asi, como puntero de direccionamiento usaremos el SP. El desplazamiento más el valor del SP nos dará la dirección del objeto al que queramos hacer referencia. En ocasiones, si no existe C. de desplazamiento solo se trabajara con la cima de la pila. Este tipo de direccionamiento nos aporta flexibilidad pero por contra, es mucho mas complejo que otros tipos estudiados más arriba.
    • Respecto a un registro base: Este modo de direccionamiento es muy usado por los ensambladores cuando se llaman a las funciones (para acceder a los parametros apilados en la pila, valga la redundancia). Consiste, al igual que el indirecto a través de registro, en calcular la EA (Effective Address) como la suma del contenido del registro base y un cierto desplazamiento (u offset) que siempre será positivo. Esta técnica permite códigos reentrantes y acceder de forma fácil y rápida a posiciones cercanas de memoria.

      EA = RB+offset
      RB = registro base
      offset = desplazamiento
      -> RB se comporta como una dirección de memoria a la que se le sumará el desplazamiento
    • Respecto a un registro indice: Es similar al anterior, lo único que es el contenido del registro indice el que indica el desplazamiento que se produce a partir de una dirección de memoria que se pasa también como argumento a la orden que utiliza este modo de direccionamiento. Aunque en esencia son dos modos equivalentes. La EA se calcula como la suma del contenido del registro indice y una dirección de memoria:

      EA = RI+DM
      RI = registro indice
      DM = direccion de memoria
      -> RI se comporta como un offset
    • Indexado respecto a una base: Se trata de una combinación de los dos anteriores y consiste en calcular la dirección efectiva como:

      EA = RI+RB+DM
      -> Las siglas significan lo mismo que en el caso anterior
    • Respecto al contador de programa: Consiste en dirección una posición de memoria usando como registro base al contador de programa (PC), el funcionamiento es análogo al direccionamiento respecto a registro base con la salvedad de que, en este caso, el offset puede ser también negativo.

    • TRANSFERENCIA DE REGISTROS 
    • registros: El campo de operando de la instrucción contiene un identificador de registro en el que se encuentra la dirección efectiva del operando. En este modo el campo de la dirección de la instrucción da la dirección en donde la dirección efectiva se almacena en la memoria. El control localiza la instrucción de la memoria y utiliza su parte de dirección para accesar la memoria de nuevo para leer una dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo de dirección de la instrucción sea sumado al control de un registro especificado en el procesador. La dirección efectiva en este modo se obtiene del siguiente cálculo:
      Dir. efectiva = Dir. de la parte de la instrucción + Contenido del registro del procesador.
      PILA

      Aparte de los componentes de la arquitectura presentados en las secciones anteriores, la mayor parte de procesadores ofrecen la infraestructura necesaria para manipular una estructura de datos organizada y almacenada en memoria que se denomina “la pila”.
      La pila es una zona de la memoria sobre la que se pueden escribir y leer datos de forma convencional. Esta zona tiene una posición especial que se denomina “la cima de la pila”. El procesador contiene dos instrucciones de su lenguaje máquina para realizar las operaciones de “apilar” y “desapilar” datos de la pila. Los datos que se pueden apilar y desapilar, en el caso del Intel Pentium son siempre de tamaño 4 bytes.


      CONJUNTO DE INSTRUCCIONES DEL LENGUAJE ENSAMBLADOR
      Instrucciones aritmeticas
      • SUMA SIN ACARREO: 


      • Consiste en sumar al contenido del registro "A" un número y obtener el resultado en el registro "A". El indicador de acarreo no se tiene en cuenta para esta operación. Su esquema sería: 


       

      SUMA CON ACARREO: 
      Exactamente igual que la anterior, pero se suma también el indicador de acarreo del registro "F". De esta forma, sepuede incluir en la suma el acarreo procedente de una suma anterior. Su esquema sería: 

       

      RESTA SIN ACARREO: 
      Consiste en restar un número del contenido del registro "A", y obtener el resultado en este mismo registro. El indicador de acarreo no interviene en la operación. Se consideran números negativos los superiores a 127 (7Fh) es decir, el número 255 (FFh) se considera "-1", el 254 (FEh) se considera "-2" y así sucesivamente, hasta 128 (80h) que se considera "-128". El paso de 127 a 128 o viceversa se indica poniendo a "1" el flag de "overflow" (P/V) del registro "F". Su esquema sería: 

       

      RESTA CON ACARREO: 
      Igual que el anterior, salvo que también se resta el indicador de acarreo (CF) del registro "F". Su esquema sería: 

       

      INCREMENTO: 
      Consiste en sumar uno al contenido de un registro que se especifica en la instrucción. Su esquema es: 

       

      Donde "R" representa un registro cualquiera de 8 a 16 bits. Si se trata de un registro doble (de 16 bits) se incrementa el registro de orden bajo (por ejemplo, en el "BC" se incrementa "C"), y si ello hace que este pase a valer "0", se incrementa también el de orden alto. 

      DECREMENTO: 
      Es la inversa de la anterior, consiste en restar uno al contenido de un registro. Su esquema es: 

       

      Si se trata de un registro doble, se decrementa el de orden bajo y, si esto hace que pase a valer 255 (FFh), se decrementa también el de orden alto. 
      Si el registro incrementado o decrementado es de 8 bits, resultan afectados los indicadores del registro "F". 

      COMPLEMENTO: 
      Consiste en realizar un "complemento a 1" del acumulador, es decir, cambiar los "unos" por "ceros" y los "ceros" por "unos". 

       

      NEGACIÓN: 
      Consiste en realizar un "complemento a 2" del acumulador, es decir, realizar un "complemento a 1" y, luego, sumarle "1". Lo que se obtiene es el "negativo" del número que teníamos en el acumulador. El efecto es el mismo que si restáramos el acumulador de "cero", es decir: 

       

      instrucciones logicas


      Las instrucciones lógicas realizan operaciones lógicas bit a bit con sus operandos. 
      Las instrucciones lógicas incluyen las operaciones que se realizan con los operadores "AND", "OR" y "XOR". 

      AND 
      and AL, BL       al AND bl --> al 

      OR 
      or AL, BL       al OR bl --> al 

      XOR 
      xor AL, BL       al XOR bl --> al 

      NOT 
      Esta instruccion logica consiste en negar cualquier otra instruccion invirtiendo sus valores. 

       
      Las instrucciones lógicas de dos operandos (and, or y xor) ponen siempre a ‘0’ los bits CF y OF de registro de estado después de ejecutarse (debe tenerse en cuenta que el estado de estos bits sólo tiene significado tras la ejecución de las instrucciones aritméticas). Los bits SF y ZF se modifican siguiendo los mismos criterios que en las instrucciones aritméticas. 

      La instrucción lógica de un operando (not) no modifica ningún bit del registro de estado tras su ejecución.

      Instrucciones de desplazamiento

      Las instrucciones de desplazamiento son cuatro: shl, shr, sar y sal; y su objetivo es desplazar los bits de un operando un determinado número de posiciones a la izquierda o a la derecha.La estructura de los operandos manejados por estas instrucciones y su significado es idéntico para las cuatro instrucciones. Todas ellas trabajan sobre un operando fuente y un operando destino. 

      El Operando Destino contiene el dato que va a ser objeto del desplazamiento y debe ser del tipo, registro o memoria. 
      El Operando Fuente determina la cantidad de posiciones que va a ser desplazado el operando destino. El operando fuente sólo puede ser un dato inmediato de 8 bits (I8) o bien el registro CL. 

      SHL (Shift Left = desplazamiento a la izquierda) 

      Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0. Este proceso se representa en la figura siguiente. 



      SHR (Shift Right = desplazamiento a la derecha) 

      La instrucción shr funciona de la misma forma que shl, pero desplazando los bits a la derecha en lugar de a la izquierda, tal y como se muestra en la figura siguiente. 



      SAR (Shift Arithmetic Right = desplazamiento aritmético a la derecha) 

      Esta instrucción desplaza los bits del operando destino a la derecha tantos bits como indique el operando fuente. Esta forma de funcionamiento es similar a la de la instrucción shr; sin embargo, ambas instrucciones se diferencian en que sar, en vez introducir ceros por la izquierda del operando, replica el bit de mayor peso (bit de signo) en cada desplazamiento. esquemáticamente, la instrucción sar trabaja de la siguiente forma: 


      El desplazamiento a la derecha realizado por la instrucción sar recibe el nombre de aritmético porque sirve para dividir un operando entre una potencia entera de 2. 
      El desplazamiento aritmético a la derecha de un operando (considerado con signo) n posiciones equivale a la división entera del operando entre 2n

      SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda) 

      El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2. 



      Para llevar a cabo este tipo de desplazamiento, hay que desplazar los bits del operando hacia la izquierda introduciendo ceros por su derecha. En realidad, este tipo de desplazamiento es idéntico al llevado a cabo por la instrucción shl; por tanto, sal y shl son, de hecho, la misma instrucción y se codifican con el mismo código máquina. 

      Instruccion de rotación de bits (con o sin acarreos)

      RCL     DESTINO,CONTADOR     ;Rota destino a traves de carry a la izquierda contador veces
      RCR     DESTINO,CONTADOR     ;Rota destino a traves de carry a la derecha contador veces
      ROL     DESTINO,CONTADOR     ;Rota destino a la izquierda contador veces
      ROR     DESTINO,CONTADOR     ;Rota destino a la derecha contador veces
      SAL     DESTINO,CONTADOR     ;Desplaza destino a la izquierda contador veces y rellena con ceros
      SAR     DESTINO,CONTADOR     ;Desplaza destino a la derecha contador veces y rellena con bit SF
      SHR     DESTINO,CONTADOR     ;Desplaza destino a la derecha contador veces y rellena con ceros

      NOTA: El DESTINO va a ser la direccion y el CONTADOR es el numero de veces que se reètira la instruccion. 

      Instrucciones para manejo de pila 

      POP (Extraer de la Pila) 
      Sintaxis:    POP Destino 
      Indicadores:   OF   DF   IF   TF   SF   ZF   AF   PF   CF 

      Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instrucción POP CS, poco útil, no funciona correctamente en los 286 y superiores. 

      Ejemplos: 

      pop    ax 
      pop    pepe 

      PUSH (Introduce en la Pila) 
      Sintaxis:    PUSH origen 
      Indicadores: OF DF IF TF SF ZF AF PF CF 

      Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aquí sí se puede especificar como origen, al contrario de lo que afirman algunas publicaciones. 

      Ejemplo:

      push cs 

      POPF (Extrae los Indicadores de la Pila) 
      Sintaxis:    POPF 
      Indicadores:    OF   DF   IF   TF   SF   ZF   AF   PF   CF 
                                x      x      x      x      x     x       x      x       x 

      Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuación el puntero de pila SP se incrementa en dos. 

      PUSHF (Introduce los Indicadores en la Pila) 
      Sintaxis:   PUSHF Indicadores:   OF DF IF TF SF ZF AF PF CF 

      Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los indicadores.

      Diferencia entre programas .com y .exe 

      Un programa .COM es prácticamente una imagen en memoria del archivo en disco, menos por el PSP que es creado durante el proceso de inicialización, y es por esta razón que el programa se inicia a partir del offset 0x100 (en assembler se utiliza el operador ORG). 

      En cambio el formato .EXE reorganiza sus segmentos en la memoria dando un tamaño adecuado (que es posible y necesario que el programador lo determine, dependiendo del lenguaje en el cual fue escrito), es por esta razón que dentro de la cabecera de un archivo .EXE hay cierto código que realiza esta tarea.

      Tipos de interrupciones

      Interrupción 21H 
      Propósito: Llamar a diversas funciones del DOS. 

      Funciones para desplegar información al video 02H Exhibe salida 
      09H Impresión de cadena (video) 
      40H Escritura en dispositivo/Archivo 

      Funciones para leer información del teclado 01H Entrada desde teclado 
      0AH Entrada desde teclado usando buffer 
      3FH Lectura desde dispositivo/archivo 

      Método FCB 
      0FH Abrir archivo 
      14H Lectura secuencial 
      15H Escritura secuencial 
      16H Crear archivo 
      21H Lectura aleatoria 
      22H Escritura aleatoria 

      Handles 
      3CH Crear archivo 
      3DH Abrir archivo 
      3EH Cierra manejador de archivo 
      3FH Lectura desde archivo/dispositivo 
      40H Escritura en archivo/dispositivo 
      42H Mover apuntador de lectura/escritura en archivo 

      Función 02H 
      Despliega un caracter a la pantalla. 

      Función 09H 
      Despliega una cadena de carateres en la pantalla. 

      Función 01H 
      Leer un caracter del teclado y desplegarlo. 


      VIDEO LENGUAJE ENSAMBLADOR




      PROGRAMACIÓN EN EL LENGUAJE ENSAMBLADOR
      Diferencia entre compiladores y ensambladores:
      Los COMPILADORES como los desarrollados para Fortran, Clipper, COBOL, Pascal o C, que en vez de llamar y ejecutar una rutina en lenguaje de máquina, éstos juntan esas rutinas para formar el código objeto que, después de enlazar las rutinas de run-time y llamadas a otros programas y servicios del sistema operativo, se transformará en el programa ejecutable.
      Los ENSAMBLADORES son como una versión reducida y elemental de un compilador (pero que de ninguna manera deben considerarse como tales), ya que lo único que tienen que hacer es cambiar toda referencia simbólica por la dirección correspondiente, calcular los saltos, resolver referencias y llamadas a otros programas, y realizar el proceso de enlace. Los ensambladores son programas destinados a realizar el ensamblado de un determinado código.

      Requerimiento del lenguaje ensamblador:


      • Software Necesario
      • Utilización del MASM
      • Uso del Enlazador (LINKER)

      SOFTWARE NECESARIO


      Para poder crear un programa se requieren varias herramientas:
      • Primero un editor para crear el programa fuente.
      • Segundo un compilador que no es mas que un programa que "traduce" el programa fuente a un programa objeto.
      • Y tercero un enlazador o linker , que genere el programa ejecutable a partir del programa objeto.

      El editor puede ser cualquier editor de textos que se tenga a la mano, como compilador utilizaremos el MASM (macro ensamblador de Microsoft) ya que es el mas común, y como enlazador utilizaremos el programa link .

      La extensión usada para que MASM reconozca los programas fuente en ensamblador es .ASM ; una vez traducido el programa fuente, el MASM crea un archivo con la extensión .OBJ , este archivo contiene un "formato intermedio" del programa, llamado así porque aún no es ejecutable pero tampoco es ya un programa en lenguaje fuente. El enlazador genera, a partir de un archivo .OBJ o la combinación de varios de estos archivos, un programa executable, cuya extensión es usualmente .EXE aunque también puede ser .COM , dependiendo de la forma en que se ensambló.


      UTILIZACION DEL MASM


      Una vez que se creó el programa objeto se debe pasar al MASM para crear el código intermedio, el cual queda guardado en un archivo con extensión .OBJ . El comando para realizar esto es:

      MASM Nombre_Archivo; [Enter]

      Donde Nombre_Archivo es el nombre del programa fuente con extensión .ASM que se va a traducir. El punto y coma utilizados despues del nombre del archivo le indican al macro ensamblador que genere directamente el código intermedio, de omitirse este caracter el MASM pedirá el nombre del archivo a traducir, el nombre del archivo que se generará así como opciones de listado de información que puede proporcionar el traductor.

      Es posible ejecutar el MASM utilizando parámetros para obtener un fin determinado, toda la lista de los mismos se encuentra en el manual del programa. Solo recordaré en este tutorial la forma de pasar dichos parámetros al MASM:

      Todo parámetro va despues del simbolo " / ". Es posible utilizar varios parámetros a la vez. Una vez tecleados todos los parámetros se escribe el nombre del archivo a ensamblar.

      Por ejemplo, si queremos que el MASM ensamble un programa llamado prueba , y ademas deseamos que despliege el número de lineas fuente y símbolos procesados ( eso lo realiza con el parametro /v ), y si ocurre un error que nos diga en que linea ocurrió ( con el parametro /z ), entonces tecleamos:

      MASM /v /z prueba;


      USO DEL ENLAZADOR (LINKER)

      El MASM unicamente puede crear programas en formato .OBJ , los cuales no son ejecutables por si solos, es necesario un enlazador que genere el código ejecutable.

      La utilización del enlazador es muy parecida a la del MASM, unicamente se teclea en el indicador del DOS:

      LINK Nombre_Archivo ;

      Donde Nombre_Archivo es el nombre del programa intermedio (OBJ). Esto generara directamente un archivo con el nombre del programa intermedio y la extensión .EXE 

      Segmento de un programa en lenguaje ensamblador:

      Definición de Segmentos 
      Para realizar esta acción se utilizan las denominadas directivas de segmento. Se pueden utilizar las directivas largas o las simplificadas.
      Directivas Largas Directivas de Segmento:    SEGMENT,ENDS y END
      SEGMENT : Directiva para definir un segmento, el tamaño máximo de un segmento es de 64kb
      ENDS: Directiva para finalizar un segmento

      Formato:

      Nombre    Directiva    alineación    [combinación]    [clase]

      Alineación: Indica el límite en el que inicia el segmento, por omisión alinea el segmento al límite de un párrafo, de manera que la dirección inicial es divisible entre 16 0 10h, el requerimiento típico es PARA.

      Combinación: Indica si el segmento se combina con otros segmentos cuando son enlazados después de ensamblar, los tipos son STACK, COMMON, PUBLIC y la expresión AT.
      Para la pila es:

      Nombre SEGMENT PARA STACK

      Se puede utilizar PUBLIC y COMMON en donde tenga el propósito de combinar de forma separada programas ensamblados cuando los enlaza.

      Clase: Es encerrada entre apóstrofes, es utilizada para agrupar segmentos cuando se enlazan.
      Se utilizan ´code´ con CS, ‘data’ para DS, ‘stack’ para SS.
      END: : Directiva para definir el fin del programa

      Ejemplo:

      STACKSG segment para stack 'stack'
      Definición de la pila
      STACKSG ENDS
      DATASG SEGMENT PARA 'DATA'
      Definición de datos
      DATASG ENDS
      CODESG SEGMENT PARA 'CODE'
      Definición de codigo
      CODESG ENDS
      END 


      Directivas y directivas simplificadas en el lenguaje ensamblador : 

      Directivas 

      Son ordenes para el ensamblador y no tienen traduccion a codigo maquina. y utilizaremos:
      ORG:
      Inicializa el contador de programa con el valor del operando. Si no se utiliza un directiva ORG, se asume que el PC vale 0.

      Sintaxis:   ORG valor

      EQU:
      Asigna al simbolo contenido enb el campo etiqueta el valor de la expresion en el campo operando.
      Sintexis:   etiqueta EQU valor

      DC:
      Define constantes en memoria. Permite asignar valores numericos, tablas, caracteres a variables de memoria. y se pueden asignar hasta 256 bytes de datos en una unica direcdtiva.

      Sintaxis:   etiqueta DC.t const1,const2...

      Directivas simplificadas

      Son formas abreviadas para definir segmentos, para usarlas primero se debe definir el modelo de memoria antes de definir algún segmento

      La directiva simplificada .MODEL crea por omisión a los segmentos y los enunciados ASSUME y GROUP necesarios. Formato de definición de memoria:

      .MODEL modelo de mem


      Los formatos generales para las directivas de segmento son:
      .STACK [tamaño]
      .DATA
      .CODE [nombre]
      Cada una de estas directivas hace que el ensamblador genere el enunciado SEGMENT necesario y su correspondiente ENDS. El tamaño de la pila es de 1024 bytes, el cual puede pasarse por alto. Los nombres de los segmentos (que no se tienen que definir) por omisión son STACK, DATA y TEXT (código).
       

      Estructura general de un programa en lenguaje ensamblador 


       

      Proceso de edición, ensamblado , ligado de instrucciones en lenguaje ensamblador .

      EDICION
      Los archivos fuente de código ensamblador deben estar en formato ASCII standard. Para esto puede usarse cualquier editor que permita crear archivos sin formato, e.g. Edlin, Edit, Write, El editor del Turbo Pascal, Works, Word, WordStar, etcétera. Las declaraciones pueden ser introducidas en mayúsculas y/o minúsculas. Una buena práctica de programación es poner todas las palabras reservadas (directivas e instrucciones) en mayúsculas y todo lo del usuario en minúsculas para fines de facilidad de lectura del código.

      Las sentencias pueden comenzar en cualquier columna, no pueden tener más de 128 caracteres, no se permiten lineas múltiples ni códigos de control, y cada línea debe ser terminada con una combinación de line-feed y carriage-return. Los comentarios se declaran con ; y terminan al final de la línea.

      ENSAMBLADO
      El ensamblado se lleva a cabo invocando al MASM. Este puese ser invocado, usando una línea de comando, de la siguiente manera:

      MASM archivo [,[objeto][,[listado][,[cross]]]]][opciones][;]

      donde:

      objeto.- Es el nombre para el archivo objeto.
      listado.- Nombre del archivo de listado de ensamblado.
      cross.Es un archivo de referencias cruzadas.

      LINK
      De la misma forma que el ensamblado, la fase de liga se lleva a cabo con el LINK. Este puede ser invocado de la misma forma que el MASM. Los parámetros que este requiere son:

      LINK objeto [,[ejecutable][,[mapa][,[librería]]]]][opciones][;]

      donde:

      objeto.- Es el nombre para el archivo .OBJ
      ejecutable.- Nombre del archivo .EXE
      mapa.- Nombre del archivo mapa
      librería.- Nombre del archivo biblioteca de rutinas

      EJECUCION
      Para la ejecución del programa simplemente basta teclear su nombre en el prompt de MS-DOS y teclear ENTER. Con esto el programa será cargado en memoria y el sistema procederá a ejecutarlo. El proceso completo para poder crear un programa ejecutable con el Microsoft Macro Assembler se muestra abajo. 

      Procedimientos en lenguaje ensamblador 

      1.- Entramos al MS-DOS
      INICIO---ACCESORIOS---MS-DOS


      2.- Entramos a TASM
      cd..
      cd..
      cd tasm


      3.- Creamos nuestros ARCHIVO
      edit    nombre del archivo con la extencion   .CPP


      Instrucciones de salto condicional e incondicional

      Saltos Incondicionales

      Empecemos por el salto sin condiciones, con el que podremos cambiar el control a cualquier punto del programa.

      Sería como el “Goto” del Basic, simplemente transferir el control a otro punto del programa. La orden es

      JMP (de Jump, salto)

      El formato mas sencillo para el salto sería JMP 03424h

      La única instrucción que existe para éste fin es JMP (Abreviatura de JUMP, que significa en inglés SALTAR). La sintaxis es la siguiente:

      JMP XXXXXXXX: Es la ubicación de la instrucción en donde se continuará el programa (A partir de ésta se ejecutan las siguientes).

      Ejemplo:

      XXXX: 0100 MOV AX, 1000
      XXXX: 0103 JMP 0107
      XXXX: 0105 XOR AX, A
      XXXXX: 0107 INT 20

      Saltos Condicionales

      Son similares a JMP en la sintaxis, pero la diferencia es el nombre.
      Las instrucciones son las siguientes
      JE o JZ: Salta si está prendido el bit cero del registro de banderas.+
      Objetivo: Saltar si la última comparación realizada da igual.

      JA o JNBE: Salta si el bit carry (CF) o el bit cero (ZF) del registro de banderas está desactivado.
      Objetivo: Saltar si la última comparación realizada con números naturales da mayor 


                                CYBERGRAFIA