Introducción a la programación en ensamblador.

Anuncio
Universidad
Rey Juan Carlos
ESTRUCTURA Y TECNOLOGÍA DE
COMPUTADORES
Introducción a la programación
en ensamblador del MC68000
Luis Rincón Córcoles
Licesio J. Rodríguez-Aragón
Introducción a la programación en ensamblador del MC68000
Programa
1.
2.
3.
4.
5.
6.
7.
8.
Introducción.
Directivas básicas de los ensambladores para MC68000.
MC68000 y las operaciones con bits.
MC68000 y los tipos de datos simples.
MC68000 y las variables simples.
MC68000 y la evaluación de expresiones aritméticas.
MC68000 y la evaluación de expresiones booleanas.
MC68000 y las sentencias de control.
2
Introducción a la programación en ensamblador del MC68000
Bibliografía
 D.A. PATTERSON, J.L HENNESSY. Estructura y diseño de computadores.
Reverté, 2000.
 M68000 8/16/32 Bit Microprocessors User’s Manual. 9th edition. Motorola, 1993.
 Motorola M68000 Family Programmer’s Reference Manual. Motorola, 1992.
 A. CLEMENTS. Microprocessor Systems Design. 3rd edition, ITP - PWS
Publishing Company, 1997.
 J. SEPTIÉN, H. MECHA, R. MORENO, K. OLCOZ. La familia del MC68000.
Síntesis, 1995.
 C. CERRADA, V. FELIU. Estructura y Tecnología de Computadores I. UNED,
1993
 F.G. McCABE. High-Level Programmer’s Guide to the 68000. Prentice-Hall, 1992.
3
Introducción a la programación en ensamblador del MC68000
1. Introducción
 Hasta ahora hemos estudiado los fundamentos del lenguaje ensamblador:
•
•
•
•
•
Repertorios de instrucciones.
Modos de direccionamiento.
Directivas de ensamblador.
Herramientas de traducción de programas.
Proceso de creación de un programa.
 Ahora vamos a estudiar los fundamentos de la programación en ensamblador:
•
•
•
•
Uso de las directivas más habituales.
Manejo de bits individuales y datos simples.
Evaluación de expresiones aritméticas y booleanas.
Implementación de estructuras de control.
 Más adelante trataremos conceptos más avanzados:
•
•
•
•
Implementación y manejo de estructuras de datos.
Gestión de subrutinas.
Bibliotecas de subprogramas.
Etc.
4
Introducción a la programación en ensamblador del MC68000
Introducción
 Los objetivos perseguidos son:
• Aprender a programar en ensamblador.
• Aprender cómo generan código los compiladores.
 Los lenguajes de programación de alto nivel habitualmente no definen en sus
estándares los tamaños exactos de los datos (al menos de los datos numéricos).
• Normalmente el entero base coincide en tamaño con la palabra del computador.
• Diferentes compiladores del mismo lenguaje en una misma máquina manejan
tamaños de datos que pueden no coincidir.
 Los computadores convencionales entienden los datos como ristras de bits:
•
•
•
•
El ensamblador no es un lenguaje tipado.
Ciertas instrucciones distinguen entre enteros con signo y enteros sin signo.
Instrucciones específicas para coma flotante de precisión simple o doble.
Algunas máquinas tienen instrucciones para vectores o tiras de caracteres.
5
Introducción a la programación en ensamblador del MC68000
Introducción
 MC68000: máquina de 16 bits.
• Se tomarán como base los tipos de TurboPascal y de TurboC.
• Son compiladores pensados para PC XT y AT con procesadores 8086 y 80286 de
16 bits.
 Las implementaciones de las estructuras de control pueden realizarse
mediante diferentes secuencias de código máquina.
• La secuencia concreta en código máquina es indiferente mientras el programa en
alto nivel funcione correctamente.
 Por otra parte, compiladores diferentes generan secuencias de instrucciones
de máquina diferentes dependiendo de:
• Los convenios adoptados:
ƒ Comprobaciones de la corrección de los cálculos.
ƒ Ubicación y gestión de variables.
ƒ Gestión de subprogramas.
• Las optimizaciones de código realizadas.
6
Introducción a la programación en ensamblador del MC68000
2. Directivas básicas en MC68000
1.
2.
3.
4.
5.
6.
Manipulación del contador de dirección de ensamblaje.
Definición de símbolos explícitos.
Reserva de espacio en memoria (definición de variables).
Fin de traducción.
Alineamiento.
Inclusión de ficheros.
7
Introducción a la programación en ensamblador del MC68000
MC68000: contador de dirección de ensamblaje
 El valor del CDE se va modificando a medida que se traduce el programa, de
acuerdo con el tamaño de los objetos traducidos (datos o instrucciones).
(suponemos que CDE = d)
OBJETO (instrucción o definición de datos, con sus operandos)
(ahora CDE = d+t, siendo t el tamaño de la instrucción o de los datos en octetos)
 El valor del CDE puede ser modificado a voluntad mediante la directiva ORG.
 Sintaxis:
ORG
valor
Efecto: CDE = valor.
 El nuevo valor asignado al CDE no debería ser inferior a su valor actual.
8
Introducción a la programación en ensamblador del MC68000
MC68000: símbolos explícitos
 La directiva EQU sirve para definir un símbolo explícito cuyo valor permanece
constante a lo largo del programa:
 Sintaxis:
SIMB
EQU
valor
Efecto: se inserta SIMB en la tabla de símbolos, con el valor especificado.
Nombre del símbolo
Tipo del símbolo
Valor del símbolo
...
...
...
SIMB
EQU
valor
...
...
...
 Una vez definido un símbolo mediante EQU, dicho símbolo no puede ser
redefinido.
 EQU se utiliza para definir constantes (igual que CONST en PASCAL).
 En directivas EQU no se permiten referencias adelantadas.
9
Introducción a la programación en ensamblador del MC68000
MC68000: símbolos explícitos
 La directiva SET sirve para definir un símbolo explícito redefinible.
• No se permiten referencias adelantadas.
 Sintaxis:
SIMB
SET
valor1
Efecto: se inserta SIMB en la tabla de símbolos, con el valor especificado.
Nombre del símbolo
Tipo del símbolo
Valor del símbolo
...
...
...
SIMB
SET
valor1
...
...
...
 Una vez definido un símbolo mediante SET, dicho símbolo puede ser redefinido
tantas veces como se quiera únicamente mediante otras directivas SET.
SIMB
SET
valor2
Nombre del símbolo
Tipo del símbolo
Valor del símbolo
...
...
...
SIMB
SET
valor2
...
...
...
10
Introducción a la programación en ensamblador del MC68000
Variables en un programa
 En un programa de computador, una variable es un espacio en memoria
utilizado para almacenar un dato cuyo valor puede ser modificado a lo largo del
programa.
 Tipos de variables:
• Estáticas: creadas al inicio del programa, existen mientras el programa se
encuentra en ejecución.
• Locales: propias de procedimientos y funciones, existen mientras se
ejecuta el procedimiento o función al que pertenecen.
ƒ Se crean cuando arranca el procedimiento o función, y se destruyen en el
momento en que éste termina de ejecutarse.
• Dinámicas: creadas a lo largo de la ejecución del programa, su existencia
no está ligada (en sentido estricto) a la ejecución de ningún procedimiento o
función.
ƒ Son creadas y destruidas mediante el gestor de memoria dinámica,
perteneciente al sistema operativo.
11
Introducción a la programación en ensamblador del MC68000
Variables en un programa
 Las variables estáticas ocupan espacio en el código objeto.
 Una variable estática recibe un nombre que se asocia a la dirección que ocupa
dentro de la zona de datos.
 Ejemplo (PASCAL)
PROGRAM P (input, output);
VAR
V: INTEGER;
...
Direcciones
Memoria
...
dir (asociado al nombre V)
????
Espacio ocupado por la variable V
...
12
Introducción a la programación en ensamblador del MC68000
Variables en un programa
 El valor de una variable puede modificarse una o varias veces a lo largo del
programa.
 Ejemplo (PASCAL)
Direcciones
Memoria
...
...
dir (asociado al nombre V)
5
...
...
Direcciones
Memoria
...
...
dir (asociado al nombre V)
8
...
...
V := 5;
V := V+3;
 Las directivas para reserva de espacio en memoria se suelen emplear para
definir variables estáticas.
13
Introducción a la programación en ensamblador del MC68000
MC68000: reserva de espacio en memoria
 La directiva DS (Define Storage) reserva un espacio en memoria sin asignarle
un valor inicial determinado.
 Sintaxis:
(suponemos que CDE = d)
[ETIQ]
DS.t
n
Reserva n datos de tamaño t (t=B, W ó L)
(ahora CDE = d+t*n, siendo t el tamaño de cada dato)
Efecto: se reservan en memoria n*t octetos para variables.
Direcciones
Memoria
...
d (asociado al nombre ETIQ si existe la etiqueta)
????
d+t*n
...
Espacio reservado: t*n octetos
 La etiqueta es opcional, y si existe se inserta en la tabla de símbolos como un
símbolo implícito (tipo LABEL).
 En esta directiva no se permiten referencias adelantadas.
14
Introducción a la programación en ensamblador del MC68000
MC68000: reserva de espacio en memoria
 La directiva DC (Define Constant) reserva un espacio en memoria asignándole
un valor inicial determinado.
• El nombre es confuso, porque en realidad define una variable (espacio en
memoria).
 Sintaxis:
(suponemos que CDE = d)
[ETIQ]
DC.t
val
Reserva un dato de tamaño t (t=B, W ó L)
(ahora CDE = d+t, siendo t el tamaño del dato reservado)
Efecto: se reserva en memoria un dato de t bytes para una variable, y se le asigna
un valor inicial.
Direcciones
Memoria
...
d (asociado a ETIQ si hay etiqueta)
val
d+t
...
Espacio reservado: t octetos
 La etiqueta es opcional, y si existe se inserta en la tabla de símbolos como un
símbolo implícito (tipo LABEL).
15
Introducción a la programación en ensamblador del MC68000
MC68000: reserva de espacio en memoria
 Para abreviar, con DC se pueden definir varias variables, todas ellas del mismo
tamaño, separando sus valores por comas.
• La etiqueta, si existe, se asocia únicamente al primer dato de la lista.
(suponemos que CDE = d)
[ETIQ]
DC.t
val1,val2,val3,...,valN
(ahora CDE = d+t*N, siendo t el tamaño de cada dato)
Direcciones
Memoria
...
d (asociado a ETIQ si hay etiqueta)
val1
t octetos
d+t (asociado a ETIQ+t si hay etiqueta)
val2
t octetos
d+2*t (asociado a ETIQ+2*t si hay etiqueta)
val3
t octetos
...
...
d+t*(N-1) (asociado a ETIQ+(N-1)*t si hay etiqueta)
valN
d+t*N
...
t octetos
16
Introducción a la programación en ensamblador del MC68000
MC68000: directiva de fin de traducción
 La directiva END indica al traductor que ha llegado el final del programa fuente,
y que no debe seguir traduciendo.
• Lo que vaya detrás de una directiva END se ignora.
 Sintaxis:
END
[dir]
Efecto: la traducción del programa finaliza.
 Cuando lleva un operando, esta directiva se usa para indicar la dirección de
comienzo del programa principal (o la etiqueta de la primera instrucción que
queremos ejecutar al iniciar el programa, si la tiene).
17
Introducción a la programación en ensamblador del MC68000
MC68000: directivas de alineamiento
 En las máquinas con restricciones de alineamiento, la definición de variables en
posiciones indebidas puede dar lugar a errores de ejecución de los programas.
 A veces los traductores realizan el alineamiento de los objetos correctamente a
fin de evitar dichos errores de ejecución.
 En el MC68000 se usa la directiva EVEN para alinear en una posición par el
objeto que se encuentra inmediatamente a continuación de la directiva.
 Sintaxis:
EVEN
Efecto: si el CDE tiene valor impar, le suma 1; en caso contrario no tiene efecto
ninguno.
18
Introducción a la programación en ensamblador del MC68000
3. MC68000 y las operaciones con bits
 Dependiendo de su tipo de datos, las variables utilizadas en los programas
pueden tener diferentes tamaños.
• En general el tamaño mínimo de una variable es un octeto.
 En ocasiones es preciso actuar sobre bits concretos de un operando, obviando
sus bits restantes.
 Existen computadores que disponen de instrucciones que permiten acceder a:
• Un bit concreto de un operando (sin acceder al resto).
• Un subconjunto (campo) de varios bits contiguos del operando.
 El MC68000 dispone de instrucciones de acceso a bit:
•
•
•
•
BCLR: pone a 0 un bit del operando destino.
BSET: pone a 1 un bit del operando destino.
BCHG: invierte un bit del operando destino.
BTST: testea un bit del operando destino y afecta al bit Z del CCR.
 El MC68000 no tiene instrucciones que manejen campos de bits, aunque otros
procesadores de la familia sí disponen de ellas (del MC68020 en adelante).
19
Introducción a la programación en ensamblador del MC68000
MC68000 y las operaciones con bits
 Una máscara de bits se puede entender como un dato binario (normalmente
constante) que permite actuar selectivamente sobre ciertos bits de otro dato a
través de una operación lógica (AND, OR, EOR).
 Convenientemente utilizadas, las máscaras de bits pueden emplearse para
actuar sobre subconjuntos de bits (no necesariamente contiguos) de un operando.
• Poner bits a 0: AND máscara,dato
• Poner bits a 1: OR máscara,dato
• Invertir bits: EOR máscara,dato
 Si la máscara es constante, se almacena en un dato inmediato.
 Si la máscara es variable, debe almacenarse en un registro o variable de
memoria.
 Las máscaras pueden escribirse en cualquier base de numeración.
• Lo normal es usar base binaria o hexadecimal.
20
Introducción a la programación en ensamblador del MC68000
MC68000 y las operaciones con bits
 AND máscara,dato: permite poner a 0 un conjunto de bits de un dato, dejando
inalterados los restantes.
• Ejemplo: borrar los bits 2, 3, 5 y 7 del registro D2, dejando intactos los demás
ANDI.B #%10010011,D2
 OR máscara,dato: permite poner a 1 un conjunto de bits de un dato, dejando
inalterados los restantes.
• Ejemplo: poner a 1 los bits 1, 2 y 4 del registro D1, dejando intactos los demás
ORI.B #%00010110,D3
 EOR máscara,dato: permite invertir un conjunto de bits de un dato, dejando
inalterados los restantes.
• Ejemplo: invertir los bits 4, 5, 6 y 7 del registro D4, dejando intactos los demás
EORI.B #%11110000,D4
21
Introducción a la programación en ensamblador del MC68000
MC68000 y las operaciones con bits
 Las máscaras pueden emplearse en datos de cualquier tamaño:
• Ejemplo: ANDI.L #$00FFFFFF,D5 pone a 0 los 8 bits superiores de D5.
 Las operaciones AND, OR y EOR afectan a los biestables Z y N del CCR, y
ponen a 0 los bits V y C.
• Tras usarlas es posible tomar decisiones mediante instrucciones condicionales.
• Condiciones susceptibles de ser utilizadas: EQ, NE, PL y MI.
 Las máscaras pueden emplearse para realizar tareas tan complejas como se
desee.
22
Introducción a la programación en ensamblador del MC68000
4. MC68000 y los tipos de datos simples
 El MC68000 considera tres tipos de datos según su tamaño: .B, .W y .L.
 A nivel de máquina, el MC68000 considera que los datos que maneja son
numéricos, o a lo sumo ristras de bits.
• A veces se distingue entre datos en binario puro (unsigned) o en complemento a 2
(signed).
• Hay algunas instrucciones que usan operandos codificados en BCD.
• No existe un tipo específico para caracteres, ni tampoco para datos booleanos.
 El MC68000 no maneja datos en coma flotante, salvo que cuente con un
coprocesador 68881 asociado.
 Vamos a estudiar la correspondencia entre los tipos de datos simples en
TurboPascal y su definición y manejo en el MC68000.
23
Introducción a la programación en ensamblador del MC68000
MC68000 y los tipos de datos simples
 Equivalencia de tipos en TurboPascal, TurboC y MC68000 (máquina de 16 bits):
Comentarios
Turbo Pascal
TurboC
.B
Entero sin signo 8 bits
BYTE
unsigned char
X
Entero sin signo 16 bits
WORD
unsigned int
unsigned short
Entero sin signo 32 bits
No existe
unsigned long
Entero con signo 8 bits
SHORTINT
signed char
Entero con signo 16 bits
INTEGER
int, short
Entero con signo 32 bits
LONGINT
long
Carácter
CHAR
char
signed char
unsigned char
X
Booleano
BOOLEAN
?
X
Puntero
^Tipo
Tipo *
No se han considerado datos en BCD ni en coma flotante
.W
.L
X
X
X
X
X
X
24
Introducción a la programación en ensamblador del MC68000
MC68000 y los tipos de datos simples
 Las variables de los programas se ubicarán en memoria.
 Los registros de datos del MC68000 se utilizarán generalmente para almacenar
resultados intermedios de cálculos.
 Los registros de direcciones del MC68000 servirán como punteros temporales a
variables o estructuras de datos residentes en memoria.
 El acceso a datos almacenados en memoria es notablemente más lento que el
acceso a datos ubicados en registros.
 Mantener variables en registros aumenta la velocidad de ejecución y disminuye
el tamaño de las instrucciones, pero el MC68000 hay muy pocos registros.
• Se puede complicar mucho la gestión de variables (los compiladores hacen mejor
esta tarea que los programadores).
25
Introducción a la programación en ensamblador del MC68000
5. MC68000 y las variables simples
 Analizaremos la definición y el manejo de los tipos de datos simples del lenguaje
PASCAL (en la implementación de TurboPascal) trasladados al lenguaje
ensamblador del MC68000.
 Se analizarán los siguientes tipos:
•
•
•
•
•
•
Entero con signo de 8 bits: SHORTINT, signed char.
Entero con signo de 16 bits: INTEGER, int, short.
Entero con signo de 32 bits: LONGINT, long.
Carácter de 8 bits: CHAR, char.
Booleano de 1 bit: BOOLEAN.
Puntero de 32 bits.
26
Introducción a la programación en ensamblador del MC68000
MC68000 y los enteros con signo
Turbo Pascal
C
.B
SHORTINT
signed char
X
INTEGER
int, short
LONGINT
long
.W
.L
Comentarios
Entero con signo
X
Entero con signo
X
Entero con signo
* Definición de variables SHORTINT
AS
BS
CS
DS
ES
DC.B
DC.B
DC.B
DC.B
DS.B
-5
20
$80
$7F
1
Valor
Valor
Valor
Valor
Valor
inicial: -5
inicial: 20
inicial: –128
inicial: 127
inicial indeterminado
Valor
Valor
Valor
Valor
Valor
inicial: -5
inicial: 20
inicial: –32768
inicial: 32767
inicial indeterminado
Valor
Valor
Valor
Valor
Valor
inicial: -5
inicial: 20
inicial: –2147483648
inicial: 2147483647
inicial indeterminado
* Definición de variables INTEGER
AI
BI
CI
DI
EI
DC.W
DC.W
DC.W
DC.W
DS.W
-5
20
$8000
$7FFF
1
* Definición de variables LONGINT
AL
BL
CL
DL
EL
DC.L
DC.L
DC.L
DC.L
DS.L
-5
20
$80000000
$7FFFFFFF
1
27
Introducción a la programación en ensamblador del MC68000
MC68000 y los enteros con signo
 Suma y resta
• Instrucciones: ADD y SUB (o derivados).
• Condiciones para enteros con signo:GT, GE, LT, LE, PL, MI, EQ, NE, VS, VC.
 Producto: instrucción MULS.
• Operandos fuente: 16 bits (tipo INTEGER de TurboPascal)
•Resultado: 32 bits (tipos LONGINT en TurboPascal)
 División: instrucción DIVS.
• Dividendo: 32 bits (tipo LONGINT en TurboPascal).
• Divisor y cociente: 16 bits (tipo INTEGER de TurboPascal)
•Resto: 16 bits en mitad superior (para usarlo como un dato de tipo INTEGER hay que
intercambiar antes las dos mitades del registro resultado con SWAP).
 Extensión de signo: EXT.
• No se puede hacer extensión de signo de 8 a 32 bits directamente.
EXT.W D0
Extensión de signo de 8 bits a 16 sobre D0
EXT.L D0
Extensión de signo de 16 bits a 32 sobre D0
 Cambio de signo: instrucción NEG (un solo operando).
28
Introducción a la programación en ensamblador del MC68000
MC68000 y los enteros con signo
Condición
Nemotécnico
Instrucciones
Menor que
LT (less than)
slt
blt
dblt
op
etiqueta
Dn,etiqueta
Menor o igual
LE (less or equal than)
sle
ble
dble
op
etiqueta
Dn,etiqueta
Igual que
EQ (equal)
seq
beq
dbeq
op
etiqueta
Dn,etiqueta
Distinto a
NE (not equal)
sne
bne
dbne
op
etiqueta
Dn,etiqueta
Mayor o igual que
GE (greater or equal than)
sge
bge
dbge
op
etiqueta
Dn,etiqueta
Mayor que
GT (greater than)
sgt
bgt
dbgt
op
etiqueta
Dn,etiqueta
Cierto
T (true)
st
dbt
op
Dn,etiqueta
Falso
F (false)
sf
dbf
op
Dn,etiqueta
/
dbra
Dn,etiqueta
29
Introducción a la programación en ensamblador del MC68000
MC68000 y las variables carácter
Turbo Pascal
C
.B
Comentarios
CHAR
char - signed char - unsigned char
X
Carácter
 Correspondencia caracteres - enteros: un carácter se corresponde con el ordinal
que tiene asignado en su código de representación.
• Ordinal en PASCAL: función ORD (devuelve un número en binario puro).
• Ordinal en C: número con signo (dato unsigned char) o sin signo (signed char).
ƒ
En C los enteros y los caracteres pueden intercambiarse: los caracteres
son enteros de 8 bits con o sin signo.
* Definición de variables CHAR
C1
C2
C3
C4
C5
C6
C7
DC.B
DC.B
DC.B
DC.B
DC.B
DC.B
DS.B
‘A’
‘a’
$9A
%10011010
20
‘A’+3
1
Asignado el carácter ‘A’
Asignado el carácter ‘a’
Asignado el carácter con ordinal 154
Asignado el carácter con ordinal 154
Asignado el carácter con ordinal 20
Asignado el carácter ‘D’
Sin valor inicial asignado
 En ensamblador (como en C) los caracteres se pueden utilizar en operaciones
aritméticas como números enteros de 8 bits con o sin signo.
30
Introducción a la programación en ensamblador del MC68000
MC68000 y las variables booleanas
Tipo
MIPS
Pascal
C
Booleano
1 bit
BOOLEAN
?
 Para almacenar una variable booleana es suficiente con un bit, pero en el
MC68000 las variables ocupan un mínimo de 8 bits.
 Se pueden definir las siguientes constantes:
TRUE
FALSE
EQU
EQU
1
0
* Definición de variables booleanas
A
B
C
D
DC.B
DC.B
DC.B
DS.B
TRUE
FALSE
1
1
Asignado valor 1 (TRUE)
Asignado valor 0 (FALSE)
Asignado valor 1 (TRUE)
Sin valor inicial asignado
31
Introducción a la programación en ensamblador del MC68000
MC68000 y las variables booleanas
 En lenguaje C no existen variables booleanas, ya que todos los datos los
maneja como cantidades numéricas (igual que el lenguaje ensamblador).
 El lenguaje C sí tiene operadores booleanos para realizar operaciones lógicas.
•
•
•
•
•
AND lógico bit a bit: &
OR lógico bit a bit: |
OR exclusivo bit a bit: ^
Negación lógica bit a bit:!
Comparaciones: =, !=, >, <, >=, <=
 Evaluación booleana de un dato en C:
• Si el dato tiene todos sus bits a 0 se considera que es falso.
• Si el dato tiene uno o más bits distintos de 0 se considera que es cierto.
 Esto concuerda con la instrucción Scond operando del MC68000:
• Si cond es cierta, operando toma el valor $FF (tamaño octeto, todos los bits a 1).
• Si cond es falsa, operando toma el valor $00 (tamaño octeto, todos los bits a 0).
32
Introducción a la programación en ensamblador del MC68000
MC68000 y los punteros
 En los lenguajes de alto nivel, los punteros son un concepto abstracto en cuanto
a que no se especifican sus características ni su rango válido de valores.
 Físicamente, un puntero es un valor numérico que no contiene un dato en sí,
sino la dirección de una variable que está ubicada en memoria.
 En lenguaje PASCAL el uso de los punteros está muy limitado.
• Asignaciones
• Comparaciones de igualdad.
• Creación o borrado dinámico de una variable apuntada por un puntero (S.O.).
 En C los punteros se pueden usar en expresiones aritméticas como los enteros.
 En el MC68000 la noción de puntero variable coincide con la de registro de
direcciones.
• Los registros de direcciones se pueden usar en operaciones aritméticas.
 Los punteros pueden tener 16 bits o preferentemente 32 bits.
33
Introducción a la programación en ensamblador del MC68000
6. MC68000 y las expresiones aritméticas
 Las expresiones aritméticas se pueden evaluar mediante el modelo de notación
polaca inversa con la ayuda de una pila.
• En el MC68000 la pila de evaluación se puede sustituir total o parcialmente por los
registros de datos.
Expresión en PASCAL con variables enteras:
x:=(x*y+z*z) DIV (x-y);
Expresión en C con variables enteras:
x=(x*y+z*z)/(x-y);
Evaluación de la expresión en ensamblador:
MOVE.W
X,D7
MULS
Y,D7
MOVE.W
Z,D6
MULS
D6,D6
ADD.W
D6,D7
MOVE.W
X,D6
SUB.W
Y,D6
EXT.L
D7
DIVS
D6,D7
MOVE.W
D7,X
x
x*y
z
z*z
x+y+z*z
x-y
valor en D7
valor almacenado en x
34
Introducción a la programación en ensamblador del MC68000
MC68000 y las expresiones aritméticas
 Los compiladores de
PASCAL generan código
para comprobar posibles
desbordamientos en cálculos
o en índices, no así los de C.
Expresión en PASCAL con
variables enteras:
x:=(x*y+z*z) DIV (x-y);
Expresión en C con variables
enteras:
x=(x*y+z*z)/(x-y);
MOVE.W
MULS
CMPI.L
BHI
MOVE.W
EOR.W
EOR.W
BTST
BNE
MOVE.W
MULS
CMPI.L
BHI
MOVE.W
EOR.W
EOR.W
BTST
BNE
ADD.W
BVS
MOVE.W
SUB.W
BVS
BEQ
EXT.L
DIVS
BVS
MOVE.W
X,D7
Y,D7
#$0000FFFF,D7
DESBORDE
D7,D0
X,D0
Y,D0
#15,D0
DESBORDE
Z,D6
D6,D6
#$0000FFFF,D7
DESBORDE
D7,D0
X,D0
Y,D0
#15,D0
DESBORDE
D6,D7
DESBORDE
X,D6
Y,D6
DESBORDE
DIV_0
D7
D6,D7
DESBORDE
D7,X
x
x*y
z
z*z
x+y+z*z
x-y
valor en D7
valor almacenado en x
35
Introducción a la programación en ensamblador del MC68000
7. MC68000 y las expresiones booleanas
 Al igual que las expresiones aritméticas, las expresiones booleanas se pueden
evaluar mediante el modelo de notación polaca inversa.
Expresión en PASCAL con variables: zb := (x > y) AND (NOT xb OR yb);
•
•
•
•
xb, yb y zb son variables booleanas; x e y son variables INTEGER.
FALSE: dato con todos sus bits a 0.
TRUE: dato con uno o varios bits a 1, preferentemente igual a $FF.
Expresión en C (todas las variables enteras): zb = (x > y) && (!xb || yb);
MOVE.W
CMP.W
SGT
TST.B
SNE
NOT.B
TST.B
SNE
OR.B
AND.B
MOVE.B
X,D7
Y,D7
D7
XB
D6
D6
YB
D5
D5,D6
D6,D7
D7,ZB
x
Comparar x con y
Resultado parcial en zb
xb
NOT xb
yb
NOT xb OR yb
Resultado final en D7
Resultado final en zb
36
Introducción a la programación en ensamblador del MC68000
MC68000 y las expresiones booleanas
 Las expresiones se pueden evaluar mediante cortocircuito: puede ser que el
resultado final se conozca sin necesidad de evaluar la expresión completamente.
PASCAL:
C:
zb := (x > y) AND (NOT xb OR yb);
(xb, yb y zb son variables booleanas; x e y son variables INTEGER)
zb = (x > y) && (!xb || yb);
(Se asume que todas las variables son enteras)
MOVE.W
CMP.W
SGT
BLE
MOVE.B
SNE
NOT.B
BNE
TST.B
SNE
MOVE.B
FIN
X,D7
Y,D7
D7
FIN
XB,D7
D7
D7
FIN
YB
D7
D7,ZB
x
Comparar x con y
Resultado parcial en D7
Cortocircuito
xb
NOT xb
Cortocircuito
Testear yb
Resultado final en D7
Resultado final en zb
37
Introducción a la programación en ensamblador del MC68000
8. MC68000 y las sentencias de control
 Analizaremos las sentencias de control sencillas del lenguaje PASCAL
trasladadas al lenguaje ensamblador del MC68000.
 Se analizarán las siguientes sentencias de control:
•
•
•
•
•
•
Selección IF - THEN.
Selección IF - THEN - ELSE.
Bucle REPEAT - UNTIL.
Bucle WHILE - DO.
Bucle FOR - TO.
Bucle FOR - DOWNTO.
38
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia IF - THEN
 PASCAL (variables
enteras):
FALSA
¿COND?
CIERTA
IF x >= y
THEN
BEGIN
x := x+2;
y := y-2;
END;
 Ensamblador MC68000:
IF
EQU
MOVE.W
CMP.W
BLT
ADDQ.W
SUBQ.W
EQU
BLOQUE_THEN
 C (variables enteras):
FIN
*
X,D7
Y,D7
FIN
#2,X
#2,Y
*
if (x >= y) {
x = x+2;
y = y-2;
};
39
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia IF - THEN - ELSE
 PASCAL
(variables enteras):
CIERTA
¿COND?
FALSA
BLOQUE_ELSE
IF x >= y
THEN
BEGIN
x :=
y :=
END;
ELSE
BEGIN
x :=
y :=
END;
 Ensamblador MC68000:
IF
x+2;
y+2;
ELSE
x-2;
y-2;
 C (variables enteras):
BLOQUE_THEN
THEN
FIN
EQU
MOVE.W
CMP.W
BGE
SUBQ.W
SUBQ.W
BRA
ADDQ.W
ADDQ.W
EQU
*
X,D7
Y,D7
THEN
#2,X
#2,Y
FIN
#2,X
#2,Y
*
if (x >= y) {
x = x+2; y = y+2;
}
else {
x = x-2; y = y-2;
}
40
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia REPEAT - UNTIL
 PASCAL (variables enteras):
a := 81;
b := 18;
REPEAT
mcd := b;
resto := a MOD b;
a := b;
b := resto;
UNTIL resto = 0;
BLOQUE_REPEAT
 C (variables enteras):
¿COND?
FALSA
CIERTA
a = 81;
b = 18;
do {
mcd = b;
resto = a % b;
a = b;
b = resto;
} while (resto <> 0);
 Ensamblador MC68000:
MOVE.W
MOVE.W
REPEAT EQU
MOVE.W
CLR.L
MOVE.W
DIVS
SWAP
MOVE.W
MOVE.W
MOVE.W
UNTIL TST.W
BNE
FIN
EQU
#81,A
#18,B
*
B,MCD
D7
A,D7
B,D7
D7
D7,RESTO
B,A
RESTO,B
RESTO
REPEAT
*
Algoritmo del ejemplo: cálculo del máximo común divisor.
41
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia WHILE - DO
 PASCAL (variables enteras):  Ensamblador MC68000:
¿COND?
CIERTA
BLOQUE_WHILE
FALSA
n := 5; fant := 1;
f := 1; i := 2;
WHILE i <= n DO
BEGIN
faux := f;
f := f + fant;
fant := faux;
i := i+1;
END;
WHILE
 C (variables enteras):
n = 5; fant = 1;
f = 1; i = 2;
for ( ; i <= n; ) {
faux = f;
f = f + fant;
fant = faux;
i = i+1;
END;
FIN
MOVE.W
MOVE.W
MOVE.W
MOVE.W
EQU
MOVE.W
CMP.W
BGT
MOVE.W
MOVE.W
ADD.W
MOVE.W
ADDQ.W
BRA
EQU
#5,N
#1,FANT
#1,F
#2,I
*
I,D7
N,D7
FIN
F,FAUX
FANT,D6
D6,F
FAUX,FANT
#1,I
WHILE
*
Algoritmo del ejemplo: cálculo del término enésimo de la serie de Fibonacci.
42
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia FOR - TO
 En PASCAL estándar, el valor final del contador es indefinido, y además el contador no
debería ser modificado dentro del bucle (¡puede haber resultados inesperados!).
 El límite final no cambia a lo largo de la ejecución del bucle (aun cuando sea una
variable y ésta se modifique en el bucle).
 Ensamblador MC68000
i:= valor inicial
CIERTO
¿i > límite final?
FALSO
i := i+1
BLOQUE FOR
 PASCAL (variables enteras):
(versión PASCAL):
n := 5;
fant := 1;
f := 1;
FOR i := 2 TO n DO
BEGIN
faux := f;
f := f + fant;
fant := faux;
END;
MOVE.W
MOVE.W
MOVE.W
FOR
EQU
MOVE.W
MOVE.W
CMP.W
BLT
BRA
INC
ADDQ.W
BLOQUE EQU
MOVE.W
MOVE.W
ADD.W
MOVE.W
CMP.W
BNE
FIN
EQU
 C (variables enteras):
n = 5; fant = 1; f = 1;
for (i=2; i<=n; i++) {
faux := f;
f := f + fant;
fant := faux;
}
¿i <> límite final?
CIERTO
FALSO
#5,N
#1,FANT
#1,F
*
#2,I
N,D7
I,D7
FIN
BLOQUE
#1,I
*
F,FAUX
FANT,D6
D6,F
FAUX,FANT
I,D7
INC
43
*
Introducción a la programación en ensamblador del MC68000
MC68000: sentencia FOR - DOWNTO
 PASCAL (variables enteras):
i:= valor inicial
CIERTO
¿i < límite final?
i := i-1
BLOQUE FOR
¿i <> límite final?
CIERTO
FALSO
FALSO
n := 5;
fant := 1;
f := 1;
FOR i := n DOWNTO 2 DO
BEGIN
faux := f;
f := f + fant;
fant := faux;
END;
 C (variables enteras):
n = 5;
fant = 1;
f = 1;
for (i=n; i<=2; i--) {
faux = f;
f = f + fant;
fant = faux;
}
 Ensamblador MC68000
(versión PASCAL):
MOVE.W
MOVE.W
MOVE.W
FOR
EQU
MOVE.W
MOVE.W
CMP.W
BGT
BRA
DEC
SUBQ.W
BLOQUE EQU
MOVE.W
MOVE.W
ADD.W
MOVE.W
CMP.W
BNE
FIN
EQU
#5,N
#1,FANT
#1,F
*
N,I
#2,D7
I,D7
FIN
BLOQUE
#1,I
*
F,FAUX
FANT,D6
D6,F
FAUX,FANT
I,D7
DEC
*
44
Introducción a la programación en ensamblador del MC68000
Comentarios sobre sentencias de control
 En cualquier caso, las condiciones que regulan el comportamiento de las sentencias de
control pueden evaluarse de forma completa o mediante cortocircuito.
 Las implementaciones presentadas para los bucles FOR corresponden con el
comportamiento demostrado por el FOR de TurboPascal.
•
•
•
El límite final para el contador queda prefijado al inicio del bucle.
Si se modifica el contador en el cuerpo del bucle pueden obtenerse resultados inesperados.
En PASCAL estándar, al terminar un FOR el valor del contador es indefinido.
 Un bucle FOR es un bucle WHILE con una condición dependiente de un contador que se
incrementa o decrementa unitariamente, y con un límite final prefijado al comienzo del bucle.
 Los bucles WHILE pueden dar problemas con condiciones del tipo <= o >= si el
valor del límite final coincide con un extremo del rango.
•
•
¿Qué sucede si se pide calcular el término 32767 de la serie de Fibonacci en el ejemplo?
Ejercicio: proponer e implementar posibles soluciones (aumentar el tamaño de la variable del
contador, reestructurar el bucle, etc).
 Sentencia CASE:
• Puede implementarse mediante estructuras IF-THEN-ELSE anidadas.
• Es más eficiente (y complicado) implementarla mediante tablas de saltos.
45
Descargar