Vous êtes sur la page 1sur 17

UNIVERSIDAD NACIONAL PEDRO RUIZ GALLO

ESCUELA PROFECIONAL DE INGENIRIA DE SISTEMAS

ARQUITECTURA DE COMPUTADORAS

TEMA: LENGUAJE ENSAMBLADOR

INGENIERO: Oscar Enrique Salazar Carbonel.

ALUMNOS : Jhonny Sanchez Herrera.

Fran Fernández Alarcón.

Juan Santiesteban Ipanaque.


1. Lenguaje ensamblador

1.1. Lenguaje de máquina


Cada tipo de CPU entiende su propio lenguaje de máquina. Las instrucciones
en lenguaje de máquina son números almacenados como bytes en
memoria. Cada instrucción tiene su propio y único código llamado código.

El lenguaje de máquina es muy difícil de programar directamente. Descifrar


el significado de las instrucciones codificadas numéricamente es tedioso
para los humanos. Por ejemplo, la instrucción que suma los registros EAX
y EBX y almacena el resultado en EAX está codificada por los siguientes
códigos hexadecimales.
03 C3

Esto no es obvio. Afortunadamente, un programa llamado ensamblador


pue-
de hacer este aburrido trabajo para el programador.

1.2. Lenguaje ensamblador


Un programa Escrito en lenguaje ensamblador es almacenado como texto
(tal como programas de alto nivel). Cada instrucción representa
exactamente
una instrucción de la máquina. Por ejemplo, la instrucción de suma descrita
arriba podría ser representada en lenguaje ensamblador como:
add eax, ebx
Acá el significado de la instrucción es mucho más claro que el código de la
máquina. La palabra add es el nemónico para la instrucción de suma. La
forma general de una instrucción de ensamblador es:
mnemonico operando(s)
Un ensamblador es un programa que lee un archivo de texto con
instrucciones de ensamblador y convierte el ensamblador en código de
máquina. Los
compiladores son programas que hacen conversiones similares para
lenguajes
de programación de alto nivel. Un ensamblador es mucho más simple que
un
compilador. Cada instrucción de lenguaje ensamblador representa una sola.

instrucción de la máquina. Las instrucciones de un lenguaje de alto nivel son


mucho más complejas y pueden requerir muchas instrucciones de máquina.
Otra diferencia importante entre los lenguajes ensamblador y de alto
nivel es que debido a que cada tipo de CPU tiene su propio lenguaje de
máquina, también tiene su propio lenguaje ensamblador. Trasladar
programas entre arquitecturas de computador diferentes es mucho más
difícil que en un lenguaje de alto nivel.
En los ejemplos de este libro se usa Netwide Assembler o NASM.
Está disponible libremente en Internet (vea el prefacio para la URL). Los
ensambladores más comunes son el ensamblador de Microsoft (MASM) y el
de Borland (TASM). Hay algunas diferencias en la sintaxis del ensamblador
de NASM, MASM y TASM.
2. Campo de Código

2.1. Operandos de las instrucciones


Los códigos de las instrucciones de máquina tienen una variedad de tipos
y operandos; sin embargo, en general cada instrucción en sí misma tiene un
número fijo de operandos (0 a 3). Los operandos pueden tener los
siguientes
tipos:
registro: Estos operandos se refieren directamente al contenido de los
registros de la CPU.
memoria: Estos se refieren a los datos en la memoria. La dirección de
los datos pueden ser una constante escrita en la instrucción o puede
ser calculada usando los valores de los registros. Las direcciones son
siempre desplazamientos relativos al comienzo de un segmento.
inmediato: Estos son valores fijos que están listados en la instrucción en
sí misma. Ellos son almacenados en la instrucción en si misma (en el
segmento de código), no en el segmento de datos.
implícito: Estos operandos no se muestran explícitamente. Por ejemplo, la
instrucción de incremento a˜ nade uno a un registro o a memoria. El
uno está implícito.
2.2 instrucciones básicas

La instrucción esencial es MOV. Ella translada datos de un lugar a otro


(como el operador de asignación en un lenguaje de alto nivel). Toma dos
operandos:
mov dest, src
El dato especificado por src es copiado a dest. Una restricción es que los dos
operandos no pueden ser operandos de memoria. Esto señala otra
peculiaridad del ensamblador. Hay a menudo algunas reglas arbitrarias
sobre cómo
se usan las instrucciones. Los operandos deben tener el mismo tama˜ no.
El
valor de AX no puede ser almacenado en BL.
Acá hay un ejemplo (los; inician un comentario)
mov eax, 3; almacena 3 en el registro EAX (3 es el operando inmediato)
mov bx, ax; almacena el valor de AX en el registro BX
La instrucción ADD se usa para sumar enteros.
add eax, 4; eax = eax + 4
add al, ah; al = al + ah

La instrucción SUB resta enteros.


sub bx, 10; bx = bx - 10
sub ebx, edi; ebx = ebx - edi
Las instrucciones INC y DEC incrementan o decrementan valores en uno.
Ya que el uno es un operando impl´ıcito, el código de de máquina para INC
y el DEC es más peque˜ no que los de las instrucciones ADD y SUB.
inc ecx; ecx++
dec dl; dl—

2.3. Directivas

Una directiva es un artificio del ensamblador no de la CPU. Ellas se usan


generalmente para decirle al ensamblador que haga alguna cosa o
informarle
al ensamblador de algo. Ellas no se traducen en código de máquina. Los
usos
comunes de las directivas son:
• Definir constantes
• Definir memoria para almacenar datos en ella
• Definir la memoria para almacenar datos en ella
• Agrupar la memoria en segmentos
• Incluir código fuente condicionalmente
• Incluir otros archivos
El código de NASM pasa a través de un preprocesador tal como C.
Tiene muchas de las órdenes del preprocesador tal como C. Sin embargo,
las directivas del preprocesador de NASM comienzan con un como en C.
directiva equ
La directiva equ se puede usar para definir un símbolo. Los símbolos son
constantes con nombre que se pueden emplear en el programa
ensamblador.
El formato es:
símbolo equ valor
Los valores de los símbolos no se pueden redefinir posteriormente.
La directiva%define
Esta directiva es parecida a la #define de C. Se usa normalmente para
definir macros tal como en C.
%define SIZE 100
mov eax, SIZE

4.EJEMPLO DE CODIGO FUENTE


4.1 Ensamble, enlace y ejecución Compilación del código
fuente

• Escrito el código fuente de un programa en ensamblador, éste es


solamente un texto en código ASCII.
• Es muy fácil editar, modificar, añadir o eliminar código de lo que será
realmente el programa.
• Este texto ha de ser convertido a su equivalente en códigos de
operaciones del microprocesador, por lo que se ha de "compilar" y
"enlazar".
• Para llevar a cabo estas operaciones, disponemos de ensambladores
como MacroAssembler o TurboAssembler.
• MacroAssembler dispone de los programas MASM y LINK, que compilan
y enlazan al archivo fuente respectivamente. Compilación
• Existen varios compiladores como son MASM y TASM para ambiente
Windows así como NASM y GAS para ambientes Linux.
• Un compilador se encarga de comprobar los errores de sintaxis de un
código fuente, además de algunos detalles del código, como detectar la
presencia o no de un segmento de pila.
• Tras la revisión de la sintaxis, se procede a la traducción de sus
sentencias a un archivo objeto (.OBJ), el cual aún no es un ejecutable
completo.
• Esto nos permite preparar varios módulos por separado, para después
enlazarlos en el programa .EXE final.
• El uso de módulos ahorra el tener que recompilar rutinas cada vez que
hay una modificación en el código.
• La sintaxis completa de MASM es la siguiente:
MASM archivo.asm, archivo.obj,archivo.lst,archivo.crf Donde: archivo.asm
-> Nombre del archivo con el código fuente archivo.obj -> Nombre del
archivo objeto a generar. archivo.lst -> Nombre del archivo listado.
archivo.crf -> Nombre del archivo de referencias cruzadas.
• Un archivo listado contiene el código máquina y el puntero de programa
asociado a cada sentencia.
• Además contiene los posibles errores que se pudieran generar durante
la compilación, por lo que nos permitiría realizar un seguimiento del
mismo para detectar errores y depurar.
• Un archivo de referencias cruzadas contiene la información sobre cada
símbolo o constante, además de las sentencias donde se hace referencia.
• La sintaxis más rápida y normal que se utiliza es la siguiente: MASM
archivo;
• En este caso, genera, automática el archivo objeto (.OBJ) con el mismo
nombre que el archivo fuente (en el caso de no haber errores).
• Si no se especifica el punto y coma del final, el compilador preguntará,
uno a uno, el nombre de cada uno de los archivos citados anteriormente.
APUNTES DE LENGUAJE ENSAMBLADOR
• Si archivo fuente contuviese errores, se especificaría el número de línea
y el error que ha producido dicha línea.
• Al final, se informaría sobre el número de avisos (Warnings Errors) y el
número de errores graves (Severe errors) que contiene el fuente. Enlace o
LINK
• Al igual que con los compiladores, existen ligadores para ambiente
windows como son el LINK que se usa con le compilador MASM y el TLINK
que se utiliza con el compilador TASM.
• Los programas LINK se encargan de enlazar los códigos objetos,
completar las referencias y construir el archivo ejecutable (.EXE).
• La sintaxis del link o enlazador para el compilador MASM es la siguiente:
LINK
archivo.obj+archivo.obj..,archivo.exe,archivo.map,archivo.lib,archivo.lib...
archivo.obj+archivo.obj... -> Lista de los archivos objeto que conformarán
el archivo ejecutable. archivo.exe -> Nombre del archivo ejecutable a
generar. archivo.map -> Nombre del archivo mapa.
archivo.lib+archivo.lib... -> Lista de los archivos de librería, de los cuales
utilizan rutinas nuestro programa.
• Un archivo mapa contiene toda la información acerca de los segmentos
generados en el programa (comienzo, final, nombre, tamaño...).
• Los archivos librerías son archivos objeto con rutinas preparadas para
ser utilizadas en nuestros programas, con sólo hacer referencia a éstas.
[jjf] Ejecución o corrida del programa
• Una vez ya realizado el ensamblado y el enlace se obtiene un archivo
.EXE.
• El cual podemos ejecutar únicamente llamando al archivo con extención
.EXE y dando enter en la computadora, con lo cual podemos ver la corrida
de nuestro programa en pantalla por lo general.
• La sintaxis para la ejecución es la siguiente: archivo.exe
5.CAMPO DE OPERANDOS Y DATOS
El ensamblador MPASM (distribuidor por micro chip) soporta los sistemas de
numeración decimal, hexadecimal, octal, binario y ASCII.
Los nemónicos que tengan una constante como operando deberían incluirla respetando
la sintaxis que se indica a continuación
TIPO SINTAXIS
Decimal D’<valor>’ d’<valor>’ .’valor’
Hexadecimal H’<valor>’ h’<valor>’ OX’<valor>’
<valor>H <valor>h
Octal O’<valor>’ o’<valor>’
Binario B’<valor>’ b’<valor>’
ASCII A’<carácter>’ a’<carácter>’ ‘<carácter>’
Cadena “<cadena>”

Las constantes hexadecimales que empiecen por una letra deben ir precedidas de un cero para
no confundirlas con una etiqueta. Ejemplo movlw 0F7h

6.JUEGO DE INSTRUCCIONES
Es un juego de instrucciones muy simples. Procesador RISC
La mayoría de las instrucciones se ejecutan en 4 ciclos de reloj; los saltos y
llamadas a subprogramas se ejecutan en 8 (no se aprovecha pipeline)
Todas las instrucciones tienen la misma longitud en la gama media: 14 bits
Por lo tanto el cálculo del tiempo de ejecución y de lo que ocupa un
programa resulta simple
Las instrucciones se pueden clasificar atendiendo a dos criterios
- Formato
- Funcionalidad
JUEGO DE INSTRUCCIONES SEGÚN SU FORMATO
- Orientadas a byte
- Orientadas a bit
- Literales y de control
1 Orientadas a byte
¿Cómo se escriben en ensamblador?
- Operación: Nemónico reservado
- Fuente: 7 bits o algo que pueda sustituir a 7 bits, si es mayor se
trunca
- Destino: 1 bit o algo que pueda sustituir a un bit, si es mayor se
trunca
¿Qué hacen?
W Opera con Dir, operand fuente que puede ser d=0  w o
D=1Dir.fuente
¿Cómo se codifican?
13 8 7 6 0

C5 C4 C3 C2 C1 C0 d F6 F5 F4 F3 F2 F1 F0
Código operación (6 bits) * Dirección operando fuente (7 bits)
 Destino resultado (1bit)
TABLA DE RESUMEN DE INSTRUCCIONES
8.- El ciclo de instrucción
• Un ciclo de instrucción es el tiempo que se tarda en ejecutar una instrucción (salvo
las instrucciones de salto) en el micro controlador. En los PIC16, un ciclo de
instrucción dura 4 ciclos de reloj.
• En una primera etapa, la instrucción es traída a la CPU. Esto lleva un ciclo de
instrucción TCY.
• En la segunda etapa se ejecuta la instrucción. Esto lleva otro TCY.
• No obstante, debido al solapamiento (pipelining ó entubado) de traer la instrucción
actual y ejecución de la instrucción previa, una instrucción se trae y otra se ejecuta
cada TCY

Pudiera haber un ciclo de instrucción de retardo si el resultado de ejecutar la instrucción


anterior modifica el contenido del Contador de Programa (Ej: GOTO ó CALL). Esto
implica suspender el entubado (pipelining) de las instrucciones durante un ciclo para
que la instrucción a donde se salta se traiga a la CPU.
9. Directivas más usadas en lenguaje ensamblador

Directivas. Pseudoinstrucciones que controlan el proceso de ensamblado del programa,


pero no son parte del código. Son indicaciones al programa ensamblador de cómo tiene
que generar el código máquina
• Controlan el proceso de ensamblado del programa, pero no son parte del
mismo (también se conocen como pseudoinstrucciones).
• Hay más de 50 directivas reconocidas por MPASM.
• Las más usadas:

END
Es la única directiva obligatoria. Indica al ensamblador dónde debe
detener el proceso. Debe colocarse en la última línea del programa.

<etiqueta> EQU <expresión>


El valor <expresión> es asignado a <etiqueta>. Estas directivas se
suelen colocar al principio del programa y habitualmente se usan
para definir constantes y direcciones de memoria.

[<etiqueta>] ORG <expresión>


Las instrucciones del código fuente que siguen a esta directiva se
ensamblan a partir de la posición indicada por <expresión>.

CONFIG <expresión> [& <expresión> & ... & <expresión>]


Permite indicar la configuración elegida para la grabación del PIC.
Ejemplo: __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

LIST P=16F877
Indica el tipo de micro controlador utilizado.

INCLUDE <p16F877.inc> o INCLUDE “p16F877.inc”


Incluye en el programa un fichero donde se definen las etiquetas
con las que se nombra a los diferentes registros y sus bits. Este
fichero se encuentra en el directorio principal del programa
ensamblador. Puede usarse esta directiva para incluir cualquier
otro fichero (¡Ojo! El fichero de inclusión no puede terminar con
una directiva END).

DT <expr1> [, <expr2>, ... , <exprN>]


Genera una instrucción retlw por cada expresión que incluya la
directiva. Si la expresión es del tipo cadena, se generará una
instrucción retlw por cada carácter de la misma.

10. Organización de la memoria interna (Programa y datos)

El espacio de Memoria Interna de Datos funcionalmente es la


memoria de datos más importante, ya que ahí es donde residen
cuatro bancos de registros de propósito general; la pila o stack del
programa; 128 bits de los 256 bits de un área de memoria
direccionable por bit y todas las variables y estructuras de datos
operadas directamente por el programa. El tamaño máximo de la
Memoria Interna de Datos es de 256 bytes.
Contiene un espacio para los denominados Registros de Funciones
Especiales destinado para los puertos de entrada/salida,
temporizadores y puerto serie del circuito integrado. Estos registros
incluyen al Stack Pointer; al registro de la palabra de estado del
programa y al Acumulador. La cantidad máxima de Registros de
Funciones Especiales es 128.
Todos los Registros de Funciones Especiales tienen direcciones
mayores a 127 y se ubican en los 128 bytes superiores de la Memoria
Interna de Datos. Estas dos áreas de la Memoria Interna de Datos se
diferencian por el modo de direccionamiento usado para accesarlas.
Los Registros de Funciones Especiales solo se pueden accesar
usando el modo de direccionamiento Directo, mientras que los 128
bytes superiores solo se pueden accesar con el modo de
direccionamiento Indirecto.
Por otra parte, el espacio de Memoria de Bit se usa para almacenar
variables y banderas de un bit. El tamaño máximo de la Memoria de
Bit es de 256 bits, 128 de los bits comparten su espacio con 16 bytes
del espacio de la Memoria Interna de Datos y los otros 128 bits lo
hacen con los Registros de Funciones Especiales.
Memoria del programa
Memoria RAM de datos

MODOS DE DIRECCIONAMIENTO DE LA MEMORIA DE DATOS


• La memoria de datos está distribuida en 4 posibles bancos de 128 bytes cada uno.
•Existen 2 modos de direccionamiento para acceder a cualquiera de las posiciones de la
memoria de datos: Direccionamiento directo y Direccionamiento indirecto
• Direccionamiento directo: La posición de memoria con la que se trabaja viene
directamente definida en el código de la instrucción.
• Direccionamiento indirecto: La posición de memoria con la que se trabaja viene
definida por el contenido del registro FSR (Posición 04h, 84h, 104h ó 184h), es decir, el
registro FSR actúa como puntero de la posición de memoria con la que se pretende
operar

Vous aimerez peut-être aussi