Post on 28-Apr-2018
1
Semestre 6
Fascículo
3
Procesadores
Procesadores Semestre 6
Procesadores
Procesadores
Semestre 6 Procesadores
Tabla de contenido Página
Introducción 1
Conceptos previos 2
Logros 2
Mapa conceptual Fascículo 3 3
Lenguaje Ensamblador del microprocesador 3
Instrucciones para el Ensamble del Programa 3
Simulación del programa 5
Etiquetas del lenguaje Assembler 7
Directivas 9
Banderas 12
Operandos y direcciones 13
Stack 15
Formato de las instrucciones 17
Saltos Condicionales e Incondicionales 18
Convenciones en la escritura del código fuente 21
Actividad de trabajo colaborativo 25
Resumen 26
Bibliografía recomendada 27
Nexo 28
Seguimiento al autoaprendizaje 29
Créditos: 1
Tipo de asignatura: Teórico – Práctica
Procesadores Semestre 6
Procesadores
Copyright©2008 FUNDICIÓN UNIVERSITARIA SAN MARTÍN
Facultad de Universidad Abierta y a Distancia,
“Educación a Través de Escenarios Múltiples”
Bogotá, D.C.
Prohibida la reproducción total o parcial sin autorización
por escrito del Presidente de la Fundación.
La actualización de este fascículo estuvo a cargo de
ALEJANDRA CASTILLO
Docente tutor – Programa de Ingeniería de Sistemas a Distancia.
Sede Bogotá, D.C.
Corrección de estilo
ADRIANA RODRÍGUEZ VALENCIA.
Diseño gráfico y diagramación a cargo de
SANTIAGO BECERRA SÁENZ
ORLANDO DÍAZ CÁRDENAS
Impreso en: GRÁFICAS SAN MARTÍN
Calle 61A No. 14-18 - Tels.: 2350298 - 2359825
Bogotá, D.C., Marzo de 2012
1
Fascículo No. 3
Semestre 6
Procesadores
Procesadores
Introducción
Los microcomputadores tienen un lenguaje único que es capaz de reco-
nocer y ejecutar las instrucciones. Este lenguaje es llamado "Lenguaje de
Máquina" y pertenece al procesador del microcomputador. El lenguaje de
máquina está compuesto por una serie de instrucciones, las cuales son
reconocidas y ejecutadas por el procesador. Este lenguaje es un conjunto
de números que representan las operaciones realizadas por los compo-
nentes internos del procesador. Entonces las instrucciones se encuentran
directamente ligadas a la estructura física del procesador y no pueden ser
modificadas o cambiadas.
Es necesario comprender la arquitectura interna del procesador así como
sus instrucciones para programar un procesador. Cada procesador tiene
un conjunto de registros internos que puede emplearse de maneras distin-
tas para manipular números binario. Las instrucciones ejecutadas por el
procesador generalmente manipulan los datos almacenados en la memo-
ria y los registros de trabajo.
Las instrucciones de programa de un procesador se guardan como núme-
ros binarios en la memoria y se conocen como códigos de operación (op).
Los códigos de operación son leídos por la CPU y decodificados para de-
terminar cuál es la instrucción que debe ejecutarse. Cada código de ope-
ración se aplica o afecta a otro número, tal como el que está guardado en
el "registro de trabajo" o "Acumulador". El número binario al que se aplica
la instrucción se conoce como operando. El operando puede ser otro re-
gistro o un número binario almacenado en la memoria.
Para facilitar la escritura de programas, cada uno de los tipos principales
de instrucciones tiene asociado un código alfanumérico corto que ayuda al
programador a recordarlos, y estos códigos alfanuméricos se conocen
2
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
como mnemónicos. Este lenguaje es llamado lenguaje ensamblador y su
uso es muy frecuente debido a la facilidad para recordar las instrucciones
Conceptos previos
Para iniciar el estudio del fascículo 3. Es primordial repasar algunos con-
ceptos sobre la arquitectura de los microprocesadores y Microcontrolado-
res:
1. Los microprocesadores disponen de un registro de estado que contiene
“flags” o banderines que informan del resultado de ciertas operaciones
lógicas y aritméticas. Determine el significado de los siguientes bits:
a. C
b. N
c. Z
d. V
2. En qué consiste un ciclo de Fetch y un ciclo de Execute.
3. ¿Qué son los modos de direccionamiento?. Describa algunos de ellos.
4. ¿Qué funciones tiene un registro de datos?
5. ¿Qué funciones tiene un registro de direcciones?
Al finalizar el estudio del presente fascículo, el estudiante debe estar en capaci-
dad de:
Tendrá la capacidad de realizar programas en el seudocódigo de assembler
y C++
Reconocer la interfaz del lenguaje ensamblador
Realizara manejo de registros y banderas
Diseñara una lógica estructural con diagramas de sintaxis del objetivo a lo-
grar
Conocerá el aplicativo CodeWarrior como compilador
Realizara Debug y seguimiento por banderas a los registros al programa
LogrosLogrosLogros
3
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Mapa conceptual fascículo 3.
Lenguaje ensamblador del microprocesador Instrucciones para el Ensamble del Programa
En esta fase se escribe o “redactan” las instrucciones del programa. El
programa escrito en un lenguaje de programación (comprensible por el ser
humano, aunque se suelen corresponder con lenguajes formales descritos
por gramáticas independientes del contexto) no es inmediatamente ejecu-
tado en una computadora. La opción más común es compilar el programa,
aunque también puede ser ejecutado mediante un intérprete informático.
El código fuente del programa se debe someter a un proceso de transfor-
mación para convertirse en lenguaje máquina, interpretable por el proce-
sador. A este proceso se le llama compilación. Por lo general, la creación
de un programa ejecutable (un típico .exe para Microsoft Windows) conlle-
va dos pasos.
4
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
¿Que son las instrucciones?
El set de instrucciones de un microprocesador es el set de entradas bina-
rias que producen acciones definidas durante un ciclo de instrucción. Un
set de instrucciones es para el microprocesador lo mismo que una tabla de
verdad es para una compuerta lógica, un registro de desplazamiento o un
circuito sumador. Por supuesto, las acciones que realiza un microprocesa-
dor con cada instrucción, son más complejas que las que realizan los dis-
positivos y compuertas antes mencionados.
Tipos de Instrucciones
Las instrucciones de un procesador se pueden agrupar en tres tipos: Ins-
trucciones de Transferencia, Instrucciones de Operación e Instrucciones
de Control. A continuación se describirán las características básicas de
cada uno de estos grupos:
Instrucciones de Transferencia
Como su nombre lo indica, este grupo de instrucciones se utiliza para efec-
tuar transferencia de datos entre los registros de la CPU, la memoria y los
puertos de E/S. En la tabla 11.6.2 se indica un ejemplo este tipo de ins-
trucciones.
Comando Operando Comentario
LDA M Carga el registro A con los datos del registro en la posición de memoria M.
Tabla 1
Instrucción LDA
Instrucciones de Operación
Estas instrucciones se emplean para realizar operaciones aritméticas y
lógicas entre los registros del procesador y la memoria. Estas operaciones
incluyen suma, resta, incremento decremento, complemento, comparación
y corrimiento. En la tabla 11.6.3 se muestra un ejemplo de una instrucción
de operación.
5
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
El lenguaje ensamblador, es
un lenguaje de programación
de bajo nivel para los compu-
tadores, microprocesadores,
microcontroladores, y otros
circuitos integrados progra-
mables. Implementa una
representación simbólica de
los códigos de máquina bina-
rios y otras constantes nece-
sarias para programar una
arquitectura dada de CPU y
constituye la representación
más directa del código
máquina específico para
cada arquitectura legible por
un programador. Esta repre-
sentación es usualmente
definida por el fabricante de
hardware, y está basada en
los mnemónicos que simboli-
zan los pasos de procesa-
miento (las instrucciones), los
registros del procesador, las
posiciones de memoria, y
otras características del len-
guaje. Un lenguaje ensam-
blador es por lo tanto especí-
fico a 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 porta-
bles.
Mnemónico Operando Comentario
ADD B Suma el registro B con el registro A y el resultado se almacena en el regis-
tro A.
Tabla 2
Instrucción ADD
Instrucciones de Control
el lenguaje Ensamblador y en general en cualquier lenguaje de programa-
ción las instrucciones de control juegan un papel muy importante en el flu-
jo de un programa. Su función consiste en alterar el flujo normal del pro-
grama, según el estado de ciertos registros del sistema que indican alguna
condición después de ejecutar una instrucción. Con este tipo de instruc-
ciones es posible tomar el control del flujo del programa. En la tabla 3 se
indica un ejemplo de una instrucción de control.
Mnemónico Operando Comentario
JZ No existe Pasa por alto la siguiente instrucción en el código del programa si el bit del
sistema Z=1.
Tabla 3 Instrucción JZ
La abreviatura JZ corresponde a la frase en inglés Jump If Zero (Saltar si
Cero) y la función es evaluar el bit del sistema Z del registro de estado. En
caso de estar en 0 se ejecuta normalmente la siguiente instrucción, y en
caso de estar en 1 se salta la siguiente instrucción. Este bit del sistema se
pone en 1 si una operación anterior dió como resultado 0.
Hay mucho más que decir sobre la programación de un procesador que lo
mencionado en esta lección; sin embargo, si él es conveniente estudiar un
poco sobre diagramas de flujo y programación.
Simulación del programa
El primer paso se llama compilación (propiamente dicho) y traduce el
código fuente escrito, en un lenguaje de programación almacenado en un
archivo a código en bajo nivel (normalmente en código objeto no directa-
mente al lenguaje máquina).
6
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
El segundo paso se llama enlazado (del inglés link o linker) se junta el
código de bajo nivel generado de todos los ficheros que se han mandado
compilar y se añade el código de las funciones que hay en las bibliotecas
del compilador para que el ejecutable pueda comunicarse con el sistema
operativo y traduce el código objeto a código máquina.
Una de las formas para poder llegar a probar nuestro programa sin nece-
sidad de utilizar físicamente un recurso electrónico, es a través de diferen-
tes herramientas tecnológicas ya sean por software o por hardware, para
así determinar si nuestra aplicación funciona correctamente; estas herra-
mientas se hacen llamar simuladores. Un simulador es un software capaz
de reproducir el comportamiento real de un microcontrolador de manera
virtual a partir del código .asm creado. Para ello, se encuentran en el mer-
cado diferentes tipos de simuladores que permiten desarrollar diversos y
complejos diseños para programar microcontroladores.
Un programa utilitario llamado ensamblador es usado para traducir sen-
tencias 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 instruccio-
nes 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. (Cfr. MOTOROLA, 2012).
Muchos sofisticados ensambladores ofrecen mecanismos adicionales para
facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la
ayuda de depuración. Particularmente, la mayoría de los ensambladores
modernos incluyen una facilidad de macro (descrita más abajo), y son lla-
mados macro ensambladores.
7
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Figura 1.
Interfaz de programación Assembler
Etiquetas del lenguaje Assembler
Las instrucciones están divididas en un número de campos, como se
muestra debajo.
Etiquetas Operación Operando Comentarios
caso movf 5,w ;lee puerto A
retlw 4 ;retorna de subrutina
Trio Sleep ; bajo Consumo
Tabla 4 Etiquetas de Lenguaje Assembler
El campo del código de operación es el único que nunca puede estar vac-
ío; éste siempre contiene una instrucción o una directiva del Assembler. El
campo del operando o dirección puede contener una dirección o un dato,
o puede estar en blanco.
El campo del comentario o de etiquetas es opcional. El programador asig-
nará una etiqueta a una línea de instrucción o agregará un comentario
según su conveniencia: normalmente, para hacer más fácil el uso y la lec-
tura; por ejemplo si va a retomar el trabajo dentro de tres semanas
8
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Delimitadores:
Los campos van separados sólo con espacios y/o tabulaciones.
No agregar nunca otros caracteres (comas, puntos, etc ).
No utilice espacios extra, particularmente después de comas que sepa-
ran operandos. ( Ej: movlw 5,w )
No use caracteres delimitadores (espacios y tabulaciones) en nombres
o etiquetas.
Etiquetas
La etiqueta es el primer campo en una línea en lenguaje assembler y pue-
de no existir. Si una etiqueta está presente, el assembler la define como el
equivalente a la dirección del 1° byte correspondiente a esa instrucción.
Esta etiqueta puede volver a usarse en otro lugar pero como operando de
una instrucción. El assembler reemplazará ésta etiqueta por el valor de
cuando fue creada.
Se usan frecuentemente en las instrucciones de salto.
No puede existir más de una etiqueta en el 1° campo de instrucción.
No pueden usarse como nombres de etiquetas a palabras ya reserva-
das por el assembler ( ORG, EQU, etc. ) o nombres de instrucciones (
movlw, call, nop, etc.)
Ejemplo:
START movlw DATO
:
:
goto START
DATO EQU 05h
La instrucción goto START causa que la dirección de la instrucción con la
etiqueta START (movlw) se cargue en el PC. Por lo tanto ésta instrucción
será luego ejecutada.
9
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
No se permite el uso de números o caracteres no alfabéticos como 1°
letra de la etiqueta. Como regla práctica: usar siempre letras, y en
mayúscula.
Mnemónicos (códigos de operación):
La tarea principal del Assembler es la traducción de los códigos de opera-
ción en mnemónico en sus equivalentes binarios.
El Assembler realiza ésta tarea usando una tabla como si lo haríamos “
a mano” .
El Assembler debe hacer algo más que traducir los códigos de opera-
ción. También debe determinar cuántos operandos requiere la instruc-
ción y de qué tipo. Esto es un poco complejo; algunas instrucciones
(como clrw) no tienen operandos, otras (como sumas o saltos) tienen
una, mientras que otras (manipulación de bits o skips) requieren dos.
Directivas
Algunas instrucciones del lenguaje Assembler no se traducen directamente
a instrucciones del lenguaje máquina. Estas instrucciones son directivas
para el Assembler; éstas asignan al programa ciertas áreas de memoria,
definen símbolos, designan áreas de RAM para almacenamiento de datos
temporales, colocan tablas o datos constantes en memoria y permiten refe-
rencias a otros programas.
Las directivas se utilizan como comandos escritos en el código fuente para
realizar un control directo o ahorrar tiempo a la hora de ensamblar. El re-
sultado de incorporar directivas se puede ver en el fichero *.LST, después
de ensamblar el programa. Para usar éstas directivas o pseudo-operandos,
el programador las coloca en el campo del código de operación, y, si lo
requiere la directiva, una dirección o dato en el campo de dirección.
10
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Las directivas más comunes son:
EQU (Equate)
ORG (Origin)
DEFB (Define Byte)
DEFW (Define Word)
END (fin del código fuente)
EQU (Equate - Equivalente)
La directiva EQU permite al programador igualar nombres a datos o direc-
ciones. Esta pseudo-operación se nota EQU. Los nombres utilizados se
refieren generalmente a direcciones de dispositivos, datos numéricos, di-
recciones de comienzo, direcciones fijas, posiciones de bits, etc.
PORT_A EQU 5
START EQU 0
CARRY EQU 3
TIEMPO EQU 5
También se puede definir una equivalencia con el nombre de otra equi-
valencia ya definida.
PORT_B EQU PORT_A+1
PORT_C EQU PORT_A+2
FIN EQU START+100
FIN2 ` EQU START+200
El valor del operando debe estar ya definido anteriormente, sino el
compilador entregará un error.
ORG (Origin - Origen)
La directiva origen (se nota ORG) permite al programador especificar la
posición de memoria donde programas, subrutinas o datos residirán. Los
programas y los datos pueden estar alojados en diferentes áreas de me-
11
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
moria dependiendo de la configuración de memoria. (Cfr. ANGULO, 1997).
Rutinas de comienzo, subrutinas de interrupción y otros programas deben
comenzar en locaciones de memoria fijados por la estructura de micropro-
cesador. La directiva ORG hace al compilador colocar el código que le si-
gue en una nueva dirección de memoria (la salida del compilador no solo
coloca los códigos de operación sino también las direcciones de cada ins-
trucción y datos del programa). Usualmente se la utiliza para: reset, pro-
gramas de servicios de interrupción, almacenamiento en RAM, stack, pro-
grama principal, subrutinas.
Ejemplo:
ORG 00h
goto inicializa
org 04h ; vector de interrupcion
goto interr
ORG 05h
inicializa movlw 08h ; aquí comienza el programa
:
DEFB (Define Byte), DEFW (Define Word):
Esta directiva le permite al programador ingresar datos fijos en la memoria
de programa.
Estos datos pueden ser:
Tablas de conversión
Mensajes
Nombres
Umbrales
Comandos
Factores de conversión
Identificación de teclas
Direcciones de subrutinas
12
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Esta directiva trata a los datos como parte permanente del programa. El
formato es muy simple
MENSAJE DEFB ’M’,’I’,’C’,’R’,’O’,0
DELAY DEFB 10
DATOS DEFW $A100
DEFW $A400
` DEFW $0000
POTENCIA DEFB 1,4,9,16,25,36,49,64,81
Banderas
Las banderas proveen una manera de obtener información acerca de del
estado actual de la máquina y el resultado de procesamiento de una ins-
trucción.
Nombre Estado = 0 Estado = 1
Desbordamiento: Indica cuando el resultado
de una operación con signo ha excedido la
capacidad del uP.
NV-No hubo desborde OV-Desborde
Dirección: Controla la selección de incremen-
to o decremento de los registros DI o SI en
las instrucciones de cadenas.
UP-Incremento DN-Decremento
Interrupción: habilita la entrada de interrup-
ción.
DI-Interr. anulada EI-Interrupción
Signo: indica el signo del resultado de la
última operación aritmética.
PL-Positivo NG-Negativo
Cero: indica si la última operación dio como
resultado cero.
NZ-No Cero ZR-Cero
Acarreo auxiliar: ocurre cuando en una opera-
ción aritmética, se produzco un acarreo o un
préstamo entre el bit 3 y 4 del resultado.
NA-Sin Acarreo
AC-Acarreo
Paridad: es un conteo de unos en la última
operación.
PO-Impar PE-Par
Acarreo: indica un acarreo o un préstamo en
la última operación aritmética, usado también
en operaciones de corrimiento y como indi-
cador de error en ciertos programas.
NC-Sin Acarreo CY-Acarreo
13
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Las banderas son espacios de memoria.
Bandera Bit Nombre
CF 0 Bandera de acarreo (carry flag)
PF 2 Bandera de paridad (parity flag)
AF 4 Bandera de acarreo auxiliar (adjust flag)
ZF 6 Bandera de cero (zero flag)
SF 7 Bandera de signo (sign flag)
DF 10 Bandera de dirección (direction flag)
OF 11 Bandera de desbordamiento (overflow flag)
Operandos y direcciones
Los ensambladores permiten elegir con libertad el tipo de elemento a colo-
car en el campo de operando o dirección.
Números decimales: La mayoría de los ensambladores asumen todos los
números como decimales a no ser que se marquen de otra manera.
Por ejemplo: movlw 100
Suma con acarreo
Para el caso de sumar números cuya longitud supera a los 16 bits del mi-
croprocesador o que su resultado sea mayor que 16 bits, se debe recurrir
al uso de la suma con acarreo. Esto significa, que en el caso por ejemplo
de sumar dos números de 32 bits, se realiza la suma de los 16 bits menos
significativos y luego los 16 bits más significativos junto con el acarreo.
Figura 2
Suma con Acarreo
14
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Figura 3
Registros 16bits para suma
ADD: Esta instrucción suma el primer operador con el segundo y al resul-
tado lo guarda en el primer operador, si hubo acarreo lo guarda en Carry.
ADC: Realiza la misma operación que ADD incorporando también el Carry
en la suma de los operadores.
Ejemplo
Sumar 2 nro de 32 bits contenidos en AX BX y CX DX respectivamente,
guardando el resultado en AX BX.
AX BX = 0134A23Bh
CX DX = BD02E329h
; sumar dos números de 32 bits
name "suma32"
org 100h
mov ax,0134
mov bx,A23B
mov cx,BD02
mov dx,E329
add bx,dx
adc ax,cx
ret
AX BX = BE378564 (Resultado)
15
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Stack
Lugar de memoria destinado a guardar datos temporales, es una pila (LI-
FO)
Los registros usados por el stack son:
SP: Stack Pointer – Puntero del stack
SS: Stack Segment – Segmento del stack
Quedando la dirección absoluta SS:SP, Funciones que usan el Stack:
PUSH: Decrementa el SP en 2 y luego graba 2 bytes al stack.
POP: Lee los últimos 2 bytes grabados al Stack e incrementa el SP en 2.
También dan uso del Stack: las interrupciones de Hardware y Software y
las llamadas a subrutinas.
Estado del Stack antes y después del uso de las instrucciones POP y
PUSH:
Figura 4 Estado del Stack
16
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Ejemplo
Salvar a los registros AX y BX, luego borrar los mismos para finalmente
recuperar los datos del Stack
; manejo del stack
; notar el orden en que se recupera los registros
name "stack"
org 100h
mov ax,10
mov bx,20
push ax
push bx
sub ax,ax
sub bx,bx
pop bx
pop ax
ret ; volver al sistema operativo
Movimiento (Shift) común y Aritmético
17
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Formato de las instrucciones
Si bien se pueden realizar corrimiento o rotaciones de 1 o más bits, solo
está permitido el de 1 bit en inmediato, en estos casos para un corrimiento
de más de un bits, se debe utilizar un registro auxiliar, el CL. (Cfr. MOTO-
ROLA, 2012).
Funcionalidad:
Ejemplo
Usando instrucciones Shift ingresar un número en AX y multiplicarlo por
7
; multiplicar por 7
name "multip7"
org 100h
mov ax,023Ah
mov bx,ax
mov cl,03
shl bx,cl
sub bx,ax
ret ; volver al sistema operativo
Resultado 0F96h
Aritmética Entera
Instrucciones a usar MUL, IMUL, DIV, IDIV
Tamaño Operador Multiplicando Multiplicador Resultado
8 bits AL Byte registro o memoria AX
16 bits AX Palabra registro o memoria DX:AX
División
Tamaño Operador Dividendo Divisor Resultado Resto
16 bits AX Byte registro o memoria AL AH
32 bits DX:AX Palabra registro o memoria AX DX
18
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Ejemplo
Dividir AX por 7 y Multiplicar BX por 23
; dividir y multiplicar enteros
name "divymul"
org 100h
mov ax,0100h
mov bx,2000h
mov cl,7 ; divisor
div cl ; dividendo = ax ; divisor = cl
mov cx,ax ; guardar resultado y resto en cx
mov ax,bx ; multiplicando
mov bx,23 ; multiplicador
mul bx ; resultado en dx ax
ret ; volver al sistema operativo
Resultado: división 24h con resto 4h – multiplicación 2E000h
Saltos Condicionales e Incondicionales
En casi todo programa muchas veces es necesario interrumpir el flujo
normal del mismo y saltar a otra porción del código, podemos distinguir
dos saltos diferentes:
Los condicionales, donde se evalúa una condición y al ser verdadera se
produce el salto, es la forma que tiene el ensamblador de realizar IF o
estructuras CASE que acostumbrábamos a usar en lenguajes de alto ni-
vel, lo único que aquí lo hacemos en dos pasos, primero comparamos,
quedando el resultado en las banderas (ver banderas al comienzo), lue-
go utilizamos alguna de las instrucciones de salto condicional para rea-
lizar el salto.
El salto incondicional, aquí no hay condición de salto y el mismo se
efectúa siempre, es el equivalente al GOTO en lenguajes de alto nivel.
Salto Incondicional
JMP nn
El salto incondicional puede ser dividido en tres tipos.
19
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Salto corto, en este tipo de salto el parámetro nn es un byte, pudiendo
saltar desde +127 hasta -128 posiciones a partir de la dirección próxima
a JMP. (largo: 1 byte instrucción + 1 byte salto = 2 bytes)
Salto cercano, el parámetro nn es de dos bytes indicando la dirección
del puntero a donde va a saltar. (largo: 1 bytes instrucción + 2 bytes sal-
to = 3 bytes)
Salto lejano, nn es de 4 byte, indica la posición absoluta con segmento
y puntero del salto. ( largo: 1 byte instrucción + 4 byte salto = 5 bytes )
Generalmente el compilador elije la mejor forma (la más corta) para realizar
el salto, no siendo necesario determinar el tipo de salto.
Saltos condicionales
Este tipo de salto depende de las banderas del uP para realizar el salto,
todos estos saltos son solamente corto, no pudiendo saltar con estas ins-
trucciones más allá de +127 – 128 bytes
Saltos condicionales para número sin signo
Instrucción Bandera/s Descripción
JA C = 0 y Z = 0 Saltar si está por arriba
JAE C = 0 Saltar si está por arriba o es igual
JB C = 1 Saltar si está por abajo
JBE C = 1 o Z = 1 Saltar si está por debajo a igual
Saltos condicionales para número con signo
Instrucción Bandera/s Descripción
JG Z = 0 y S = O Saltar si es mayor
JGE S = O Saltar si es mayor o igual
JL S ≠ O Saltar si es menor
JLE Z = 1 o S ≠ O Saltar si es menor o igual
JNS S = 0 Saltar si no hay signo
JS S = 1 Saltar si hay signo
20
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Otros saltos
Instrucción Bandera/s Descripción
JE o JZ Z = 1 Saltar si no es igual o cero
JNE o JNZ Z = 0 Saltar si no es igual o cero
JC C = 1 Saltar si hay acarreo
JNC C = 0 Saltar si no hay acarreo
JNO O = 0 Saltar si no hay overflow
JNP o JPO P = 0 Saltar si no hay paridad o paridad impar
JO P = 0 Saltar si hay overflow
JP o JPE P = 1 Saltar si hay paridad o paridad par
JP o JPE P = 1 Saltar si CX = 0
Ejemplo
Realizar un programa que: dado un vector de byte ya cargado, busque el
final del mismo (byte = 0h) y termine dejando en BX la longitud del mismo.
; Vector
name "vector"
org 100h
mov bx,0 ; en bx tenemos la posición dentro del vector
otro:
mov al,vec[bx] ; cargamos en AL el elemento del vector indicado en BX
inc bx ; incrementamos BX
cmp al,0 ; comparamos el elemento del vector con 0
jz fin ; si la comparación es 0 salimos del programa
jmp otro ; buscamos otro elemento
fin:
ret ; volver al sistema operativo
vec db "abcdefghijklmnopqrstuvwxyz",0 ; cargar un vector con constantes
Loop
La instrucción loop se utiliza para realizar bucles, esta instrucción decre-
mento el contador CX y lo compara con cero en caso de no ser cero salta
a la dirección indicada en el parámetro, de ser cero continua con la ins-
trucción siguiente.
21
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Ejemplo
Realizar un programa que: dado un vector de byte ya cargado de 10 ele-
mentos, sume los mismos y termine con el resultado de la suma en AX.
; suma
name "suma"
org 100h
mov bx,0 ; en bx tenemos la posición dentro del vector
mov cx,10 ; contador del programa para el loop
mov ax,0 ; suma
mov dx,0
otro:
mov dl,vec[bx] ; cargamos en DL el elemento del vector indicado en BX
inc bx ; incrementamos BX
add ax,dx
loop otro
ret ; volver al sistema operativo
vec db 10,20,2,200,34,44,21,8,10,22; cargar un vector con constantes
Convenciones en la escritura del código fuente
Para hacer la tarea del programador más grata, se usan algunas conven-
ciones. Cada uno puede adoptar las que más le agraden y ayuden para
ser más productivo. En general, las convenciones son cualquier acción
que facilita la revisión y comprensión de un programa, especialmente el
que uno mismo ha escrito cuando tiene que revisarlo algunos meses des-
pués. Comentamos algunas convenciones que usaremos:
Los ficheros de código fuente llevarán la extensión *.ASM
Los ficheros de listado llevarán la extensión *.LST
Los ficheros de código objeto llevarán la extensión *.OBJ
Los ficheros de errores llevarán la extensión *.ERR
Los ficheros ejecutables en formato Intel Hex llevarán la extensión *.HEX
Los nemónicos escritos en mayúscula hacen que el código escrito sea
más visible.
Comentarios explicando cada línea de código.
22
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Un párrafo de comentarios explica las rutinas o conjunto de instruc-
ciones ya que los campos de comentarios suelen ser pequeños.
El espacio entre caracteres se escribe “ _” . RB0_ES_1 es más fácil de
leer que RB0ES1
Recuerde que las convenciones son cualquier cosa que le haga
más fácil la lectura y comprensión de su código, como por ejem-
plo:
1. Una cabecera estandarizada.
2. Colocar las rutinas en el mismo sitio, todas contiguas.
3. Dibujar diagramas de flujo o escribir seudocódigo.
Desventajas de Assembler
Desventajas del Assembly: El lenguaje assembler no resuelve todos los
problemas de programación. Uno de ellos es la tremenda diferencia entre
el set de instrucciones del microprocesador y las tareas que el micropro-
cesador debe realizar. Las instrucciones del microprocesador tienden a
hacer cosas como: sumar contenidos de dos registros, desplazar el conte-
nido de un acumulador un bit, o colocar un nuevo valor en el contador de
programa (PC). Por otro lado, el usuario generalmente quiere que el com-
putador haga cosas como: chequear si un valor analógico leído se exedió
de un cierto umbral, buscar y reaccionar ante un comando particular de
una consola o teletipo, o activar un relé en el momento apropiado. El pro-
gramador de lenguaje assembler debe traducir estas tareas a secuencias
de simples instrucciones de microprocesador. Esta tradución suele ser di-
ficultosa, consume tiempo de trabajo. (Cfr. ANGULO, 1997).
Otro inconveniente es la no portabilidad. Cada microprocesador posee su
propio set de instrucciones en el cual está reflejado su arquitectura interna.
Un programa en assembler escrito para 6809, no correrá en un 6502, Z80,
23
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
8080, o cualquier microprocesador de 16 o 32 bits. Ni siquiera dentro de la
misma familia de microcontroladores de Microchip Technology (PICs) exis-
ten las mismas instrucciones. Cada modelo tiene un set de instrucciones
propio que difiere en algunas instrucciones con los demás.
Inclusión de Código
Algunos ensambladores permiten incluir código fuente (partes de progra-
mas) desde otros archivos.
Por ejemplo:
INCLUDE DISPLAY.ASM
Le dice al compilador que incluya el código que se encuentra en el archivo
DISPLAY.ASM como si fuese parte del propio programa. Esto se utiliza pa-
ra reutilizar códigos realizados con anterioridad. En el ejemplo del siguien-
te punto lo vemos más claro.
Macros:
A veces ocurren secuencias de instrucciones particulares en los progra-
mas que son repetitivas. Estas secuencias de instrucciones se pueden eli-
minar utilizando MACROS. Las macros permiten asignarle un nombre a
una secuencia de instrucciones. Luego se utiliza el nombre de la macro en
el programa como si se usase la secuencia de instrucciones anterior. Las
macros no son lo mismo que las subrutinas. El código de las subrutinas
aparece una sola vez en un programa y la ejecución del programa salta a
la subrutina. En cambio, el ensamblador reemplaza cada ocurrencia del
nombre de la macro con la secuencia especificada de instrucciones. Por
consiguiente la ejecución del programa no salta a la macro como una sub-
rutina.
24
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Ejemplo.
Archivo “ MULX10.ASM”
MULX10 MACRO ; comienzo de la macro
movf tiempo,w ; guarda el tiempo en W
rlf tiempo ; multiplica por 2
rlf tiempo ; multiplica por 2
rlf tiempo ; multiplica por 2
addwf tiempo ; le suma una vez más
addwf tiempo ; le suma una vez más
ENDM ; fin de la macro
Tabla de Caracteres ASCCI
Los códigos ASCII menores a 3210 (0016 a 1F16) son los llama-
dos caracteres de control. No se pueden representar gráficamen-
te, se utilizan como comandos en los dispositivos series y parale-
los (terminales, impresoras, etc.) efectuando operaciones como:
avance de papel, retorno de carro, fin de transmisión, fin del ar-
chivo, etc.
Figura 5 Tabla de Caracteres ASCCI
3.1
Realizar la documentación del siguiente código:
Este programa muestra la forma de utilizar el puerto paralelo usando los
bits de datos como salidas. El programa realiza una secuencia de 8
LEDs conectados en modo source en los pines 2 al 9 y el 19 (CNG o
masa) para los cátodos comunes.
25
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
/* leds.c */
/* Secuencia 8 LEDs conectados al puerto paralelo */
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void main()
{
/* colocar el valor del puerto que corresponda: 0x278, 0x378, 0x3BC */
int puerto = 0x278;
int led = 1;
/* apago todos los LEDs */
outportb( puerto, 0 );
/* si se pulsa cualquier tecla termina */
while( kbhit() == 0 )
{
/* enciendo el LED */
outportb( puerto, led );
/* siguiente LED (1, 2, 4, 8, 16, 32, 64, 128) */
led = led * 2 ;
/* si excede 128 tiene que volver a 1 */
if( led > 128 )
led = 1;
}
}
/* FIN */
1. Indicar qué está mal en las siguientes instrucciones ensamblador
MOVE Temp, #4
ADD.B #1,A3
CMP.L D0, #9
MOVE.B #500,D5
ADD.W +(A2),D3
BEQ.B Bucle
2. Indicar tres aspectos de la arquitectura de un ordenador que pueden influir en
la velocidad de ejecución de una instrucción.
3. ¿Cuál era el tamaño de la memoria en la máquina de Von Neuman expresada
en K octetos?
4. Encontrar la palabra o frase de la lista que aparece a continuación que mejor
se ajusta a las afirmaciones siguientes. Afirmaciones:
Otro nombre para procesador
Máquina de alto rendimiento con un precio elevado
26
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Aproximación al diseño hardware o software. El sistema está formado por
capas jerárquicas, en las que cada capa de nivel superior oculta detalles
de la capa de nivel inferior.
Orden individual para un computador.
Localización de los programas cuando se están ejecutando, también con-
tiene los datos que se necesitan.
Parte activa del computador que sigue las instrucciones del programa al
pie de la letra: suma números, examina números, etc.
Memoria pequeña rápida que actúa como buffer de la memoria principal
Abstracción específica que el hardware proporciona al software de bajo ni-
vel.
Palabras:
a) ensamblador
b) caché
c) CPU
d) Instrucción
e) Arquitectura del repertorio de instrucciones
f) Procesador
g) Memoria
h) Supercomputador
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel, se llaman así
porque están muy cercanos al hardware del ordenador. Es por ello de el
lenguaje ensamblador asigna una abreviatura a c da instrucción en binario
(código máquina), de esta forma es más fácil recordar y más difícil equivo-
carse con las instrucciones o abreviaturas.
Una desventaja es que con este lenguaje sigue siendo necesario conocer
muy bien el hardware del ordenador. En otras palabras es necesario cono-
cer a fondo la arquitectura de la máquina para la que se va a programar.
Fue usado ampliamente en el pasado para el desarrollo de software, pero
actualmente sólo se utiliza en contadas ocasiones, especialmente cuando
se requiere la manipulación directa del hardware o se pretenden rendi-
mientos inusuales de los equipos.
27
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Unidades de información
Para que la PC pueda procesar la información es necesario que ésta se
encuentre en celdas especiales llamadas registros.
Los registros son conjuntos de 8 o 16 flip-flops (basculadores o biesta-
bles).
Un flip-flop es un dispositivo capaz de almacenar dos niveles de voltaje,
uno bajo, regularmente de 0.5 volts y otro alto comúnmente de 5 volts. El
nivel bajo de energía en el flip-flop se interpreta como apagado o 0, y el
nivel alto como prendido o 1. A estos estados se les conoce usualmente
como bits, que son la unidad más pequeña de información en una compu-
tadora.
A un grupo de 16 bits se le conoce como palabra, una palabra puede ser
dividida en grupos de 8 bits llamados bytes, y a los grupos de 4 bits les
llamamos nibbles.
Sistemas numéricos
El sistema numérico que utilizamos a diario es el sistema decimal, pero
este sistema no es conveniente para las máquinas debido a que la infor-
mación se maneja codificada en forma de bits prendidos o apagados; esta
forma de codificación nos lleva a la necesidad de conocer el cálculo posi-
cional que nos permita expresar un número en cualquier base que lo ne-
cesitemos.
J. Mª. Angulo Usategui, E. Martín Cuenca, I. Angulo Martínez, Microcontro-
ladores PIC. La Solución en un Chip. Ed. Paraninfo. ( 1997 )
J. Mª. Angulo Usategui, I. Angulo Martínez, Microcontroladores PIC. Diseño
práctico de aplicaciones, Mc Graw Hill [ 1999 ]
28
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Cherre, Rafael Juan, Lenguaje de Programación en C++, Editorial Macro.
Francia, Darío Rafael, Programación Orientada a Objetos, Editorial Acisclo,
2009
Los planteamientos explicados en este fascículo deben ser tenidos en
cuenta para el tratamiento de problemas posteriores. En el siguiente fascí-
culo daremos introducción a la descripción interna del Microcontrolador,
esto para adentrarnos en funcionalidad, programación, características y
variables a programar y prácticas en la plataforma.
29
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
Seguimiento al autoaprendizajeSeguimiento al autoaprendizajeSeguimiento al autoaprendizaje
Procesadores - Fascículo No. 3
Nombre_________________________________________________________
Apellidos ______________________________Fecha ___________________
Ciudad _______________________________Semestre__________________
Resolver:
1. Cómo se detecta el Overflow?
2. Sea X= 1100 0001 un número binario de 8 bits. Especifique en qué consiste el
desplazamiento lógico (derecha o izquierda), el desplazamiento aritmético (de-
rEcha/izquierda) y la rotación (derecha/izquierda). Obtenga el resultado de rea-
lizar dichas operaciones con el número X e interprete el resultado, cuando sea
posible, según X se considere como un número con signo o como un número
sin signo.
3. En qué consiste un ciclo de Fetch y un ciclo de Execute.
4. ¿Qué son los modos de direccionamiento?. Describa algunos de ellos.
5. ¿Qué funciones tiene el contador de programa, PC, de un microprocesador?
6. ¿Qué funciones tiene un registro de datos?
7. ¿Qué funciones tiene un registro de direcciones?
8. Si un microprocesador dispone de:
a. 16
b. 20
c. 24
d. 32
Líneas en su bus de direcciones, ¿cuántas direcciones físicas distintas puede
generar?
9. Representa el esquema de una RAM de 32Kx8 y una ROM de 16Kx8.
10. Definir brevemente: programa fuente, programa objeto, lenguaje ensambla-
dor, lenguaje de máquina y programa ensamblador.
30
Procesadores
Procesadores
Fascículo No. 3
Semestre 6
11. Describir brevemente los conceptos de puerto y periférico, los métodos de
transferencia paralela de datos, y las técnicas de entrada y salida.
12. Comente las técnicas de E/S programada e interrupción en cuanto a recur-
sos necesarios y velocidad de la transferencia de datos.