Procesadores

Anuncio
Fascículo
3
1
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
Semestre 6
Procesadores
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
Procesadores
Semestre 6
Procesadores
1
Introducción
Los microcomputadores tienen un lenguaje único que es capaz de reconocer 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 componentes 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 distintas para manipular números binario. Las instrucciones ejecutadas por el
procesador generalmente manipulan los datos almacenados en la memoria y los registros de trabajo.
Las instrucciones de programa de un procesador se guardan como números 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 determinar cuál es la instrucción que debe ejecutarse. Cada código de operació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 registro 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
Fascículo No. 3
Semestre 6
Procesadores
Procesadores
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 conceptos sobre la arquitectura de los microprocesadores y Microcontroladores:
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?
Logros
Al finalizar el estudio del presente fascículo, el estudiante debe estar en capacidad 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 lograr
 Conocerá el aplicativo CodeWarrior como compilador
 Realizara Debug y seguimiento por banderas a los registros al programa
Procesadores
2
Fascículo No. 3
Semestre 6
Procesadores
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 ejecutado 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 transformación para convertirse en lenguaje máquina, interpretable por el procesador. 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) conlleva dos pasos.
Fascículo No. 3
Semestre 6
3
Procesadores
Procesadores
¿Que son las instrucciones?
El set de instrucciones de un microprocesador es el set de entradas binarias 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 microprocesador con cada instrucción, son más complejas que las que realizan los dispositivos y compuertas antes mencionados.
Tipos de Instrucciones
Las instrucciones de un procesador se pueden agrupar en tres tipos: Instrucciones 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 efectuar 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 instrucciones.
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.
Procesadores
4
Fascículo No. 3
Semestre 6
Procesadores
Mnemónico
ADD
Operando
B
Comentario
Suma el registro B con el registro A y el resultado se almacena en el registro A.
Tabla 2
Instrucción ADD
Instrucciones de Control
el lenguaje Ensamblador y en general en cualquier lenguaje de programación las instrucciones de control juegan un papel muy importante en el flujo de un programa. Su función consiste en alterar el flujo normal del programa, 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 instrucciones 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
JZ
Operando
No existe
El lenguaje ensamblador, es
un lenguaje de programación
de bajo nivel 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 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 representación es usualmente
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 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 portables.
Comentario
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 directamente al lenguaje máquina).
Fascículo No. 3
Semestre 6
5
Procesadores
Procesadores
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 necesidad de utilizar físicamente un recurso electrónico, es a través de diferentes herramientas tecnológicas ya sean por software o por hardware, para
así determinar si nuestra aplicación funciona correctamente; estas herramientas 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 mercado diferentes tipos de simuladores que permiten desarrollar diversos y
complejos diseños para programar microcontroladores.
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. (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 llamados macro ensambladores.
Procesadores
6
Fascículo No. 3
Semestre 6
Procesadores
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
caso
Trio
Operación
movf
retlw
Sleep
Operando
5,w
4
Comentarios
;lee puerto A
;retorna de subrutina
; 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 asignará 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 lectura; por ejemplo si va a retomar el trabajo dentro de tres semanas
Fascículo No. 3
Semestre 6
7
Procesadores
Procesadores
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 separan 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 puede 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 reservadas por el assembler ( ORG, EQU, etc. ) o nombres de instrucciones (
movlw, call, nop, etc.)
Ejemplo:
START
:
:
DATO
movlw DATO
goto START
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.
Procesadores
8
Fascículo No. 3
Semestre 6
Procesadores
 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 operació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 operación. También debe determinar cuántos operandos requiere la instrucció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 referencias 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 resultado 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.
Fascículo No. 3
Semestre 6
9
Procesadores
Procesadores
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 direcciones. Esta pseudo-operación se nota EQU. Los nombres utilizados se
refieren generalmente a direcciones de dispositivos, datos numéricos, direcciones 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 equivalencia 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-
Procesadores
10
Fascículo No. 3
Semestre 6
Procesadores
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 microprocesador. La directiva ORG hace al compilador colocar el código que le sigue 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 instrucción y datos del programa). Usualmente se la utiliza para: reset, programas de servicios de interrupción, almacenamiento en RAM, stack, programa 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
Fascículo No. 3
Semestre 6
11
Procesadores
Procesadores
Esta directiva trata a los datos como parte permanente del programa. El
formato es muy simple
MENSAJE
DEFB
DELAY
DEFB
DATOS
DEFW
$A100
DEFW
$A400
DEFW
$0000
DEFB
1,4,9,16,25,36,49,64,81
`
POTENCIA
’M’,’I’,’C’,’R’,’O’,0
10
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 instrucción.
Nombre
Desbordamiento: Indica cuando el resultado
de una operación con signo ha excedido la
capacidad del uP.
Dirección: Controla la selección de incremento o decremento de los registros DI o SI en
las instrucciones de cadenas.
Interrupción: habilita la entrada de interrupción.
Signo: indica el signo del resultado de la
última operación aritmética.
Cero: indica si la última operación dio como
resultado cero.
Acarreo auxiliar: ocurre cuando en una operación aritmética, se produzco un acarreo o un
préstamo entre el bit 3 y 4 del resultado.
Paridad: es un conteo de unos en la última
operación.
Acarreo: indica un acarreo o un préstamo en
la última operación aritmética, usado también
en operaciones de corrimiento y como indicador de error en ciertos programas.
Procesadores
12
Estado = 0
NV-No hubo desborde
Estado = 1
OV-Desborde
UP-Incremento
DN-Decremento
DI-Interr. anulada
EI-Interrupción
PL-Positivo
NG-Negativo
NZ-No Cero
ZR-Cero
AC-Acarreo
NA-Sin Acarreo
PO-Impar
PE-Par
NC-Sin Acarreo
CY-Acarreo
Fascículo No. 3
Semestre 6
Procesadores
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 colocar 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 microprocesador 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
Fascículo No. 3
Semestre 6
13
Procesadores
Procesadores
Figura 3
Registros 16bits para suma
ADD: Esta instrucción suma el primer operador con el segundo y al resultado 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)
Procesadores
14
Fascículo No. 3
Semestre 6
Procesadores
Stack
Lugar de memoria destinado a guardar datos temporales, es una pila (LIFO)
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
Fascículo No. 3
Semestre 6
15
Procesadores
Procesadores
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
Procesadores
16
Fascículo No. 3
Semestre 6
Procesadores
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. MOTOROLA, 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
8 bits
16 bits
Multiplicando
AL
AX
Multiplicador
Byte registro o memoria
Palabra registro o memoria
Resultado
AX
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
Fascículo No. 3
Semestre 6
17
Procesadores
Procesadores
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 nivel, lo único que aquí lo hacemos en dos pasos, primero comparamos,
quedando el resultado en las banderas (ver banderas al comienzo), luego utilizamos alguna de las instrucciones de salto condicional para realizar 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.
Procesadores
18
Fascículo No. 3
Semestre 6
Procesadores
 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 salto = 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 instrucciones más allá de +127 – 128 bytes
Saltos condicionales para número sin signo
Instrucción
JA
JAE
JB
JBE
Bandera/s
C=0yZ=0
C=0
C=1
C=1oZ=1
Descripción
Saltar si está por arriba
Saltar si está por arriba o es igual
Saltar si está por abajo
Saltar si está por debajo a igual
Saltos condicionales para número con signo
Instrucción
JG
JGE
JL
JLE
JNS
JS
Fascículo No. 3
Semestre 6
Bandera/s
Z=0yS=O
S=O
S≠O
Z=1oS≠O
S=0
S=1
Descripción
Saltar si es mayor
Saltar si es mayor o igual
Saltar si es menor
Saltar si es menor o igual
Saltar si no hay signo
Saltar si hay signo
19
Procesadores
Procesadores
Otros saltos
Instrucción
JE o JZ
JNE o JNZ
JC
JNC
JNO
JNP o JPO
JO
JP o JPE
JP o JPE
Bandera/s
Z=1
Z=0
C=1
C=0
O=0
P=0
P=0
P=1
P=1
Descripción
Saltar si no es igual o cero
Saltar si no es igual o cero
Saltar si hay acarreo
Saltar si no hay acarreo
Saltar si no hay overflow
Saltar si no hay paridad o paridad impar
Saltar si hay overflow
Saltar si hay paridad o paridad par
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 decremento 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 instrucción siguiente.
Procesadores
20
Fascículo No. 3
Semestre 6
Procesadores
Ejemplo
Realizar un programa que: dado un vector de byte ya cargado de 10 elementos, 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 convenciones. 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 despué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.
Fascículo No. 3
Semestre 6
21
Procesadores
Procesadores
 Un párrafo de comentarios explica las rutinas o conjunto de instrucciones 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 ejemplo:
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 microprocesador debe realizar. Las instrucciones del microprocesador tienden a
hacer cosas como: sumar contenidos de dos registros, desplazar el contenido 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 computador 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 programador de lenguaje assembler debe traducir estas tareas a secuencias
de simples instrucciones de microprocesador. Esta tradución suele ser dificultosa, 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,
Procesadores
22
Fascículo No. 3
Semestre 6
Procesadores
8080, o cualquier microprocesador de 16 o 32 bits. Ni siquiera dentro de la
misma familia de microcontroladores de Microchip Technology (PICs) existen 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 programas) 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 para reutilizar códigos realizados con anterioridad. En el ejemplo del siguiente punto lo vemos más claro.
Macros:
A veces ocurren secuencias de instrucciones particulares en los programas que son repetitivas. Estas secuencias de instrucciones se pueden eliminar 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 subrutina.
Fascículo No. 3
Semestre 6
23
Procesadores
Procesadores
Ejemplo.
Archivo “ MULX10.ASM”
MULX10 MACRO
movf tiempo,w
rlf
tiempo
rlf
tiempo
rlf
tiempo
addwf tiempo
addwf tiempo
ENDM
; comienzo de la macro
; guarda el tiempo en W
; multiplica por 2
; multiplica por 2
; multiplica por 2
; le suma una vez más
; le suma una vez más
; fin de la macro
Tabla de Caracteres ASCCI
Los códigos ASCII menores a 3210 (0016 a 1F16) son los llamados caracteres de control. No se pueden representar gráficamente, se utilizan como comandos en los dispositivos series y paralelos (terminales, impresoras, etc.) efectuando operaciones como:
avance de papel, retorno de carro, fin de transmisión, fin del archivo, 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.
Procesadores
24
Fascículo No. 3
Semestre 6
Procesadores
/* 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
Fascículo No. 3
Semestre 6
25
Procesadores
Procesadores
 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 contiene 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 nivel.
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 equivocarse 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 conocer 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 rendimientos inusuales de los equipos.
Procesadores
26
Fascículo No. 3
Semestre 6
Procesadores
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 biestables).
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 computadora.
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 informació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 posicional que nos permita expresar un número en cualquier base que lo necesitemos.
J. Mª. Angulo Usategui, E. Martín Cuenca, I. Angulo Martínez, Microcontroladores 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 ]
Fascículo No. 3
Semestre 6
27
Procesadores
Procesadores
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.
Procesadores
28
Fascículo No. 3
Semestre 6
Procesadores
Seguimientoal 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 (derEcha/izquierda) y la rotación (derecha/izquierda). Obtenga el resultado de realizar 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 ensamblador, lenguaje de máquina y programa ensamblador.
Fascículo No. 3
Semestre 6
29
Procesadores
Procesadores
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 recursos necesarios y velocidad de la transferencia de datos.
Procesadores
30
Fascículo No. 3
Semestre 6
Descargar