Sie sind auf Seite 1von 23

Universidad Rey Juan Carlos

ESTRUCTURA Y TECNOLOGA DE COMPUTADORES


Introduccin a la programacin en ensamblador del MC68000
Luis Rincn Crcoles Licesio J. Rodrguez-Aragn

Introduccin a la programacin en ensamblador del MC68000

Programa
1. 2. 3. 4. 5. 6. 7. 8. Introduccin. Directivas bsicas 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 evaluacin de expresiones aritmticas. MC68000 y la evaluacin de expresiones booleanas. MC68000 y las sentencias de control.

Introduccin a la programacin en ensamblador del MC68000

Bibliografa
D.A. PATTERSON, J.L HENNESSY. Estructura y diseo de computadores. Revert, 2000. M68000 8/16/32 Bit Microprocessors Users Manual. 9th edition. Motorola, 1993. Motorola M68000 Family Programmers Reference Manual. Motorola, 1992. A. CLEMENTS. Microprocessor Systems Design. 3rd edition, ITP - PWS Publishing Company, 1997. J. SEPTIN, H. MECHA, R. MORENO, K. OLCOZ. La familia del MC68000. Sntesis, 1995. C. CERRADA, V. FELIU. Estructura y Tecnologa de Computadores I. UNED, 1993 F.G. McCABE. High-Level Programmers Guide to the 68000. Prentice-Hall, 1992.

Introduccin a la programacin en ensamblador del MC68000

1. Introduccin
Hasta ahora hemos estudiado los fundamentos del lenguaje ensamblador:
Repertorios de instrucciones. Modos de direccionamiento. Directivas de ensamblador. Herramientas de traduccin de programas. Proceso de creacin de un programa.

Ahora vamos a estudiar los fundamentos de la programacin en ensamblador:


Uso de las directivas ms habituales. Manejo de bits individuales y datos simples. Evaluacin de expresiones aritmticas y booleanas. Implementacin de estructuras de control.

Ms adelante trataremos conceptos ms avanzados:


Implementacin y manejo de estructuras de datos. Gestin de subrutinas. Bibliotecas de subprogramas. Etc.
4

Introduccin a la programacin en ensamblador del MC68000

Introduccin
Los objetivos perseguidos son:
Aprender a programar en ensamblador. Aprender cmo generan cdigo los compiladores.

Los lenguajes de programacin de alto nivel habitualmente no definen en sus estndares los tamaos exactos de los datos (al menos de los datos numricos).
Normalmente el entero base coincide en tamao con la palabra del computador. Diferentes compiladores del mismo lenguaje en una misma mquina manejan tamaos 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 especficas para coma flotante de precisin simple o doble. Algunas mquinas tienen instrucciones para vectores o tiras de caracteres.

Introduccin a la programacin en ensamblador del MC68000

Introduccin
MC68000: mquina de 16 bits.
Se tomarn 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 cdigo mquina.
La secuencia concreta en cdigo mquina es indiferente mientras el programa en alto nivel funcione correctamente.

Por otra parte, compiladores diferentes generan secuencias de instrucciones de mquina diferentes dependiendo de:
Los convenios adoptados: Comprobaciones de la correccin de los clculos. Ubicacin y gestin de variables. Gestin de subprogramas. Las optimizaciones de cdigo realizadas.

Introduccin a la programacin en ensamblador del MC68000

2. Directivas bsicas en MC68000


1. 2. 3. 4. 5. 6. Manipulacin del contador de direccin de ensamblaje. Definicin de smbolos explcitos. Reserva de espacio en memoria (definicin de variables). Fin de traduccin. Alineamiento. Inclusin de ficheros.

Introduccin a la programacin en ensamblador del MC68000

MC68000: contador de direccin de ensamblaje


El valor del CDE se va modificando a medida que se traduce el programa, de acuerdo con el tamao de los objetos traducidos (datos o instrucciones).
(suponemos que CDE = d)

OBJETO (instruccin o definicin de datos, con sus operandos)


(ahora CDE = d+t, siendo t el tamao de la instruccin o de los datos en octetos)

El valor del CDE puede ser modificado a voluntad mediante la directiva ORG. Sintaxis: ORG Efecto: CDE = valor. El nuevo valor asignado al CDE no debera ser inferior a su valor actual.
8

valor

Introduccin a la programacin en ensamblador del MC68000

MC68000: smbolos explcitos


La directiva EQU sirve para definir un smbolo explcito cuyo valor permanece constante a lo largo del programa: Sintaxis: SIMB

EQU

valor

Efecto: se inserta SIMB en la tabla de smbolos, con el valor especificado.


Nombre del smbolo ... SIMB ... Tipo del smbolo ... EQU ... Valor del smbolo ... valor ...

Una vez definido un smbolo mediante EQU, dicho smbolo no puede ser redefinido. EQU se utiliza para definir constantes (igual que CONST en PASCAL). En directivas EQU no se permiten referencias adelantadas.
9

Introduccin a la programacin en ensamblador del MC68000

MC68000: smbolos explcitos


La directiva SET sirve para definir un smbolo explcito redefinible.
No se permiten referencias adelantadas.

Sintaxis: SIMB

SET

valor1

Efecto: se inserta SIMB en la tabla de smbolos, con el valor especificado.


Nombre del smbolo ... SIMB ... Tipo del smbolo ... SET ... Valor del smbolo ... valor1 ...

Una vez definido un smbolo mediante SET, dicho smbolo puede ser redefinido tantas veces como se quiera nicamente mediante otras directivas SET. SIMB SET valor2
Nombre del smbolo ... SIMB ... Tipo del smbolo ... SET ... Valor del smbolo ... valor2 ... 10

Introduccin a la programacin 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: Estticas: creadas al inicio del programa, existen mientras el programa se encuentra en ejecucin. Locales: propias de procedimientos y funciones, existen mientras se ejecuta el procedimiento o funcin al que pertenecen.
Se crean cuando arranca el procedimiento o funcin, y se destruyen en el momento en que ste termina de ejecutarse.

Dinmicas: creadas a lo largo de la ejecucin del programa, su existencia no est ligada (en sentido estricto) a la ejecucin de ningn procedimiento o funcin.
Son creadas y destruidas mediante el gestor de memoria dinmica, perteneciente al sistema operativo.

11

Introduccin a la programacin en ensamblador del MC68000

Variables en un programa
Las variables estticas ocupan espacio en el cdigo objeto. Una variable esttica recibe un nombre que se asocia a la direccin que ocupa dentro de la zona de datos. Ejemplo (PASCAL) PROGRAM P (input, output); VAR V: INTEGER; ...
Direcciones dir (asociado al nombre V) Memoria ... ???? ...
12

Espacio ocupado por la variable V

Introduccin a la programacin 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) V := 5;
Direcciones ... dir (asociado al nombre V) ... Memoria ... 5 ...

V := V+3;

Direcciones ... dir (asociado al nombre V) ...

Memoria ... 8 ...

Las directivas para reserva de espacio en memoria se suelen emplear para definir variables estticas.

13

Introduccin a la programacin 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

Reserva n datos de tamao t (t=B, W L)

(ahora CDE = d+t*n, siendo t el tamao de cada dato)

Efecto: se reservan en memoria n*t octetos para variables.


Direcciones d (asociado al nombre ETIQ si existe la etiqueta) d+t*n Memoria ... ???? ... Espacio reservado: t*n octetos

La etiqueta es opcional, y si existe se inserta en la tabla de smbolos como un smbolo implcito (tipo LABEL). En esta directiva no se permiten referencias adelantadas.
14

Introduccin a la programacin en ensamblador del MC68000

MC68000: reserva de espacio en memoria


La directiva DC (Define Constant) reserva un espacio en memoria asignndole 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 tamao t (t=B, W L)

(ahora CDE = d+t, siendo t el tamao del dato reservado)

Efecto: se reserva en memoria un dato de t bytes para una variable, y se le asigna un valor inicial.
Direcciones d (asociado a ETIQ si hay etiqueta) d+t Memoria ... val ... Espacio reservado: t octetos

La etiqueta es opcional, y si existe se inserta en la tabla de smbolos como un smbolo implcito (tipo LABEL).

15

Introduccin a la programacin en ensamblador del MC68000

MC68000: reserva de espacio en memoria


Para abreviar, con DC se pueden definir varias variables, todas ellas del mismo tamao, 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 tamao de cada dato)


Direcciones d (asociado a ETIQ si hay etiqueta) d+t (asociado a ETIQ+t si hay etiqueta) d+2*t (asociado a ETIQ+2*t si hay etiqueta) ... d+t*(N-1) (asociado a ETIQ+(N-1)*t si hay etiqueta) d+t*N Memoria ... val1 val2 val3 ... valN ... t octetos t octetos t octetos t octetos

16

Introduccin a la programacin en ensamblador del MC68000

MC68000: directiva de fin de traduccin


La directiva END indica al traductor que ha llegado el final del programa fuente, y que no debe seguir traduciendo. Lo que vaya detrs de una directiva END se ignora. Sintaxis: END [dir]

Efecto: la traduccin del programa finaliza. Cuando lleva un operando, esta directiva se usa para indicar la direccin de comienzo del programa principal (o la etiqueta de la primera instruccin que queremos ejecutar al iniciar el programa, si la tiene).

17

Introduccin a la programacin en ensamblador del MC68000

MC68000: directivas de alineamiento


En las mquinas con restricciones de alineamiento, la definicin de variables en posiciones indebidas puede dar lugar a errores de ejecucin de los programas. A veces los traductores realizan el alineamiento de los objetos correctamente a fin de evitar dichos errores de ejecucin. En el MC68000 se usa la directiva EVEN para alinear en una posicin par el objeto que se encuentra inmediatamente a continuacin de la directiva. Sintaxis: EVEN Efecto: si el CDE tiene valor impar, le suma 1; en caso contrario no tiene efecto ninguno.

18

Introduccin a la programacin 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 tamaos.
En general el tamao mnimo 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

Introduccin a la programacin en ensamblador del MC68000

MC68000 y las operaciones con bits


Una mscara de bits se puede entender como un dato binario (normalmente constante) que permite actuar selectivamente sobre ciertos bits de otro dato a travs de una operacin lgica (AND, OR, EOR). Convenientemente utilizadas, las mscaras de bits pueden emplearse para actuar sobre subconjuntos de bits (no necesariamente contiguos) de un operando. Poner bits a 0: AND mscara,dato Poner bits a 1: OR mscara,dato Invertir bits: EOR mscara,dato Si la mscara es constante, se almacena en un dato inmediato. Si la mscara es variable, debe almacenarse en un registro o variable de memoria. Las mscaras pueden escribirse en cualquier base de numeracin. Lo normal es usar base binaria o hexadecimal.
20

Introduccin a la programacin en ensamblador del MC68000

MC68000 y las operaciones con bits


AND mscara,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 dems

ANDI.B #%10010011,D2

OR mscara,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 dems

ORI.B #%00010110,D3

EOR mscara,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 dems

EORI.B #%11110000,D4
21

Introduccin a la programacin en ensamblador del MC68000

MC68000 y las operaciones con bits


Las mscaras pueden emplearse en datos de cualquier tamao:
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 mscaras pueden emplearse para realizar tareas tan complejas como se desee.

22

Introduccin a la programacin en ensamblador del MC68000

4. MC68000 y los tipos de datos simples


El MC68000 considera tres tipos de datos segn su tamao: .B, .W y .L. A nivel de mquina, el MC68000 considera que los datos que maneja son numricos, 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 especfico 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 definicin y manejo en el MC68000.

23

Introduccin a la programacin en ensamblador del MC68000

MC68000 y los tipos de datos simples


Equivalencia de tipos en TurboPascal, TurboC y MC68000 (mquina de 16 bits): Comentarios Entero sin signo 8 bits Entero sin signo 16 bits Entero sin signo 32 bits Entero con signo 8 bits Entero con signo 16 bits Entero con signo 32 bits Carcter Booleano Puntero Turbo Pascal BYTE WORD No existe SHORTINT INTEGER LONGINT CHAR BOOLEAN ^Tipo TurboC unsigned char unsigned int unsigned short unsigned long signed char int, short long char signed char unsigned char ? Tipo * X X X
24

.B X

.W

.L

X X X X X

No se han considerado datos en BCD ni en coma flotante

Introduccin a la programacin en ensamblador del MC68000

MC68000 y los tipos de datos simples


Las variables de los programas se ubicarn en memoria. Los registros de datos del MC68000 se utilizarn generalmente para almacenar resultados intermedios de clculos. Los registros de direcciones del MC68000 servirn como punteros temporales a variables o estructuras de datos residentes en memoria. El acceso a datos almacenados en memoria es notablemente ms lento que el acceso a datos ubicados en registros. Mantener variables en registros aumenta la velocidad de ejecucin y disminuye el tamao de las instrucciones, pero el MC68000 hay muy pocos registros.
Se puede complicar mucho la gestin de variables (los compiladores hacen mejor esta tarea que los programadores).

25

Introduccin a la programacin en ensamblador del MC68000

5. MC68000 y las variables simples


Analizaremos la definicin y el manejo de los tipos de datos simples del lenguaje PASCAL (en la implementacin de TurboPascal) trasladados al lenguaje ensamblador del MC68000. Se analizarn 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. Carcter de 8 bits: CHAR, char. Booleano de 1 bit: BOOLEAN. Puntero de 32 bits.

26

Introduccin a la programacin en ensamblador del MC68000

MC68000 y los enteros con signo


Turbo Pascal SHORTINT INTEGER LONGINT
AS BS CS DS ES AI BI CI DI EI AL BL CL DL EL DC.B DC.B DC.B DC.B DS.B DC.W DC.W DC.W DC.W DS.W DC.L DC.L DC.L DC.L DS.L -5 20 $80 $7F 1 -5 20 $8000 $7FFF 1 -5 20 $80000000 $7FFFFFFF 1

C signed char int, short long

.B X

.W X

.L

Comentarios Entero con signo Entero con signo

X
Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor Valor

Entero con signo

* Definicin de variables SHORTINT


inicial: -5 inicial: 20 inicial: 128 inicial: 127 inicial indeterminado inicial: -5 inicial: 20 inicial: 32768 inicial: 32767 inicial indeterminado inicial: -5 inicial: 20 inicial: 2147483648 inicial: 2147483647 inicial indeterminado

* Definicin de variables INTEGER

* Definicin de variables LONGINT

27

Introduccin a la programacin 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: instruccin MULS.


Operandos fuente: 16 bits (tipo INTEGER de TurboPascal) Resultado: 32 bits (tipos LONGINT en TurboPascal)

Divisin: instruccin 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).

Extensin de signo: EXT.


No se puede hacer extensin de signo de 8 a 32 bits directamente. EXT.W D0 Extensin de signo de 8 bits a 16 sobre D0 EXT.L D0 Extensin de signo de 16 bits a 32 sobre D0

Cambio de signo: instruccin NEG (un solo operando).

28

Introduccin a la programacin en ensamblador del MC68000

MC68000 y los enteros con signo


Condicin
Menor que

Nemotcnico
LT (less than) slt blt dblt sle ble dble seq beq dbeq sne bne dbne sge bge dbge sgt bgt dbgt st dbt sf dbf

Instrucciones
op etiqueta Dn,etiqueta op etiqueta Dn,etiqueta op etiqueta Dn,etiqueta op etiqueta Dn,etiqueta op etiqueta Dn,etiqueta op etiqueta Dn,etiqueta op Dn,etiqueta op Dn,etiqueta / dbra Dn,etiqueta

Menor o igual

LE (less or equal than)

Igual que

EQ (equal)

Distinto a

NE (not equal)

Mayor o igual que

GE (greater or equal than)

Mayor que

GT (greater than)

Cierto Falso

T (true) F (false)

29

Introduccin a la programacin en ensamblador del MC68000

MC68000 y las variables carcter


Turbo Pascal CHAR C char - signed char - unsigned char .B X Comentarios Carcter

Correspondencia caracteres - enteros: un carcter se corresponde con el ordinal que tiene asignado en su cdigo de representacin.
Ordinal en PASCAL: funcin ORD (devuelve un nmero en binario puro). Ordinal en C: nmero 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.

* Definicin 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 carcter A Asignado el carcter a Asignado el carcter con ordinal 154 Asignado el carcter con ordinal 154 Asignado el carcter con ordinal 20 Asignado el carcter D Sin valor inicial asignado

En ensamblador (como en C) los caracteres se pueden utilizar en operaciones aritmticas como nmeros enteros de 8 bits con o sin signo. 30

Introduccin a la programacin en ensamblador del MC68000

MC68000 y las variables booleanas


Tipo Booleano MIPS 1 bit Pascal BOOLEAN C ?

Para almacenar una variable booleana es suficiente con un bit, pero en el MC68000 las variables ocupan un mnimo de 8 bits. Se pueden definir las siguientes constantes:
TRUE FALSE EQU EQU 1 0

* Definicin 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

Introduccin a la programacin 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 numricas (igual que el lenguaje ensamblador). El lenguaje C s tiene operadores booleanos para realizar operaciones lgicas.
AND lgico bit a bit: & OR lgico bit a bit: | OR exclusivo bit a bit: ^ Negacin lgica bit a bit:! Comparaciones: =, !=, >, <, >=, <=

Evaluacin 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 ms bits distintos de 0 se considera que es cierto.

Esto concuerda con la instruccin Scond operando del MC68000:


Si cond es cierta, operando toma el valor $FF (tamao octeto, todos los bits a 1). Si cond es falsa, operando toma el valor $00 (tamao octeto, todos los bits a 0).

32

Introduccin a la programacin 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 caractersticas ni su rango vlido de valores. Fsicamente, un puntero es un valor numrico que no contiene un dato en s, sino la direccin de una variable que est ubicada en memoria. En lenguaje PASCAL el uso de los punteros est muy limitado.
Asignaciones Comparaciones de igualdad. Creacin o borrado dinmico de una variable apuntada por un puntero (S.O.).

En C los punteros se pueden usar en expresiones aritmticas como los enteros. En el MC68000 la nocin de puntero variable coincide con la de registro de direcciones.
Los registros de direcciones se pueden usar en operaciones aritmticas.

Los punteros pueden tener 16 bits o preferentemente 32 bits.


33

Introduccin a la programacin en ensamblador del MC68000

6. MC68000 y las expresiones aritmticas


Las expresiones aritmticas se pueden evaluar mediante el modelo de notacin polaca inversa con la ayuda de una pila.
En el MC68000 la pila de evaluacin se puede sustituir total o parcialmente por los registros de datos.

Expresin en PASCAL con variables enteras: Expresin en C con variables enteras: Evaluacin de la expresin 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) DIV (x-y); x=(x*y+z*z)/(x-y); x x*y z z*z x+y+z*z x-y valor en D7 valor almacenado en x

34

Introduccin a la programacin en ensamblador del MC68000

MC68000 y las expresiones aritmticas


Los compiladores de PASCAL generan cdigo para comprobar posibles desbordamientos en clculos o en ndices, no as los de C. Expresin en PASCAL con variables enteras:
x:=(x*y+z*z) DIV (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

Expresin en C con variables enteras:


x=(x*y+z*z)/(x-y);

x+y+z*z

x-y

valor en D7 valor almacenado en x 35

Introduccin a la programacin en ensamblador del MC68000

7. MC68000 y las expresiones booleanas


Al igual que las expresiones aritmticas, las expresiones booleanas se pueden evaluar mediante el modelo de notacin polaca inversa. Expresin 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. Expresin 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

Introduccin a la programacin 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 expresin 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)

FIN

MOVE.W CMP.W SGT BLE MOVE.B SNE NOT.B BNE TST.B SNE MOVE.B

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

Introduccin a la programacin 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 analizarn las siguientes sentencias de control: Seleccin IF - THEN. Seleccin IF - THEN - ELSE. Bucle REPEAT - UNTIL. Bucle WHILE - DO. Bucle FOR - TO. Bucle FOR - DOWNTO.

38

Introduccin a la programacin en ensamblador del MC68000

MC68000: sentencia IF - THEN


PASCAL (variables enteras): IF x >= y THEN BEGIN x := x+2; y := y-2; END; C (variables enteras): if (x >= y) { x = x+2; y = y-2; };
39

Ensamblador MC68000: IF EQU MOVE.W CMP.W BLT ADDQ.W SUBQ.W EQU * X,D7 Y,D7 FIN #2,X #2,Y *

COND?

FALSA

CIERTA

BLOQUE_THEN

FIN

Introduccin a la programacin 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;

THEN FIN

C (variables enteras):
BLOQUE_THEN

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

Introduccin a la programacin 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;

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 *

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);

Algoritmo del ejemplo: clculo del mximo comn divisor.

41

Introduccin a la programacin en ensamblador del MC68000

MC68000: sentencia WHILE - DO


PASCAL (variables enteras): Ensamblador MC68000:
n := 5; fant := 1; f := 1; i := 2; WHILE i <= n DO BEGIN faux := f; f := f + fant; fant := faux; i := i+1; END;

COND?

FALSA

WHILE

CIERTA

BLOQUE_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: clculo del trmino ensimo de la serie de Fibonacci.

42

Introduccin a la programacin en ensamblador del MC68000

MC68000: sentencia FOR - TO


En PASCAL estndar, el valor final del contador es indefinido, y adems el contador no debera ser modificado dentro del bucle (puede haber resultados inesperados!). El lmite final no cambia a lo largo de la ejecucin del bucle (aun cuando sea una variable y sta se modifique en el bucle). Ensamblador MC68000 PASCAL (variables enteras):
i:= valor inicial

(versin PASCAL):
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 #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 *

CIERTO

i > lmite final?

FALSO

i := i+1

n := 5; fant := 1; f := 1; FOR i := 2 TO n DO BEGIN faux := f; f := f + fant; fant := faux; END;

BLOQUE FOR

C (variables enteras):
n = 5; fant = 1; f = 1; for (i=2; i<=n; i++) { faux := f; f := f + fant; fant := faux; }

i <> lmite final? CIERTO FALSO

Introduccin a la programacin en ensamblador del MC68000

MC68000: sentencia FOR - DOWNTO


PASCAL (variables enteras):
i:= valor inicial

CIERTO

i < lmite final?

FALSO

i := i-1

n := 5; fant := 1; f := 1; FOR i := n DOWNTO 2 DO BEGIN faux := f; f := f + fant; fant := faux; END;

Ensamblador MC68000 (versin 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

BLOQUE FOR

C (variables enteras):
n = 5; fant = 1; f = 1; for (i=n; i<=2; i--) { faux = f; f = f + fant; fant = faux; }

i <> lmite final? CIERTO FALSO

Introduccin a la programacin 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 lmite 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 estndar, al terminar un FOR el valor del contador es indefinido.

Un bucle FOR es un bucle WHILE con una condicin dependiente de un contador que se incrementa o decrementa unitariamente, y con un lmite final prefijado al comienzo del bucle. Los bucles WHILE pueden dar problemas con condiciones del tipo <= o >= si el valor del lmite final coincide con un extremo del rango.
Qu sucede si se pide calcular el trmino 32767 de la serie de Fibonacci en el ejemplo? Ejercicio: proponer e implementar posibles soluciones (aumentar el tamao de la variable del contador, reestructurar el bucle, etc).

Sentencia CASE: Puede implementarse mediante estructuras IF-THEN-ELSE anidadas. Es ms eficiente (y complicado) implementarla mediante tablas de saltos.
45

Das könnte Ihnen auch gefallen