Está en la página 1de 28

MÓDULO

Área: NEGOCIOS

1 Curso:ARQUITECTURA DE COMPUTADORES
Módulo:Circuitos y lenguaje de máquina
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES

Circuitos y lenguaje de máquina


Índice

Introducción ......................................................................................................................................................... 1
1. Estructura general de un computador ............................................................................................................. 1
1.1 Hardware y Software ................................................................................................................................................... 2
a. Hardware ................................................................................................................................................................... 2
b. Software .................................................................................................................................................................... 2
1.2 El origen de los computadores .................................................................................................................................... 3
a. Álgebra Booleana ...................................................................................................................................................... 3
b. Aplicación del Álgebra Booleana ............................................................................................................................... 5
2. Circuitos Lógicos ............................................................................................................................................... 6
2.1 Bit................................................................................................................................................................................. 6
2.2 Tabla de verdad ........................................................................................................................................................... 8
2.3 Circuitos combinacionales: Puertas lógicas ................................................................................................................. 9
3. Lenguaje de máquina ..................................................................................................................................... 11
3.1 Diagrama de flujo ...................................................................................................................................................... 11
3.2 Notación a utilizar ...................................................................................................................................................... 13
3.3 Segmentos de memoria ............................................................................................................................................. 13
3.4 Registros .................................................................................................................................................................... 14
3.5 Stack .......................................................................................................................................................................... 16
3.7 Instrucciones de transferencia de datos.................................................................................................................... 18
4. Modos de direccionamiento........................................................................................................................... 22
5. Lenguaje ensamblador de bajo y alto nivel ................................................................................................... 23
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES

Circuitos y lenguaje de máquina


Mapa de Contenido

Hardware

Software
Estructura general de un
computador
Origen del computador

Álgebra Boolena

Bit

Circuitos lógicos Tabla de verdad

Puertas lógicas

Circuitos y lenguaje de Diagrama de flujo


máquina
Notación

Segmentos de memoria

Lenguaje de máquina Registros

Ejemplo Stack

Modos de direccionamiento Definición de variables

Lenguaje ensamblador de bajo y Instrucciones de transferencia


alto nivel de datos
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 1

Circuitos y lenguaje de máquina


RESULTADO DE
Construye flujos de instrucciones y datos, así como programas simples en
APRENDIZAJE lenguaje ensamblador de máquina, para representar instrucciones recibidas.
DEL MÓDULO

Introducción
El conocimiento de los elementos claves de un lenguaje ensamblador (assembler) permite conocer el
funcionamiento a bajo nivel de una instrucción de alto nivel (de cualquier lenguaje de programación).
También es necesario en los casos de Ingeniería Inversa para descubrir el funcionamiento de cierto programa
para el cual no se cuenta con el código fuente de programación.

Por otro lado, el conocimiento de los DDF (Diagramas De Flujo) permite enfrentar cualquier desafío con
cualquier lenguaje de programación, ya que la utilización de DDF (incluso solo a nivel mental) da la ventaja de
poder visualizar a priori las temáticas y restricciones de programación.

1. Estructura general de un computador1


Antes de revisar el lenguaje ensamblador y los Diagramas de flujo, debemos tener una idea general de la
estructura de un computador.

Una computadora es una máquina electrónica capaz de realizar cálculos con gran rapidez, obedeciendo
instrucciones muy específicas y elementales que reflejan su estructura funcional y organizacional. Se puede
definir conceptualmente a un computador como una máquina que consta de un procesador central, una
memoria, elementos de entrada y elementos de salida. Se representa gráficamente de la siguiente forma:

Memoria

Procesador
Elementos de Entrada Elementos de salida
Central

Figura 1. Estructura de computador

1
El apartado 1 de este módulo fue extraído desde el repositorio virtual Library de la Red Ilumno. Y corresponde al curso
“Arquitectura de Computadoras” de la Universidad del Istmo, Panamá, miembro de la Red a la cual pertenece IPP:
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 2

Circuitos y lenguaje de máquina


DEFINICIÓN IMPORTANTE

El concepto de arquitectura de computadoras refiere a la integración de la estructura física con la estructura lógica
de una computadora.
Se utiliza el término "arquitectura" para enfatizar la síntesis de elementos de ingeniería y ciencias exactas con
elementos estéticos y de funcionalidad práctica, de la misma manera en que un arquitecto combinará las técnicas
y conocimientos de la ingeniería con la apreciación artística e integración de su obra con su entorno.
Lo que el arquitecto realiza no sólo debe mantenerse en pie durante el tiempo, sino que también debe permitir
cumplir el objetivo para el cual fue construido y resultar del agrado para quien lo use. Así la disciplina dedicada a la
construcción, estudio y aplicación de los computadores recibe el nombre de Arquitectura de Computadores y
puede ser dividida en cinco partes fundamentales: Procesamiento, almacenamiento, entrada y salida,
comunicaciones y control.

1.1 Hardware y Software


Las dos áreas que comprende esta arquitectura se conocen como Hardware y Software.

a. Hardware
El hardware o los circuitos electrónicos (circuitería) son los elementos físicos y tangibles del computador. El
hardware incluye el CPU, memoria y los dispositivos de entrada y salida que también se les conocen como
periféricos.

b. Software
El software son los programas o código que dan las instrucciones al
computador, que al ejecutarse producen los resultados que se persiguen.
Se le consideran los elementos lógicos e intangibles del computador.

La arquitectura de computadores es un concepto que integra software,


hardware, algoritmos y lenguajes de programación para el procesamiento
de datos y la generación de información. Esta es la base del campo laboral
para ingenieros en electrónica y computación, dedicados al diseño de hardware, como para los científicos en
computación e ingenieros de software, dedicados al diseño de programas.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 3

Circuitos y lenguaje de máquina


El diseño y construcción de computadores es frecuentemente visto como
labor de un ingeniero más que de un científico. Sin embargo, las
demandantes necesidades de equipos de cómputo cada vez más veloces y
poderosos requieren de la aplicación práctica de diversos conceptos
teóricos. Tales necesidades, involucran computadores individuales
(uniprocesadores), computadores compuestos (multiprocesadores) y
supercomputadores.
Imagen de un supercomputador

Por la complejidad con la que se encuentran interrelacionados los elementos físicos y lógicos que integran a
un computador es imposible considerar únicamente a los de un tipo durante la fase de diseño. Tan
importante es el hardware, que permite realizar lo que deseamos, mientras que el software nos permite
expresarlo y controlarlo. En la arquitectura de computadores, una computadora es vista como un sistema de
cómputo y como tal, se requiere de un amplio conocimiento de las estructuras de hardware y software junto
con las estrechas interacciones con los algoritmos usados (para el cálculo o asignación de recursos).

1.2 El origen de los computadores


El principio de la computadora se basa en conceptos de la representación booleana y de la electricidad,
aunados a la necesidad de realizar cálculos de alta complejidad. Estos en combinación son los elementos
básicos que describen el funcionamiento de un computador. Es por lo tanto importante, antes de revisar los
conceptos propios de la arquitectura, entender cómo la algebra booleana y la electricidad fundamentaron el
diseño y arquitectura de las computadoras.

a. Álgebra Booleana
Esta álgebra nos permite inferir, a partir de un conjunto de premisas, cuáles son las conclusiones a las que se
puede llegar de una manera lógica. Y dado que una conclusión puede ser cierta o falsa (2 estados), esta
álgebra puede representarse mediante el uso de interruptores. Similar a los interruptores de encendido y
apagado de la luz.

El álgebra booleana está basada en los siguientes principios:

I. cualquier proposición única, simple o compleja, es llamada variable y está representada por una letra
del alfabeto;
II. existen ciertos símbolos que muestran las relaciones entre las proposiciones; y
III. estas relaciones pueden expresarse matemáticamente.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 4

Circuitos y lenguaje de máquina


SABER MÁS

En 1847, un matemático inglés llamado George Boole publicó un ensayo acerca del análisis matemático de la
lógica. En este documento estableció un conjunto de principios a partir de los cuales pueden deducirse
afirmaciones lógicas más complicadas. Lo interesante del método introducido por Boole es la herramienta utilizada
para llevar a cabo las deducciones: el álgebra. Esto es, las proposiciones son escritas en términos algebraicos
mediante el uso de símbolos que representan ideas, y se llega a las deducciones por medio de operaciones
algebraicas.

Ejemplo:

• Las proposiciones A, B, C y D pueden significar respectivamente:


A: "mayor de 60 años"
B: "más de veinticinco años de servicio"
C: "jubilación"
D: "jubilación con salario completo"

• Por otro lado, las relaciones básicas entre las proposiciones son las siguientes:
"OR" (O no exclusiva)
"AND" (Y)
"NO" (NO)

• Estas relaciones se ilustran a continuación.


✓ A y B son dos afirmaciones independientes, entonces tenemos que la afirmación conjunta "A OR B"
(se denota A + B).
✓ Será verdadera si al menos una de las afirmaciones es verdadera. Esto es, la afirmación A + B = C será
verdadera si se trata de una persona ya sea mayor de 60 años o con 25 años de servicio.
✓ Por otro lado, si se trata de una persona que además de ser menor de 60 años, tiene menos de 25
años trabajando, entonces la afirmación será falsa (se trata de "OR" no exclusiva).

• Operación suma
La operación suma (+) asigna a cada par de valores a, b de A un valor c de A:
Su equivalencia en lógica de interruptores, es un circuito de dos interruptores en paralelo.

a b a+b
0 0 0
0 1 1
1 0 1
1 1 1

Figura 2. Circuito paralelo


Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 5

Circuitos y lenguaje de máquina


Si uno de los valores de a o b es 1, el resultado será 1, es necesario que los dos sumandos sean 0, para que el
resultado sea 0.

Ahora consideremos la afirmación conjunta: "A AND B" (se denota A · B)

✓ Para que la afirmación A · B = D sea verdadera, será necesario que la persona cumpla con ambos
requisitos para obtener la jubilación con salario íntegro; esto es, deberá ser mayor de 60 y con más
de 25 años de trabajo. Si alguna de las afirmaciones, o ambas, son falsas, entonces la proposición "A
AND B" será falsa.
Finalmente, la afirmación "NO A" (se denota) será cierta únicamente si la persona en cuestión es
menor de 60 años.

✓ Pueden hacerse combinaciones más elaboradas de premisas, a partir de las relaciones básicas; así
como también es posible escribir una misma relación de maneras diferentes. Por ejemplo: B A= A + B
significa: tener a "todos los que tienen más de 60 años de edad o que tienen más de 25 años de
antigüedad" es lo mismo que tener a todos los que son mayores de 60 años o que además de ser
menores de 60 años tienen más de 25 años de antigüedad.

IMPORTANTE

Nótese que aun con relaciones muy simples como ésta se vuelve difícil traducirlas al lenguaje común, y más aún,
efectuar deducciones. Esto nos muestra que una de las grandes ventajas de reducir operaciones lógicas a términos
de operaciones matemáticas es que, a diferencia del lenguaje común, las matemáticas no tienen ambigüedades.

b. Aplicación del Álgebra Booleana


Para utilizar el álgebra booleana en la computadora, se le asigna el valor "1" a la palabra VERDADERO, y el
valor 0 a FALSO, o "encendido" y "apagado", respectivamente, y se construyen circuitos electrónicos dentro
de la computadora, que se comportan al igual que estas funciones lógicas. Éstos son los llamados circuitos
lógicos. De esta manera, cuando la computadora ejecuta un programa, envía la información a los circuitos
compatibles con el tipo de operación que se desea efectuar.

1 VERDADERO Encendido
0 FALSO Apagado

Figura 3. Valores asignados en álgebra Booleana

Luego de haber comprendido los elementos del algebra Booleana se puede entender lo fácil que es utilizar la
electricidad para representar los valores verdadero (1) o falso (0). Eléctricamente esto es proporcionado por
la presencia o ausencia de voltaje.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 6

Circuitos y lenguaje de máquina


Ejemplo:

✓ Valor Verdadero o si (1) puede ser representado por un valor de voltaje


positivo de 5 voltios (+5 V).
✓ Valor Falso o no (0) puede ser representado por la ausencia de voltaje o lo
que sería 0 voltios (0 V)
✓ En este caso se entendería que la representación es de encendido o
apagado al igual que sucede con un interruptor de luz: apagada o encendida

DEFINICIÓN IMPORTANTE

¿Qué es Voltaje? La tensión eléctrica o diferencia de potencial es una magnitud física que cuantifica la diferencia
de potencial eléctrico entre dos puntos. También se puede definir como el trabajo por unidad de carga ejercido por
el campo eléctrico sobre una partícula cargada para moverla entre dos posiciones determinadas. Se puede medir
con un voltímetro.

2. Circuitos Lógicos
Los circuitos/puertos lógicos son una forma simbólica simple de enfrentar la construcción de circuitos
eléctricos reales. Tienen una base matemática muy fuerte y requiere la memorización/recordación de las
tablas de verdad asociadas a cada uno de ellos.

Los circuitos eléctricos son elementos físicos que funcionan en base a estímulos/pulsos eléctricos que son
reducidos a pequeñas cantidades de Volts, con señales que son definidas como 0 y 1 (digitalmente), y que se
relacionan con los pulsos de Volts requeridos, y sin los cuales no podrían funcionar.

2.1 Bit
Del concepto binario surge el término que se
conoce comúnmente en el ambiente de DEFINICIÓN IMPORTANTE
computadores como bit (del término en inglés de Un bit es la unidad mínima que se utiliza en la informática
Binary digIT – dígito binario). Sin embargo este y por medio de la cual, a través de secuencias de bits, se
nivel mediante el cual un computador funciona es puede representar cualquier valor como números,
impráctico y limitado para interactuar con el palabras, e imágenes.
mismo.

Su sencillez beneficia la ejecución de cálculos, permitiéndole hacerlos rápidamente, además es ideal en el


soporte de los circuitos electrónicos como hemos visto. Este lenguaje a nivel de máquina es el más adecuado
para las computadoras, no lo es así para el hombre.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 7

Circuitos y lenguaje de máquina


IMPORTANTE

Si fuese necesario que nosotros utilizáramos dicho lenguaje para comunicarnos con las computadoras, tendríamos
más problemas de los que intentamos resolver. Para dar solución a este problema han sido creados los lenguajes
de alto nivel, los cuales consisten en una serie de instrucciones que pueden ser entendidas, y aprendidas, tanto
por el hombre como por las máquinas. Dentro de la computadora, estos programas puente, comprensibles para el
hombre, son traducidos al lenguaje de las computadoras por programas llamados compiladores.

Entonces, un Bit es la unidad mínima de información y corresponde a un pulso eléctrico, donde una variación
entre 2 y 5 Volts representa el valor “1”, y una variación cercana a 0 Volts representa un valor “0”.

IMPORTANTE

Para efectos de esta asignatura se considerara que 1 Volt representara un valor “1”, y que 0 Volt representa a un
valor “0”. Esos valores de “0” y “1” se les llamaran Bit.

A continuación un ejemplo de relación entre los pulsos voltaicos y su representación binaria.

Volts

Pulsos

0011100010100

Otro ejemplo lo encontramos en la representación de las letras y símbolos interpretados por los
computadores basados en el código ASCII (American Standard Code for Information Interchange por sus
siglas en inglés). Es la representación del alfabeto en código binario en 7-bits pero se le conoce de 8 bits por
uno adicional de paridad.

Como hemos visto, las computadoras funcionan con voltajes que representan números, letras y decisiones. El
código ASCII es una representación numérica de un carácter como ‘a’ o el símbolo ‘@’. Como otros códigos
de formato de representación de caracteres, el ASCII es un método para una correspondencia entre bits y
una serie de símbolos (alfanuméricos y otros), permitiendo de esta forma la comunicación con las
computadoras. El código de caracteres ASCII se usa en casi en todos los computadores.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 8

Circuitos y lenguaje de máquina


Figura 4. Código ASCII

Para formar la letra “a” minúscula en el código ASCII su valor es representado por el valor 097 y la misma es
representada por el binario 01100001 (ver figura 4). Igualmente el símbolo “?” es representado por el ASCII
valor 063 y en binario 00111111 Siendo estos ejemplos sencillos, se aclararán más adelante al enfocarnos en
el área de Software.

IMPORTANTE

Es importante resaltar que se han creado muchos lenguajes de alto nivel que son más fáciles de utilizar que otros,
o más simples, o más lógicos, o mejor estructurados, o más compactos, o con características más apropiadas para
llevar a cabo cierto tipo de trabajo, etc. Pero todos sirven para el mismo fin: facilitar la comunicación hombre-
computador. Es la forma como las tareas a ejecutar son llevadas a cabo por los computadores.

2.2 Tabla de verdad


Es una tabla simple donde las primeras columnas (izquierda) representan el input a la puerta lógica y la
última columna (derecha) representa la salida. Estas tablas se utilizan para ejemplificar visualmente tanto el
input como el output de una operación en una puerta lógica o de un circuito simple. Las entradas son
siempre 0 o 1 o una combinación de ellos en entradas individuales, la salida es siempre 1 o 0, o una
combinación de ellos.

En ese curso, se veremos casos sencillos de circuitos lógicos, en que se tiene una o varias entradas, y solo una
salida.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 9

Circuitos y lenguaje de máquina


Ejemplo:

Para la puerta lógica “Buffer o Igualdad”, se tiene que en la entrada puede ser un 0 o un 1, y su salida seria un
0 o un 1, respectivamente. Es decir, la puerta lógica “Buffer/Igualdad” no altera la entrada.

A Y a y
0 0
1 1

Puerta lógica Buffer Tabla de Verdad

Otra forma de leer la tabla de verdad, es que se presenta un elemento de entrada (A) y un elemento de salida
(Y). Luego, si recorremos la tabla de arriba a abajo desde la izquierda, veremos que si A = 0, la salida sería
idéntica Y = 0. La segunda fila, indica que si A = 1, la salida seria Y = 1. Por eso a esa puerta lógica se le llama
Buffer/Igualdad, ya que no altera la entrada y mantiene su valor en la salida.

Otro ejemplo de lectura de tabla de verdad es la puerta AND.

a b y
0 0 0
0 1 0
1 0 0
1 1 1

Vemos que esta puerta lógica tiene dos entradas (A y B) y una salida (Y). Luego, leyendo fila a fila:

i. Si A y B tienen valor 0, la salida será 0


ii. Si A = 0 y B = 1, la salida será 0
iii. Si A = 1 y B = 0, la salida será 0
iv. Si A = 1 y B = 1, la salida será 1

Lo anterior es una verdad o tautología, es decir dada esas entradas, el valor de salida siempre será el
mismo.

2.3 Circuitos combinacionales: Puertas lógicas


• Símbolo: Es la representación grafica de la puerta lógica.
• Tabla de verdad: Es una tabla que muestra en sus columnas la(s) entrada(s) y su(s) posible(s) salidas.
Cada fila identifica una de las tantas posibles entradas a la puerta lógica y su salida.
• Fórmula algebraica: Es la fórmula matemática que describe de forma completa como funciona
internamente la puerta lógica y de acuerdo a esa matemática como opera sobre las entradas y define
la salida.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 10

Circuitos y lenguaje de máquina


Símbolo Significado Tabla de verdad Formula algebraica
Buffer o Igualdad Y=A
A Y
A Y
0 0
1 1

NOT Y=~A
A Y
A y 0 1
1 0

OR A B Y Y=A+B
0 0 0
0 1 1
1 0 1
1 1 1

NOR A B Y Y=~(A+B)
0 0 1
0 1 0
1 0 0
1 1 0
AND A B Y Y=AxB
0 0 0
0 1 0
1 0 0
1 1 1

NAND A B Y Y=~(AxB)
0 0 1
0 1 1
1 0 1
1 1 0
XOR A B Y Y=AΘB
0 0 0
0 1 1
1 0 1
1 1 0
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 11

Circuitos y lenguaje de máquina


De acuerdo a lo revisado antes, se puede observar el siguiente diagrama de puertas que reciben 0 y 1 en la
entrada, pero la salida final es 0.

1 0

0 10 0

Puerta lógica Tabla de verdad

3. Lenguaje de máquina
El objetivo del módulo es acercar al estudiante al lenguaje de máquina a través de la revisión del lenguaje
ensamblador de bajo nivel. El lenguaje de maquina como tal, son códigos 0 y 1, o normalmente expresados
como códigos hexadecimales. No llegaremos a ese nivel, pero se darán ejemplos en que se mostrarán
direcciones de memoria en valores hexadecimales, solo como una forma de clarificar ideas.

3.1 Diagrama de flujo


Antes de comenzar a ver los detalles de programación del lenguaje de máquina, es necesario conocer el uso
de un diagrama de flujo. Este se usa para detallar una acción antes de utilizar el lenguaje de programación.

Primero, se debe tener clara la actividad y luego separarla en actividades más simples. Por ejemplo, abrir una
botella de bebida, es la actividad general, y se definen las subactividades que la componen:

1. Abrir una botella de bebida


2. Tomar la botella
3. Tomar el destapador
4. Acercar el destapador a la tapa de la botella
5. Ejercer una acción de palanca sobre la tapa con el destapador
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 12

Circuitos y lenguaje de máquina


Estas acciones se pueden ejemplificar en un diagrama de flujo de la siguiente forma:

Inicio

Tomar la botella

Tomar el
destapador Conseguir
destapador

¿Sirve el no
destapador?

Acercar el destapador a la tapa


de la botella

Ejercer acción de palanca sobre la


tapa de la botella con el destapador

Fin

Básicamente, los símbolos más simples a utilizar en un diagrama de flujo son:

Nombre Representación Significado


Indica el comienzo o final de un diagrama de
Ovalo o elipse
flujo.

Rectángulo Indica una o varias actividades a realizar

Decisión. Indica una pregunta o cuestión sobre


Rombo
la cual se debe tomar la decisión.

Indica referencia a un archivo definitivo o


Triangulo
permanente.

Indica referencia a un archivo temporal o


Triangulo invertido
transitorio

Indica que se hará una lectura de datos o que se


Entrada/Salida
dará un output de información.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 13

Circuitos y lenguaje de máquina


3.2 Notación a utilizar
Existen dos notaciones para el lenguaje assembler x86 de 32-bits. Una es la de Intel y la otra de AT&T.

IMPORTANTE

En este curso utilizaremos la notación Intel que es la más conocida y utilizada. Ambas notaciones son ligeramente
diferentes, y ante un caso real de la vida en que se requiera programar en assembler, la notación no será de gran
importancia ya que ambos serán traducidos al lenguaje de máquina de forma equivalente.

Hay que pensar el lenguaje assembler como un lenguaje de alto nivel como C, Python, Ruby u otro, y que a
través de un proceso llamado compilación, se traduce ese lenguaje assembler a un lenguaje de maquina
binario.

3.3 Segmentos de memoria


Un programa en assembler se descompone básicamente en segmentos:

Segmento Uso Referencia


Este segmento contiene las instrucciones a
Segmento de Codigo (CS o Code
ejecutarse, o equivalentemente el código del CS
Segment)
programa.
Segmento de Datosn (DS o Data Este segmento contiene los datos estáticos o
DS
Segment) modificables durante ejecución.
Acá se define el espacio a utilizar el programa
Segmento de Stack (Stack Segment) SS
para almacenar datos en el Stack.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 14

Circuitos y lenguaje de máquina


3.4 Registros
i. Registros de uso general
Estos registros son de uso interno de la CPU y pueden ser utilizados en la programación assembler. No
importa si se escriben en mayúsculas o minúsculas, es decir, “EAX” es idéntico a “eax”.

Figura 5. Registro de uso general

Existen registros de 16-bits:


• AX es un registro utilizado principalmente como acumulador.
• BX es el registro base. Se utiliza normalmente para direccionamiento indexado.
• CX es el registro de conteo. Se utiliza normalmente para conteo de ciclos en operaciones iterativas.
• DX es el registro de datos. También se utiliza en operaciones de entrada/salida.

También existen registros de 8-bits, los cuales cumplen la misma función que los de 16 bits, pero con menor
almacenamiento. Algunos de estos son:
• AH – AL: Registros utilizado principalmente como acumuladores.
• BH – BL: Registros base. Se utilizan normalmente para direccionamiento indexado.
• CH – CL: Registros de conteo. Se utilizan normalmente para conteo de ciclos en operaciones
iterativas.
• DH – DL: Registros de datos. También se utilizan en operaciones de entrada/salida.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 15

Circuitos y lenguaje de máquina


ii. Registros de punteros
Son los registros de 32-bits EIP, ESP y EBP; junto a sus correspondientes registros de 16-bits IP, SP y BP.

Figura 6. Registro de punteros

• IP (Instruction Pointer)

El registro de 16-bits IP almacena la posición de la siguiente instrucción a ejecutarse, de la misma


forma que el registro en 32-bits EIP. Utilizando la referencia al segmento de datos, se puede definir
que la posición exacta de la siguiente instrucción a ejecutar esta en CS:IP.

Este registro es modificado implícitamente por la instrucción CALL y RET, como se verá más adelante.
Además, el conjunto de instrucciones de J* (saltos condicionales) también modifican el contenido del
registro EIP.

Lo anteriormente explicado es la forma correcta de ejecutar dicho registro, pero existen formas
indirectas de modificar este registro. Estas técnicas, lejos del alcance de este curso, se utilizan para
forzar la ejecución de código malicioso, y así ganar privilegios sobre una plataforma.

• SP (Stack Pointer)

El registro de 16-bits SP indica el offset de los datos en el stack del programa. Utilizando la referencia
al segmento de stack, se puede definir que la posición actual del stack se encuentra en SS:SP.

• BP (Base Pointer)
Este registro ayuda a referenciar los parámetros utilizados en la llamada a una subrutina/función. Si
los parámetros están en el stack, entonces la referencia exacta a los parámetros se encuentra en
SS:BP.

iii. Registros de Índices


Existen dos registros llamados ESI y EDI (ambos de 32-bits) y sus correspondientes versiones SI y DI (ambos
en 16-bits). Estos se utilizan en direccionamiento indexado. En otras ocasiones se utilizan en operaciones de
sumas o restas.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 16

Circuitos y lenguaje de máquina


Figura 7. Registro de índices
• SI (Source Index)
Se utiliza mayormente para indexar cadenas de caracteres (strings) como origen.

• DI (Destination Index)
Se utiliza mayormente para indexar cadenas de caracteres (strings) como destinación.

iv. Otros registros


Existe un registro especial de 32-bits que se llama “machine status word” que almacena temporalmente el
valor de resultado de la comparación de valores vía “CMP” y que puede ser leído solo a través del uso de
instrucciones de control de flujo como “JE”.

3.5 Stack
El stack (pila) es una estructura de datos, que utiliza la memoria desde la CPU2 y cuya función es apilar datos
para operaciones. Además la CPU se utiliza ampliamente para las llamadas a funciones para dejar registros
que le permiten regresar a la posición original de ejecución. También se utiliza para realizar operaciones
básicas sin utilizar registros directamente.

Figura 8. Stack

El stack funciona en modalidad LIFO (Last In First Out), es decir, la entrada/salida al stack se realiza por un
solo punto. Desde el punto de vista de la memoria, el stack inicia en una posición pero a medida que ingresan
elementos en ella, la posición decrece. El registro ESP lleva la posición actual del último elemento que ingresó
a la pila. Se debe tener en cuenta esto al momento de realizar operaciones sobre el stack.

2
Unidad central de procesamiento o unidad de procesamiento central (conocida por las siglas CPU, del inglés: central
processing unit)
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 17

Circuitos y lenguaje de máquina


En assembler se debe definir una zona llamada “,DATA”, en que se detallan las variables a utilizar y el tamaño
de las mismas. Estas variables se definen solo si son necesarias en la ejecución de un programa, y su elección
depende directamente del uso que se le dará.

A continuación, algunos ejemplos de definición de datos:

Declara una variable de nombre “var” que utilizara 1 byte de espacio y que contiene el
var DB 4
valor “4”
Declara una variable de nombre “var2” que utilizara 1 byte de espacio pero no está
var2 DB ?
inicializada.
Declara una variable sin nombre que utilizara 1 byte y que contiene el valor “3”. Su
DB 3
referenciación seria var2 + 1
Declara una variable de nombre “var3” que utilizara 2 bytes (word) y que contiene un
var3 DW ?
valor no inicializado.
Declara una variable de nombre “var4” que utilizara 4 bytes (double word) y que contiene
var4 DD 7000h
el valor 7000h o equivalentemente 28672 decimal).
Declara un string o cadena de caracteres que contiene el texto “Hola” y finaliza con un
str DB ‘Hola’,0
byte en 0, es decir la declaración contiene 5 bytes).

La sintaxis de la definición de cualquier dato es:


<nombre de la variable> [TIMES n] <tipo> <inicializacion o ‘?’>

Donde:

<nombre de la Corresponde al nombre de una variable. No puede ser igual a ninguna


variable> instrucción ya definida del lenguaje assembler.
Indica que la definición que le sigue se repite “n” veces. Esto sirve para definir
[TIME n]
un array o lista de elementos.
Indica de que tipo se define la variable, es decir, cuanto espacio de memoria
utilizara cada elemento. Estos pueden ser:
<tipo> • DB (define un byte de 8-bits)
• DW (define un word 16-bits)
• DD (define un double-word 32-bits)
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 18

Circuitos y lenguaje de máquina


3.7 Instrucciones de transferencia de datos
Del conjunto total de instrucciones de assembler x86 solo se anunciarán las más utilizadas y conocidas. Para
conocer el total de instrucciones assembler x86, referirse a documentación especializada.

Para la siguiente tabla se usará “dest” para indicar el destino, y “orig” para indicar el origen. En los casos que
sea necesario se usarán nombres como “val”, para indicar un valor cualquiera.

A continuación una tabla que presenta las principales instrucciones de transferencia de datos, su instrucción,
uso y ejemplos.

Tipo de
Instrucción Uso Ejemplo
instrucción
MOV dest,orig Copia el contenido de orig a dest mov eax, ebx
Transferencia PUSH val Inserta val en el stack push eax
de datos POP val Extrae el valor de stack y lo deja en val pop eax
LEA dest,orig Copia en dest el valor referido por orig LEA DI, MENSAJE
Realiza la operación AND bit a bit entre dest y AND eax, ebx
AND dest, orig
orig, dejando el resultado en dest
Realiza la operación OR bit a bit entre dest y OR eax, ebx
OR dest, orig
orig, dejando el resultado en dest
NOT val Realiza la operación NOT bit a bit para val. NOT ebx
NEG val Realiza la negación complemento dos de val NEG ebx
Manejo de Realiza un desplazamiento hacia la izquierda SHL eax, 5
SHL val, contador
bits de val en la cantidad indicada por contador
Realiza un desplazamiento hacia la derecha SHR eax, 10
SHR val, contador
de val en la cantidad indicada por contador
Rota hacia la derecha los bits de val en la ROR eax, ebx
ROR val, contador
cantidad indicada por contador
Rota hacia la izquierda los bits de val en la ROL eax,5
ROL val, contador
cantidad indicada por contador
Suma dest y orig bit a bit, dejando el ADD eax, 3
ADD dest, orig
resultado en dest
Resta dest y orig bit a bit, dejando el SUB eax, 5
SUB dest, orig
resultado en dest
INC val Incrementa en 1 el valor en val INC eax
DEC val Decrementa en 1 el valor en val DEC ebx
Multiplicación entera de dest y orig. Se IMUL eax, val
Aritméticas
IMUL dest, orig almacena el resultado en dest y este
debe ser un registro de 32 bits
Multiplicación entera de orig y val. Se IMUL eax, ebx, 4
almacena el resultado en dest y este
IMUL dest, orig, val
debe ser un registro de 32 bits. Val debe
ser una constante
IDIV val Ver explicación al final de esta tabla* IDIV eax
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 19

Circuitos y lenguaje de máquina


Transfiere el control de flujo del START:
JMP label programa a la ubicación de memoria JMP START
indicada por label
Realiza la transferencia de control del SUB eax, 1
Jcondicion label
programa a label si la instrucción JZ ZERO
je label (jump if equal) inmediata anterior cumple alguna …
jne label (jump if not condición. También puede acceder al …
equal) registro especial “machine status word” …
ZERO:
jz label (jump if zero)

jg label (jump if …
greater than)
jge label (jump if
greater than or equal)
jl label (jump if less
than)

Control de
flujo jle label (jump if less
than or equal)

Compara los dos valores indicados y CMP eax, 10


almacena el resultado en el registro JE PASO
CMP val1, val2
especial “machine status word” …
PASO:
Implementa el llamado a SWAP:
subrutina/función entregando el …
control de flujo del programa en la …
CALL label
posición label. Antes de transferirlo, se RET
guarda en el stack la posición actual del
código CALL swap
Implementa la salida de una Ver ejemplo anterior
subrutina/función, entregando el
RET
control del flujo a la posición
almacenada en el stack.

*IDIV val
La instrucción IDIV merece una mención especial porque tiene un funcionamiento que no puede ser
explicado en pocas líneas.

Esta instrucción utiliza un solo operando (divisor) con signo y este puede ser 1 byte (8-bits), 1 word (16-bits)
o 1 double-word (32-bits), ya sea a través de un registro especial o a través de un área de memoria directa.
Cualquiera sea el caso, el uso de registros con el dividendo es de la siguiente forma:
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 20

Circuitos y lenguaje de máquina


Tamaño
Dividendo Cuociente Resto Ejemplo
Operando/Divisor
; Se calculara -21/5
MOV AX, -21
MOV BH, 5
IDIV BH
; AL = -4 y AH = -1

8 bits (byte) AX AL AH
; idem al caso anterior pero se usará un área
de memoria
DIVISOR DB 5
MOV AX, -21
IDIV DIVISOR
; AL = -4 y AH = -1
; Se calculara -21/5
MOV AX, -21
MOV DX, -1
; Lo anterior porque la representación
binaria de -21 (32-bits)
; es: 11111111111111111111111111101011
que al separarlo en
16 bits (word) DX:AX AX DX ; dos grupos de 16 bits queda como
1111111111111111 y
; 1111111111101011, que en decimal
corresponden a -1 y -21
; respectivamente
MOV BX , 5
IDIV BX
; AX = -4 y DX = -1
; Se calculara -21/5
MOV EAX, -21
MOV EDX, -1
; Valga la misma explicación de la
32 bits (dword) EDX:EAX EAX EDX separación binaria del
; ejemplo anterior
MOV EBX, 5
IDIV EBX
; EAX = -4 y EDX = -1

Tener en consideración que el registro que almacena el dividendo, el cuociente y resto son fijos y no
cambian.

En los casos en que la división se realice sobre números sin signo, se debe tener cuidado de inicializar DX y
EDX con ceros antes de ejecutar la instrucción, o se tendrán valores equivocados.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 21

Circuitos y lenguaje de máquina


EJEMPLO

A continuación veremos ejemplos de programación assembler, presentando varias soluciones equivalentes para
una misma instrucción.

Ejemplo 1
Asignar un valor 1 a un registro e incrementarlo en 2

Solución 1 Solución 2 Solución 3


mov ax,1 mov ax, 1 mov ax, 1
add ax, 1 add ax, 2 inc ax
add ax, 1 inc ax

Ejemplo 2
Asignar el valor 10 al registro ax y multiplicarlo por 4

Solución 1 Solución 2
mov eax, 10 mov ax, 10
imul eax, 4 shl ax, 2

Notar que para el primer ejemplo se utilizó el registro eax y en el segundo el registro ax. Esto porque la instrucción
IMUL requiere que el registro utilizado debe ser de 32-bits (eax), en cambio ax es un registro de 16-bits

Para la solución 3, se debe considerar la representación binaria del valor 10 (1010 = 2**3 + 2**1). Si se aplica la
instrucción SHL en dos posiciones quedaría como 101000 = 40 (2**5 + 2**3). El multiplicando es 4, cuya
representación binaria es 100 o 2**2. Luego, el SHIFT a la izquierda debe ser de 2 posiciones binarias (el
exponente nos entrega ese valor). Si lo hubiéramos multiplicado por 8 (1000 = 2**3), entonces el SHIT a la
izquierda seria de 3 posiciones.

El símbolo “**” se refiere a la operación matemática potencia.

Ejemplo 3
Hacemos un ciclo que se inicia con el valor 10, decrementando en 1 y hasta que lleguemos al valor 0.

Solución 1
mov cx, 10 Asignamos el valor 10 al registro cx
ciclo: Definimos el inicio del ciclo con el label “ciclo”
cmp cx, 0 Comparamos el valor del registro cx con 0. Eso modifica “machine status word”
Se verifica si “machine status word” indica que la comparación anterior es cero o no. Si es
jz finaliza
cero, hará un salto al label “finaliza”
Si no hubo salto al label “finaliza”, se ejecuta esta instrucción que realiza el decremento del
dec cx registro cx
Esto también se podría implementar con la instrucción “sub cx, 1”
jmp ciclo: Se ejecutara esta instrucción que indica un salto incondicional al label “ciclo”, para continuar.
Cuando se cumple la condición de que cx es cero, la ejecución del programa continua a partir
finaliza:
de acá.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 22

Circuitos y lenguaje de máquina


4. Modos de direccionamiento
Se entienden como la forma de accesar datos o código. El conocer los tipos de direccionamiento aclarará el
conjunto de instrucciones visto en el apartado 3 y su relación más cercana con los registros de uso especial.

Tipo de
Detalles Ejemplo
direccionamiento
Uno de los operandos es un registro. COUNT DB 1
TASA DB 3
De registro MOV eax,ebx
MOV dx, TASA
MOV COUNT, CL
Uno de los operandos es un valor constante o una BYTE_VALUE DB 150
Inmediato expresión. ADD BYTE_VALUE, 6
MOV AX, 45H
Algunos de los operadores hacen referencia directa a 0x1234:
memoria. El uso de [] es para indicar que se trata de una MOV [0x1234], AX
referencia a memoria absoluta y relativo al segmento de BYTE DB 2
Directo datos. Para el ejemplo, la dirección de memoria real estaría MOV BYTE, 3
almacenada en DS + 0x1234.
En el segundo ejemplo, la dirección de memoria de BYTE se
resuelve como DS + BYTE.
Para este caso, la dirección de memoria está almacenada en MOV AX, 0x1234
Registro Indirecto un registro. Por ello, se debe utilizar [] sobre el registro que MOV [AX], BX
contiene la dirección de memoria.
Es muy parecido al modo de direccionamiento directo pero TABLA DB 1, 2, 3, 4,
se utiliza offset para direccionar elementos. 5
Directo con offset
Ambos ejemplos referencian equivalentemente al tercer MOV CL, TABLA + 2
elemento de TABLA. MOV CL, TABLA[2]
Se utiliza generalmente para variables tipo array o lista de TABLA2 DW 0, 0, 0, 0
elementos.
Para el ejemplo, [TABLA2] se resuelve como la dirección de MOV EBX, [TABLA2]
memoria real de la definición de TABLA2. MOV [EBX], 100
De memoria El primer MOV equivale a asignar 100 al primer elemento de ADD EBX, 2
indirecto TABLA2 o equivalentemente TABLA2[0]. MOV [EBX], 36
Con ADD se cambia la dirección en EBX a dos bytes
adicionales.
EL ultimo MOV asigna el valor 36 a el segundo elemento del
array, o equivalentemente a TABLA2[1].
Se utiliza el registro SI/DI para índice. MOV [BX + SI], BP
Para este ejemplo, el valor de [BX + SI] se resuelve como DS
Base más índice
+ BX + SI y eso identifica el valor de memoria real a la que se
copiara el contenido del registro BP.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 23

Circuitos y lenguaje de máquina


Se utiliza un registro y un offset fijo. MOV CL, [BX + 4]
Registro relativo
En este ejemplo, el valor a leer esta en DS + BX + 4
En este caso se usa una combinación de direccionamientos MOV TABLA2[BX +
Base relativa más anteriores. SI], DX
índice En este ejemplo, la dirección de memoria en que se
guardara un valor se resuelve como DS + TABLA2 + BX + SI

5. Lenguaje ensamblador de bajo y alto nivel


El lenguaje que hemos revisado hasta ahora es reconocido como lenguaje ensamblador de bajo nivel.
Algunas características del lenguaje ensamblador de alto nivel o HLA son:
I. Es más abstracto.
II. No requiere el conocimiento ni manejo de toda la teoría vista hasta ahora como:
III. Registros
IV. Segmentos
V. modos de direccionamiento de datos o memoria
VI. Permite escribir en pocas líneas un código mucho más complejo.
VII. Utiliza macros que se resuelven en código de bajo nivel.

Podemos resumir en la siguiente tabla la comparación de ambos lenguajes.

Lenguaje assembler de bajo


Atributo Lenguaje assembler de alto nivel
nivel
Requiere vasto conocimiento en
SI NO
los detalles del lenguaje
Muchas líneas de código para
SI NO
realizar una tarea
NO
Mayor abstracción en el código SI
Se requiere mucho detalle
La conversión del código en NO
assembler a código de maquina SI Esto por la abstracción al
binario genera código reducido programar y al utilizar macros
SI
El detalle en la programación les
Es más utilizado por hackers NO
permite controlar de mejor
forma condiciones de borde.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 24

Circuitos y lenguaje de máquina


Ejemplo

A continuación, haremos la comparación de un programa que escribe “Hola mundo” en ambos lenguajes
assembler.

Código en assembler de bajo nivel

section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

mov eax,1 ;system call number (sys_exit)


int 0x80 ;call kernel

section .data
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string

Código en assembler de alto nivel


program HelloWorld;
#include("stdlib.hhf")

begin HelloWorld;

stdout.put( "Hello World" nl );

end HelloWorld;

APORTE A TU FORMACIÓN

Los temas presentados en este módulo representan una enorme utilidad para la vida laboral. Si bien es posible que
ustedes no tengan necesidad de programar en lenguaje assembler en sus lugares de trabajo, si tendrán que utilizar
los Diagramas de Flujo (DDFs) ya sea mentalmente o en papel para documentar su trabajo.

Mientras que el álgebra de Bool visto a través de las tablas de verdad, será utilizado a lo largo de toda su vida
laboral, en la programación con cualquier lenguaje.
Área: NEGOCIOS M1
Curso:ARQUITECTURA DE COMPUTADORES Pág. 25

Circuitos y lenguaje de máquina


Bibliografía

Obligatoria
Prieto, E. A., Lloris, R. A., & Torres, C. J. C. (2006). Introducción a la informática (4a. ed.). Madrid, ES: McGraw-Hill
España. Capítulos 7 y 8.
http://site.ebrary.com/lib/ippsp/reader.action?ppg=232&docID=10693150&tm=1496162051116

Complementaria
Prieto, E. A., Lloris, R. A., & Torres, C. J. C. (2006). Introducción a la informática (4a. ed.). Madrid, ES: McGraw-Hill
España. Capítulos 4 al 6.
http://site.ebrary.com/lib/ippsp/reader.action?ppg=100&docID=10693150&tm=1496162138216

Rocabado, M. S. H., & Arias, F. D. A. (2009). Arquitectura y organización de la computadora: microprocesadores y


programación assembler. La Plata, AR: D - Editorial de la Universidad Nacional de La Plata. Capítulo 4.
http://site.ebrary.com/lib/ippsp/reader.action?ppg=25&docID=11200895&tm=1496162199106

También podría gustarte