Está en la página 1de 54

Maquinas y lenguajes

Ing. Billy Asturias


Historia del lenguaje de las computadoras

Los Computadores son herramientas muy útiles, pero por sí solos no pueden
actuar o tomar decisiones. Los programas son un conjunto de instrucciones
escritos en un lenguaje determinado, el cual consta de una sintaxis y una serie
de símbolos, donde cada uno cuenta con distintas funciones.
El lenguaje de un Computador se lo denomina leguaje de máquina, y consiste en
una codificación de instrucciones que puede realizar un procesador, la
codificación se realiza mediante la representación binaria. Es decir, cada
instrucción era un conjunto de unos y ceros.
En la década del 40, surgen representaciones para estas instrucciones. Ya no eran
unos y ceros, sino que se los representaba con palabras más fáciles de recordar
(instrucciones mnemónicas) como MOVE, LDA, ADD, etc.
La relación con el código binario era directa, por cada instrucción MNEMONICA,
existe una instrucción en binario y viceversa. Así se construyen los primeros
traductores que pasarán la instrucción MNEMONICA a Binario. Estos traductores
recibieron el nombre de ensambladores, y se convirtieron en el primer lenguaje
de los Computadores.
Entre 1954 y 1957, John Bakus y sus colegas de IBM desarrollaron FORTRAN, el
cual introdujo muchas ventajas sobre el ensamblador, e hizo mas claras las
operaciones básicas. La idea era hacer la programación más cercana al lenguaje
natural humano.
Poco tiempo después en 1958, surge ALGOL-58, que unía la sintaxis de FORTRAN y
mejoraba la notación.
En 1960, aparece COBOL, este lenguaje tenía como objetivo ser utilizado en el
procesamiento de datos a gran escala. Inmediatamente fue adoptado en bancos,
compañías y dependencias oficiales.
 En 1965, John Kemey y Thomas Kurtz crean BASIC, con la intención de que se
convierta en un lenguaje de enseñanza.
 En 1970, el profesor Niklaus Wirth crea el lenguaje PASCAL a partir del
ALGOL-58, también con fines didácticos.

En la misma época nace C, un lenguaje que conjuga estructuración,


formalismo y sencillez. Con el se desarrolla el sistema operativo UNIX,
también surge PROLOG, del cual se esperaba poder desarrollar inteligencia
artificial.
El manejo de bases de datos llevó al desarrollo de un lenguaje proposicional
llamado base de datos relacional, la implementación del lenguaje fue
desarrollado por IBM con el SQL. En los años 80, Smalltalk, implementó la
programación orientada a objetos, con el SIMULA-67, el concepto fue
revolucionario y así muchos lenguajes lo fueron incorporando como C, que con la
orientación a objetos paso a llamarse C++, de SQL surge dBase, del cual surgieron
copias como por ejemplo Fox, Clipper, RBASE, Oracle, INFORMIX, etc., al
conjunto de estos programas se los denominó 4GL, (Lenguajes de Cuarta
Generación). Actualmente los lenguajes se orientan al contenido multimedia, a
internet y los dispositivos móviles.
Lenguaje Máquina
1 y 0: los dos números que revolucionaron el mundo
Aunque sea difícil creerlo estos dos números lograron revolucionar al mundo y fueron la base
para lo que hoy conocemos en cuanto a dispositivos electrónicos se refiere, el 1 y el 0
conforman el denominado Sistema Binario y es el lenguaje usado por las computadoras, el
“Lenguaje Maquina”.
Los dispositivos electrónicos trabajan con dos niveles de voltaje -Encendido y Apagado- -1 y 0-
respectivamente. Pero ¿Que es en si el Lenguaje Maquina?.
El Lenguaje Maquina es el conjunto de datos que la parte física de la computadora (Hardware)
es capaz de comprender e interpretar “El Código Binario” comprendido por los Valores 0 y 1
con tensiones comprendidas entre 0 y 4 Voltios y 4 y 5 Voltios respectivamente, la secuencias
de estos valores formaran cadenas de información para que se realice una instrucción.
El lenguaje máquina es el único lenguaje que puede ejecutar una computadora. El lenguaje
de máquina es un código que es interpretado directamente por el microprocesador. El
lenguaje está compuesto por un conjunto de instrucciones ejecutadas en secuencia (con
eventuales cambios de flujo causados por el propio programa o eventos externos) que
representan acciones que la máquina podrá tomar. Un lenguaje máquina es específico de
cada arquitectura de computadora.
Todo código fuente en última instancia debe llevarse a un lenguaje máquina mediante el
proceso de compilación o interpretación para que la computadora pueda ejecutarlo.
El lenguaje de máquina o código máquina es el sistema de códigos directamente interpretable
por un circuito microprogramable, como el microprocesador de una computadora o el
microcontrolador de un autómata. Este lenguaje está compuesto por un conjunto de
instrucciones que determinan acciones al ser tomadas por la máquina. Un programa consiste
en una cadena de estas instrucciones más un conjunto de datos sobre el cual se trabaja. Estas
instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo
causados por el propio programa o eventos externos. El lenguaje de máquina es específico de
la arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser
similar entre arquitecturas distintas.
Los circuitos microprogramables son sistemas digitales, lo que significa que trabajan con dos
únicos niveles de tensión. Dichos niveles, por abstracción, se simbolizan con los números 0 y
1, por eso el lenguaje de máquina sólo utiliza dichos signos. Esto permite el empleo de las
teorías del álgebra booleana y del sistema binario en el diseño de este tipo de circuitos y en
su programación.
Claude Elwood Shannon, en su libro Analysis of Relay and Switching Circuits, y
con sus experiencias en redes de conmutación, sentó las bases para la aplicación
del álgebra de Boole a las redes de conmutación. Una red de conmutación es un
circuito de interruptores eléctricos que al cumplir ciertas combinaciones
booleanas con las variables de entrada, define el estado de la salida. Este
concepto es el núcleo de las puertas lógicas, las cuales son, por su parte, los
ladrillos con que se construyen sistemas lógicos cada vez más complejos.
Shannon utilizaba el relé como dispositivo físico de conmutación en sus redes,
dado que el relé, a igual que una lámpara eléctrica, posee dos estados: activado
(encendido) o desactivado (apagado).
Teoría de autómatas
Autómatas finitos
Un autómata finito (AF) o máquina de estado finito es un modelo computacional que realiza
cómputos en forma automática sobre una entrada para producir una salida. Este modelo está
conformado por un alfabeto, un conjunto de estados finito, una función de transición, un
estado inicial y un conjunto de estados finales. Su funcionamiento se basa en una función de
transición, que recibe a partir de un estado inicial una cadena de caracteres pertenecientes
al alfabeto (la entrada), y que va leyendo dicha cadena a medida que el autómata se desplaza
de un estado a otro, para finalmente detenerse en un estado final o de aceptación, que
representa la salida.
Funcionamiento de los autómatas finitos

El funcionamiento de los autómatas finitos consiste en ir pasando de un estado a


otro, a medida que va recibiendo los caracteres de la palabra de entrada. Este
proceso puede ser seguido fácilmente en los diagramas de estados. Simplemente
hay que pasar de estado a estado siguiendo las flechas de las transiciones, para
cada carácter de la palabra de entrada, empezando por el estado inicial.
Este autómata finito está definido sobre el alfabeto Σ={0,1}, posee dos estados s1 y s2, y sus transiciones son δ(s1,0)=s2,
δ(s1,1)=s1, δ(s2,0)=s1 y δ(s2,1)=s2. Su estado inicial es s1, que es también su único estado final.
Los autómatas finitos se pueden representar mediante grafos particulares, también llamados diagramas de estados finitos,
de la siguiente manera:
Los estados Q se representan como vértices, etiquetados con su nombre en el interior.
Una transición δ desde un estado a otro, dependiente de un símbolo del alfabeto, se representa mediante una arista
dirigida que une a estos vértices, y que está etiquetada con dicho símbolo.
El estado inicial q0 se caracteriza por tener una arista que llega a él, proveniente de ningún otro vértice.
El o los estados finales F se representan mediante vértices que están encerrados a su vez por otra circunferencia.
Representación como tabla de transiciones

Otra manera de describir el funcionamiento de un


autómata finito es mediante el uso de tablas de
transiciones o matrices de estados. Dos posibles tablas
para el ejemplo de la imagen anterior podrían ser las
siguientes:
Autómatas de Pila

Puesto que los autómatas finitos no son suficientemente poderosos para aceptar los LLC, cabe
preguntarnos que tipo de autómata se necesitaría para aceptar los LLC. Una idea es agregar algo a los AF
de manera que se incremente su poder de calculo.
Para ser más concretos, tomemos por ejemplo el lenguaje de los paréntesis bien balanceados, que
sabemos que es propiamente LLC. ¿Qué máquina se requiere para distinguir las palabras de paréntesis
bien balanceados de las que tienen los paréntesis desbalanceados? Una primera idea podría ser la de una
maquina que tuviera un registro aritmético que le permitiera contar los paréntesis; dicho registro seria
controlado por el control finito, quien le mandaría símbolos I para incrementar en uno el contador y D para
decrementillo en uno. A su vez, el registro mandaría un símbolo Z para indicar que esta en cero, o bien N
para indicar que no está en cero. Entonces para analizar una palabra con paréntesis lo que haríamos sería
llevar la cuenta de cuántos paréntesis han sido abiertos pero no cerrados; en todo momento dicha cuenta
debe ser positiva o cero, y al final del cálculo debe ser exactamente cero. Por ejemplo, para la palabra
(())() el registro tomaría sucesivamente los valores 1, 2, 1, 0, 1, 0. Recomendamos al lector tratar de
diseñar en detalle la tabla describiendo las transiciones del autómata.
Funcionamiento de los Aut´omatas de
Pila (informal)
La pila funciona de manera que el ´ultimo carácter que se almacena en ella es el primero en
salir (“LIFO” por las siglas en inglés), como si empiláramos platos uno encima de otro, y
naturalmente el primero que quitaremos es el ultimo que hemos colocado. Un aspecto crucial
de la pila es que sólo podemos modificar su “tope”, que es el extremo por donde entran o
salen los caracteres. Los caracteres a la mitad de la pila no son accesibles sin quitar antes
los que están encima de ellos.
La pila tendrá un alfabeto propio, que puede o no coincidir con el alfabeto de la palabra de
entrada. Esto se justifica porque puede ser necesario introducir en la pila caracteres
especiales usados como separadores, según las necesidades de diseño del autómata. Al
iniciar la operación de un AP, la pila se encuentra vacía. Durante la operación del AP, la pila
puede ir recibiendo (y almacenando) caracteres, según lo indiquen las transiciones
ejecutadas. Al final de su operación, para aceptar una palabra, la pila debe estar nuevamente
vacía.
Conversiones a lenguaje de maquina

1. de decimal a hexadecimal
2. De hexadecimal a binario

El programa ensamblador lee la sentencia de arriba y produce su equivalente


binario en lenguaje de máquina
LENGUAJE DE BAJO
NIVEL
Niveles de los lenguajes

 Natural
 De Programación
 Compilado o Interprete
 De Maquina
Etapas de la Compilación
Existen dos tipos de lenguajes diferenciados: los lenguajes de bajo nivel y los lenguaje de alto
nivel. Los lenguajes más cercanos a la arquitectura hardware se denominan lenguajes de bajo
nivel y los que se encuentran más cercanos a los programadores y usuarios se denominan
lenguajes de alto nivel.
Lenguajes de bajo nivel
Son lenguajes dependientes de la máquina, el programa que se realiza con este tipo de
lenguajes no se pueden migrar o utilizar en otras maquinas.
Estos lenguajes como están diseñados a medida del hardware, aprovechan al máximo las
características del mismo.
HACE
Dentro de los lenguajes de bajo nivel están:
El lenguaje maquina, es el que da ordenes a la máquina, que son las operaciones
fundamentales para su funcionamiento.
El computador sólo entiende un lenguaje conocido como código binario o código máquina,
consistente en ceros y unos, que son las ordenes, y que sean fáciles de entender por el
hardware de la maquina. Este lenguaje es mucho más rápido que los lenguajes de alto
nivel.
La desventaja es que son bastantes difíciles de manejar y usar, además de tener códigos
fuente enormes donde encontrar un fallo es casi imposible.
El lenguaje ensamblador, es un derivado del lenguaje maquina y esta formado por
abreviaturas de letras y números. Con la aparición de este lenguaje se crearon los
programas traductores para poder pasar los
programas escritos en lenguaje ensamblador a lenguaje máquina.
Como ventaja, es que los códigos fuentes eran más cortos y los programas creados
ocupaban menos memoria.
Las desventajas de este lenguaje siguen siendo prácticamente las mismas que las del
lenguaje ensamblador, añadiendo la dificultad de tener que aprender un nuevo lenguaje
difícil de probar y mantener.
En este tipo de lenguajes se trabaja a nivel de instrucciones, es decir, su programación es
al más fino detalle, además, está completamente orientado a la máquina.
 Adaptación - Máxima entre programación y aprovechamiento del recurso de la
máquina.
 Velocidad - Máxima al contar con un acceso directo a los recursos, sin capas
intermedias.
 Portabilidad - Mínima por estar restringido a las especificaciones del fabricante.
 Abstracción - Mínima por depender completamente de la técnica del hardware.
 Uso - Requiere de la máxima atención y de una organización estructurada en base a los
planos del hardware y del objetivo del software.
Ventajas
Los lenguajes ensambladores presentan la ventaja frente a los lenguajes máquina de su
mayor facilidad de codificación y, en general, su velocidad de cálculo.
Inconvenientes
Dependencia total de la máquina lo que impide la transpirabilidad de los programas.
La formación de los programadores es más compleja que la correspondiente a los
programadores de alto nivel, ya que no sólo las técnicas de programación, sino también el
conocimiento del interior de la máquina.
Lenguajes de alto nivel

Son aquellos que se encuentran más cercanos al lenguaje natural que al lenguaje máquina. Se tratan
de lenguajes independientes de la arquitectura del ordenador. Por lo que, en principio, un programa
escrito en un lenguaje de alto nivel, lo puedes migrar de una máquina a otra sin ningún tipo de
problema. Estos lenguajes permiten al programador olvidarse por completo del funcionamiento
interno de la maquina/s para la que están diseñando el programa. Tan solo necesitan un traductor
que entiendan el código fuente como las características de la maquina. Suelen usar tipos de datos
para la programación y hay lenguajes de propósito general y de propósito especifico..

La evolución de los lenguajes de programación se puede dividir en 5 etapas o generaciones.


 Primera generación: lenguaje maquina.
 Segunda generación: se crearon los primeros lenguajes ensambladores.
 Tercera generación: se crean los primeros lenguajes de alto nivel. Ej. C, Pascal, Cobol…
 Cuarta generación. Son los lenguajes capaces de generar código por si solos, son los llamados
RAD, con lo cuales se pueden realizar aplicaciones sin ser un experto en el lenguaje. Aquí
también se encuentran los lenguajes orientados a objetos, haciendo posible la reutilización d
partes del código para otros programas. Ej. Visual, Natural Adobes…
 Quinta generación: aquí se encuentran los lenguajes orientados a la inteligencia artificial. Estos
lenguajes todavía están poco desarrollados. Ej. LISP.
Lenguajes de alto nivel:
 Ada
 ALGOL
 BASIC
 C++
 C#
 COBOL
 Fortran
 Java
 Lisp
 Modula-2
 Pascal
 Perl
 PHP
 PL/1
 PL/SQL
 Python
LENGUAJE ENSAMBLADOR
El lenguaje ensamblador, o assembler (en inglés assembly language y la abreviación asm), es
un lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que
representan instrucciones básicas para Los computadores, microprocesadores,
microcontroladores y otros circuitos integrados programables.
Implementa una representación simbólica de los códigos de máquina binarios y otras
constantes necesarias para programar una arquitectura de procesador y constituye la
representación más directa del código máquina específico para cada arquitectura legible por
un programador.
Cada arquitectura de procesador tiene su propio lenguaje ensamblador que usualmente es
definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los
pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de
memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto
específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con
la mayoría de los lenguajes de programación de alto nivel, que idealmente son portátiles.
Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje
ensamblador al código de máquina del computador objetivo. El ensamblador realiza una
traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas
a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel,
en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.

Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba
con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con
frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la
manipulación directa de hardware, alto rendimiento, o un uso de recursos controlado y
reducido. También es utilizado en el desarrollo de controladores de dispositivo (en
inglés, device drivers) y en el desarrollo de sistemas operativos, debido a la necesidad del
acceso directo a las instrucciones de la máquina. Muchos dispositivos programables (como los
microcontroladores) aún cuentan con el ensamblador como la única manera de ser
manipulados.
Características
 El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que
su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
 El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un
microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina
distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario
reescribirlo completamente.
 Los programas hechos por un programador experto en lenguaje ensamblador son generalmente
mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el
programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente
en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y
ocupan menos espacio que con lenguajes de alto nivel.
 Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por
un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy
ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje
ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los
lenguajes de alto nivel.
 También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se
interrumpa durante su ejecución.
Generalmente, un programa ensamblador (assembler en inglés) moderno
crea código objeto traduciendo instrucciones mnemónicas de lenguaje
ensamblador en opcodes, y resolviendo los nombres simbólicos para las
localizaciones de memoria y otras entidades.1 El uso de referencias simbólicas es
una característica clave del lenguaje ensamblador, evitando tediosos cálculos y
actualizaciones manuales de las direcciones después de cada modificación del
programa. La mayoría de los ensambladores también incluyen facilidades
de macros para realizar sustitución textual - ej. generar cortas secuencias de
instrucciones como expansión en línea en vez de llamar a subrutinas
Hay dos tipos de ensambladores basados en cuántos pasos a través de la fuente son necesarios
para producir el programa ejecutable:
 Los ensambladores de un solo paso pasan a través del código fuente una vez y asumen que
todos los símbolos serán definidos antes de cualquier instrucción que los refiera.
 Los ensambladores de dos pasos crean una tabla con todos los símbolos y sus valores en el
primer paso, después usan la tabla en un segundo paso para generar código. El
ensamblador debe por lo menos poder determinar la longitud de cada instrucción en el
primer paso para que puedan ser calculadas las direcciones de los símbolos.
Sintaxis del lenguaje ensamblador.
La sintaxis es la siguiente Nombre de la instrucción Operando 1, Operando 2, Operando 3,
Operando 4, ... El nombre de la instrucción está formada por 2 o 3 letras, los operandos
pueden ser registros, constantes o direcciones de memoria. La cantidad de operandos
dependerá de la instrucción. Por ejemplo:
MOV AL, [1000]
Esta instrucción indica que se copie el valor de la porción de la memoria que esté en la
ubicación 1000 (En hexadecimal) a la parte baja del registro AX (AL). Cuando un operando es
un valor de una dirección de memoria, ésta dirección se escribe entre corchetes, recordar
que el operando 1 es el destino y el operando 2 es el origen. Y cuando es una constante
dependerá del ensamblador, en el caso del debug (Un programa que sirve para crear y editar
aplicaciones que viene con el DOS) se interpretarán como hexadecimales, en los siguientes
ejemplos se interpretará que las constantes son números hexadecimales.
También se puede copiar el valor de un registro a otro
MOV AL, BL
En este caso se copia el valor de BL a AL Igualmente se puede copiar el valor de la parte baja
de un registro a la parte alta de otro registro
MOV CH, DL
Así como también operar con las partes altas
MOV AH, DH
Inclusive se puede copiar el valor de un registro a una dirección de memoria MOV [1000], AL
Instrucciones del leguaje ensamblador

Movimiento de datos con respecto a la memoria Las instrucciones que se


encargan de mover datos en relación con la memoria se pueden categorizar por
tareas específicas:
· Las que transfieren datos de un registro a otro o entre la memoria y los
registros.
· Las que preparan registros para accesar una localidad de memoria.
· Las que manipulan la pila.
· Las que mueven grandes bloques de datos.
· Las que interactúan con dispositivos periféricos a través de puertos.
La instrucción de movimiento mas común es “mov “ que requiere de dos operadores, su
sintaxis es:
mov destino, fuente.
El destino no puede ser el registro de segmentos CS, no se puede mover un valor inmediato a
un registro de segmentos para poder hacerlo utilice un registro intermedio como AX, ejemplo
Mov AX, 3
Mov DS, AX
Adicional a la instrucción “mov”, existen otras que operan bajo circunstancias diferentes con
el mismo propósito, la instrucción “xchg” intercambia el contenido de la fuente con el
destino. Otra instrucción útil es “xlat” (traslate), se utiliza comúnmente al trabjar con tablas
o arreglos, esta instrucción reemplaza el valor de AL por un nuevo valor tomado de la tabla
que se compone de un conjunto de localidades contiguas en memoria, y supone que el
registro BX contiene la dirección del primer elemento de la tabla.
En resumen: mov src, dest mov dest, src
El lenguaje ensamblador refleja directamente la arquitectura y las instrucciones en lenguaje
de máquina de la CPU, y pueden ser muy diferentes de una arquitectura de CPU a otra.
Cada arquitectura de microprocesador tiene su propio lenguaje de máquina, y en
consecuencia su propio lenguaje ensamblador ya que este se encuentra muy ligado a la
estructura del hardware para el cual se programa. Los microprocesadores difieren en el tipo y
número de operaciones que soportan; también pueden tener diferente cantidad de registros,
y distinta representación de los tipos de datos en memoria. Aunque la mayoría de los
microprocesadores son capaces de cumplir esencialmente las mismas funciones, la forma en
que lo hacen difiere y los respectivos lenguajes ensamblador reflejan tal diferencia.
Instrucciones de CPU
La mayoría de las CPU tienen más o menos los mismos grupos de instrucciones, aunque no
necesariamente tienen todas las instrucciones de cada grupo. Las operaciones que se pueden
realizar varían de una CPU a otra. Una CPU particular puede tener instrucciones que no tenga
otro y viceversa. Los primeros microprocesadores de 8 bits no tenían operaciones para
multiplicar o dividir números, por ejemplo, y había que hacer subrutinas para realizar esas
operaciones. Otras CPU puede que no tengan operaciones de punto flotante y habría que
hacer o conseguir bibliotecas que realicen esas operaciones.
Las instrucciones de la CPU pueden agruparse, de acuerdo a su funcionalidad, en:
Operaciones con enteros: (de 8, 16, 32 y 64 bits dependiendo de la arquitectura de la CPU, en los sistemas muy viejos
también de 12, 18, 24, 36 y 48 bits)
Estas son operaciones realizadas por la Unidad aritmético lógica de la CPU
 Operaciones aritméticas. Como suma, resta, multiplicación, división, módulo, cambio de signo
 Operaciones booleanas. Operaciones lógicas bit a bit como AND, OR, XOR, NOT
 Operaciones de bits. Como desplazamiento o shift lógico y rotaciones u Operadores a nivel de bits (hacia la derecha
o hacia la izquierda, a través del bit del acarreo o sin él)
Comparaciones
Operaciones de mover datos:
Entre los registros y la memoria: Aunque la instrucción se llama "mover", en la CPU, "mover datos" significa en realidad
copiar datos, desde un origen a un destino, sin que el dato desaparezca del origen.
Se pueden mover valores:
Desde un registro a otro
Desde un registro a un lugar de la memoria
Desde un lugar de la memoria a un registro
Desde un lugar a otro de la memoria
Un valor inmediato a un registro
Un valor inmediato a un lugar de memoria

También podría gustarte