Introducción a la programación en ensamblador.
Transcript of Introducción a la programación en ensamblador.
Universidad
Rey Juan Carlos
ESTRUCTURA Y TECNOLOGESTRUCTURA Y TECNOLOGÍÍA DE A DE COMPUTADORESCOMPUTADORES
Introducción a la programación
en ensamblador del MC68000
Luis Rincón CórcolesLicesio J. Rodríguez-Aragón
Introducción a la programación en ensamblador del MC68000
2
1. Introducción.
2. Directivas básicas de los ensambladores para MC68000.
3. MC68000 y las operaciones con bits.
4. MC68000 y los tipos de datos simples.
5. MC68000 y las variables simples.
6. MC68000 y la evaluación de expresiones aritméticas.
7. MC68000 y la evaluación de expresiones booleanas.
8. MC68000 y las sentencias de control.
Programa
Introducción a la programación en ensamblador del MC68000
3
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,
1993F.G. McCABE. High-Level Programmer’s Guide to the 68000. Prentice-Hall, 1992.
Bibliografía
Introducción a la programación en ensamblador del MC68000
4
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.
Introducción a la programación en ensamblador del MC68000
5
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.
Introducción a la programación en ensamblador del MC68000
6
IntroducciónMC68000: 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.
Introducción a la programación en ensamblador del MC68000
7
2. Directivas básicas en MC68000
1. Manipulación del contador de dirección de ensamblaje.
2. Definición de símbolos explícitos.
3. Reserva de espacio en memoria (definición de variables).
4. Fin de traducción.
5. Alineamiento.
6. Inclusión de ficheros.
Introducción a la programación en ensamblador del MC68000
8
MC68000: contador de dirección de ensamblajeEl 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.
Introducción a la programación en ensamblador del MC68000
9
MC68000: símbolos explícitosLa 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.
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.
.........
Valor del símboloTipo del símboloNombre del símbolo
.........
valorEQUSIMB
Introducción a la programación en ensamblador del MC68000
10
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.
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
.........
Valor del símboloTipo del símboloNombre del símbolo
.........
valor1SETSIMB
.........
Valor del símboloTipo del símboloNombre del símbolo
.........
valor2SETSIMB
MC68000: símbolos explícitos
Introducción a la programación en ensamblador del MC68000
11
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.
Introducción a la programación en ensamblador del MC68000
12
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);
VARV: INTEGER;
...
...
MemoriaDirecciones
...
Espacio ocupado por la variable V????dir (asociado al nombre V)
Introducción a la programación en ensamblador del MC68000
13
Variables en un programa
El valor de una variable puede modificarse una o varias veces a lo largo del programa.
Ejemplo (PASCAL)
V := 5;
V := V+3;
Las directivas para reserva de espacio en memoria se suelen emplear para definir variables estáticas.
......
5dir (asociado al nombre V)
......
MemoriaDirecciones
......
8dir (asociado al nombre V)
......
MemoriaDirecciones
Introducción a la programación en ensamblador del MC68000
14
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.
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.
...d+t*n
MemoriaDirecciones
...
Espacio reservado: t*n octetos????d (asociado al nombre ETIQ si existe la etiqueta)
MC68000: reserva de espacio en memoria
Introducción a la programación en ensamblador del MC68000
15
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.
La etiqueta es opcional, y si existe se inserta en la tabla de símbolos como un símbolo implícito (tipo LABEL).
...d+t
MemoriaDirecciones
...
Espacio reservado: t octetosvald (asociado a ETIQ si hay etiqueta)
MC68000: reserva de espacio en memoria
Introducción a la programación en ensamblador del MC68000
16
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)
t octetosval3d+2*t (asociado a ETIQ+2*t si hay etiqueta)
t octetosvalNd+t*(N-1) (asociado a ETIQ+(N-1)*t si hay etiqueta)
t octetosval2d+t (asociado a ETIQ+t si hay etiqueta)
......
...d+t*N
MemoriaDirecciones
...
t octetosval1d (asociado a ETIQ si hay etiqueta)
MC68000: reserva de espacio en memoria
Introducción a la programación en ensamblador del MC68000
17
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).
MC68000: directiva de fin de traducción
Introducción a la programación en ensamblador del MC68000
18
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.
MC68000: directivas de alineamiento
Introducción a la programación en ensamblador del MC68000
19
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).
Introducción a la programación en ensamblador del MC68000
20
MC68000 y las operaciones con bitsUna 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 dememoria.
Las máscaras pueden escribirse en cualquier base de numeración.• Lo normal es usar base binaria o hexadecimal.
Introducción a la programación en ensamblador del MC68000
21
MC68000 y las operaciones con bitsAND 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
Introducción a la programación en ensamblador del MC68000
22
MC68000 y las operaciones con bitsLas 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.
Introducción a la programación en ensamblador del MC68000
23
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.
Introducción a la programación en ensamblador del MC68000
24
MC68000 y los tipos de datos simplesEquivalencia de tipos en TurboPascal, TurboC y MC68000 (máquina de 16 bits):
Puntero
Booleano
Carácter
Entero con signo 32 bits
Entero con signo 16 bits
Entero con signo 8 bits
Entero sin signo 32 bits
Entero sin signo 16 bits
Entero sin signo 8 bits
Comentarios
Xunsigned int
unsigned shortWORD
Xunsigned longNo existe
^Tipo
BOOLEAN
CHAR
LONGINT
INTEGER
SHORTINT
BYTE
Turbo Pascal
Tipo *
?
charsigned char
unsigned char
long
int, short
signed char
unsigned char
TurboC
X
X
X
X
X
X
X
.L.W.B
No se han considerado datos en BCD ni en coma flotante
Introducción a la programación en ensamblador del MC68000
25
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).
Introducción a la programación en ensamblador del MC68000
26
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.
Introducción a la programación en ensamblador del MC68000
27
MC68000 y los enteros con signo
LONGINT
INTEGER
SHORTINT
Turbo Pascal
long
int, short
signed char
C
Entero con signoX
Entero con signoX
Entero con signoX
Comentarios.L.W.B
* Definición de variables SHORTINTAS DC.B -5 Valor inicial: -5BS DC.B 20 Valor inicial: 20CS DC.B $80 Valor inicial: –128DS DC.B $7F Valor inicial: 127ES DS.B 1 Valor inicial indeterminado* Definición de variables INTEGERAI DC.W -5 Valor inicial: -5BI DC.W 20 Valor inicial: 20CI DC.W $8000 Valor inicial: –32768DI DC.W $7FFF Valor inicial: 32767EI DS.W 1 Valor inicial indeterminado* Definición de variables LONGINTAL DC.L -5 Valor inicial: -5BL DC.L 20 Valor inicial: 20CL DC.L $80000000 Valor inicial: –2147483648DL DC.L $7FFFFFFF Valor inicial: 2147483647EL DS.L 1 Valor inicial indeterminado
Introducción a la programación en ensamblador del MC68000
28
MC68000 y los enteros con signoSuma 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 D0EXT.L D0 Extensión de signo de 16 bits a 32 sobre D0
Cambio de signo: instrucción NEG (un solo operando).
Introducción a la programación en ensamblador del MC68000
29
MC68000 y los enteros con signo
sf opdbf Dn,etiqueta / dbra Dn,etiquetaF (false)Falso
st opdbt Dn,etiqueta
sgt opbgt etiquetadbgt Dn,etiqueta
sge opbge etiquetadbge Dn,etiqueta
sne opbne etiquetadbne Dn,etiqueta
seq opbeq etiquetadbeq Dn,etiqueta
sle opble etiquetadble Dn,etiqueta
slt opblt etiquetadblt Dn,etiqueta
Instrucciones
GT (greater than)Mayor que
GE (greater or equal than)Mayor o igual que
EQ (equal)Igual que
NE (not equal)Distinto a
LE (less or equal than)Menor o igual
T (true)Cierto
LT (less than)Menor que
NemotécnicoCondición
Introducción a la programación en ensamblador del MC68000
30
MC68000 y las variables carácter
CHAR
Turbo Pascal
char - signed char - unsigned char
C
CarácterX
Comentarios.B
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 CHARC1 DC.B ‘A’ Asignado el carácter ‘A’C2 DC.B ‘a’ Asignado el carácter ‘a’C3 DC.B $9A Asignado el carácter con ordinal 154C4 DC.B %10011010 Asignado el carácter con ordinal 154C5 DC.B 20 Asignado el carácter con ordinal 20C6 DC.B ‘A’+3 Asignado el carácter ‘D’C7 DS.B 1 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.
Introducción a la programación en ensamblador del MC68000
31
MC68000 y las variables booleanas
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 EQU 1FALSE EQU 0
* Definición de variables booleanasA DC.B TRUE Asignado valor 1 (TRUE)B DC.B FALSE Asignado valor 0 (FALSE)C DC.B 1 Asignado valor 1 (TRUE)D DS.B 1 Sin valor inicial asignado
Booleano
Tipo
1 bit
MIPS
BOOLEAN
Pascal
?
C
Introducción a la programación en ensamblador del MC68000
32
MC68000 y las variables booleanasEn 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).
Introducción a la programación en ensamblador del MC68000
33
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.
Introducción a la programación en ensamblador del MC68000
34
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 xMULS Y,D7 x*yMOVE.W Z,D6 zMULS D6,D6 z*zADD.W D6,D7 x+y+z*zMOVE.W X,D6SUB.W Y,D6 x-yEXT.L D7DIVS D6,D7 valor en D7MOVE.W D7,X valor almacenado en x
Introducción a la programación en ensamblador del MC68000
35
MC68000 y las expresiones aritméticasMOVE.W X,D7 xMULS Y,D7 x*yCMPI.L #$0000FFFF,D7BHI DESBORDEMOVE.W D7,D0EOR.W X,D0EOR.W Y,D0BTST #15,D0BNE DESBORDEMOVE.W Z,D6 zMULS D6,D6 z*zCMPI.L #$0000FFFF,D7BHI DESBORDEMOVE.W D7,D0EOR.W X,D0EOR.W Y,D0BTST #15,D0BNE DESBORDEADD.W D6,D7 x+y+z*zBVS DESBORDEMOVE.W X,D6SUB.W Y,D6 x-yBVS DESBORDEBEQ DIV_0EXT.L D7DIVS D6,D7 valor en D7BVS DESBORDEMOVE.W D7,X valor almacenado en x
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);
Introducción a la programación en ensamblador del MC68000
36
7. MC68000 y las expresiones booleanasAl 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 X,D7 xCMP.W Y,D7 Comparar x con ySGT D7 Resultado parcial en zbTST.B XB xbSNE D6NOT.B D6 NOT xbTST.B YB ybSNE D5OR.B D5,D6 NOT xb OR ybAND.B D6,D7 Resultado final en D7MOVE.B D7,ZB Resultado final en zb
Introducción a la programación en ensamblador del MC68000
37
MC68000 y las expresiones booleanasLas expresiones se pueden evaluar mediante cortocircuito: puede ser que el
resultado final se conozca sin necesidad de evaluar la expresión completamente.
PASCAL: zb := (x > y) AND (NOT xb OR yb);(xb, yb y zb son variables booleanas; x e y son variables INTEGER)
C: zb = (x > y) && (!xb || yb);(Se asume que todas las variables son enteras)
MOVE.W X,D7 xCMP.W Y,D7 Comparar x con ySGT D7 Resultado parcial en D7BLE FIN CortocircuitoMOVE.B XB,D7 xbSNE D7NOT.B D7 NOT xbBNE FIN CortocircuitoTST.B YB Testear ybSNE D7 Resultado final en D7
FIN MOVE.B D7,ZB Resultado final en zb
Introducción a la programación en ensamblador del MC68000
38
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.
Introducción a la programación en ensamblador del MC68000
39
MC68000: sentencia IF - THEN
¿COND?
BLOQUE_THEN
FALSA
CIERTA
Ensamblador MC68000:
IF EQU *MOVE.W X,D7CMP.W Y,D7BLT FINADDQ.W #2,XSUBQ.W #2,Y
FIN EQU *
PASCAL (variablesenteras):
IF x >= yTHEN
BEGINx := x+2;y := y-2;
END;
C (variables enteras):
if (x >= y) {x = x+2;y = y-2;
};
Introducción a la programación en ensamblador del MC68000
40
MC68000: sentencia IF - THEN - ELSE
Ensamblador MC68000:
IF EQU *MOVE.W X,D7CMP.W Y,D7BGE THEN
ELSE SUBQ.W #2,XSUBQ.W #2,YBRA FIN
THEN ADDQ.W #2,XADDQ.W #2,Y
FIN EQU *
¿COND?
BLOQUE_ELSE
CIERTA
FALSA
BLOQUE_THEN
PASCAL(variables enteras):
IF x >= yTHEN
BEGINx := x+2;y := y+2;
END;ELSE
BEGINx := x-2;y := y-2;
END;
C (variables enteras):
if (x >= y) {x = x+2; y = y+2;
}else {
x = x-2; y = y-2;}
Introducción a la programación en ensamblador del MC68000
41
MC68000: sentencia REPEAT - UNTIL
Ensamblador MC68000:
MOVE.W #81,AMOVE.W #18,B
REPEAT EQU *MOVE.W B,MCDCLR.L D7MOVE.W A,D7DIVS B,D7SWAP D7MOVE.W D7,RESTOMOVE.W B,AMOVE.W RESTO,B
UNTIL TST.W RESTOBNE REPEAT
FIN EQU *
¿COND?
BLOQUE_REPEAT
FALSA
CIERTA
Algoritmo del ejemplo: cálculo del máximo común divisor.
PASCAL (variables enteras):a := 81;b := 18;REPEAT
mcd := b;resto := a MOD b;a := b;b := resto;
UNTIL resto = 0;
C (variables enteras):a = 81;b = 18;do {mcd = b;resto = a % b;a = b;b = resto;
} while (resto <> 0);
Introducción a la programación en ensamblador del MC68000
42
MC68000: sentencia WHILE - DOEnsamblador MC68000:
MOVE.W #5,NMOVE.W #1,FANTMOVE.W #1,FMOVE.W #2,I
WHILE EQU *MOVE.W I,D7CMP.W N,D7BGT FINMOVE.W F,FAUXMOVE.W FANT,D6ADD.W D6,FMOVE.W FAUX,FANTADDQ.W #1,IBRA WHILE
FIN EQU *
Algoritmo del ejemplo: cálculo del término enésimo de la serie de Fibonacci.
¿COND?
BLOQUE_WHILE
FALSA
CIERTA
PASCAL (variables enteras):n := 5; fant := 1;f := 1; i := 2;WHILE i <= n DOBEGIN
faux := f;f := f + fant;fant := faux;i := i+1;
END;
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;
Introducción a la programación en ensamblador del MC68000
43
MC68000: sentencia FOR - TO
Ensamblador MC68000 (versión PASCAL):
MOVE.W #5,NMOVE.W #1,FANTMOVE.W #1,F
FOR EQU *MOVE.W #2,IMOVE.W N,D7CMP.W I,D7BLT FINBRA BLOQUE
INC ADDQ.W #1,IBLOQUE EQU *
MOVE.W F,FAUXMOVE.W FANT,D6ADD.W D6,FMOVE.W FAUX,FANTCMP.W I,D7BNE INC
FIN EQU *
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).
i:= valor inicial
FALSO
CIERTO
i := i+1
BLOQUE FOR
CIERTO FALSO¿i > límite final?
¿i <> límite final?
PASCAL (variables enteras):n := 5;fant := 1;f := 1;FOR i := 2 TO n DOBEGIN
faux := f;f := f + fant;fant := faux;
END;
C (variables enteras):n = 5; fant = 1; f = 1;for (i=2; i<=n; i++) {faux := f;f := f + fant;fant := faux;
}
Introducción a la programación en ensamblador del MC68000
44
MC68000: sentencia FOR - DOWNTOEnsamblador MC68000
(versión PASCAL):MOVE.W #5,NMOVE.W #1,FANTMOVE.W #1,F
FOR EQU *MOVE.W N,IMOVE.W #2,D7CMP.W I,D7BGT FINBRA BLOQUE
DEC SUBQ.W #1,IBLOQUE EQU *
MOVE.W F,FAUXMOVE.W FANT,D6ADD.W D6,FMOVE.W FAUX,FANTCMP.W I,D7BNE DEC
FIN EQU *
i:= valor inicial
FALSO
CIERTO
i := i-1
BLOQUE FOR
CIERTO FALSO¿i < límite final?
¿i <> límite final?
PASCAL (variables enteras):n := 5;fant := 1;f := 1;FOR i := n DOWNTO 2 DOBEGIN
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;
}
Introducción a la programación en ensamblador del MC68000
45
Comentarios sobre sentencias de controlEn 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.