ASM 68k
ASM 68k
ASM 68k
****************************************************************************
I ) PRESENTACIN
I.1 ) Generalidades.
El MC68000 es un microprocesador de 32 bits con capacidad para direccionar 16Mb=2^24 bytes (bus de direcciones de 24 lneas), bus de datos de 16 bits, un juego de 72 instrucciones, catorce modos de direccionamiento y circuito de reloj interno a 4-25MHz entre otras caractersticas, fabricado por Motorola desde 1980, por ejemplo el calculador Ti-92 tiene un Motorola 68000 integrado. Lo primero, decir que el assembly es un lenguaje muy similar a la estructura de la mquina, lo segundo explicar que el alfabeto de microprocesador MC68000 se limita a los smbolos "0" y "1" que corresponden a los estados materiales: "electrones que no pasan" y "electrones que atraviesan las arterias del microprocesador". Las letras en este alfabeto son llamadas un BIT, 4 bits son un NIBBLE, 8 bits forman un BYTE (octeto en spanish ;-) ) , 16 bits son una WORD y 32 bits una DOUBLE WORD o LONGWORD. Estas 4 estructuras son las estructuras con las cuales trabajar (sucede que son con las que MC68000 trabaja). El "octeto ms bajo" de una palabra son los 8 bits derechos de la palabra (el octeto derecho), y el "octeto ms alto" de una palabra son los 8 bits izquierdos de la palabra. Igualmente para los longwords: se habla de palabra baja y la palabra superior... Por favor: nunca olvide: cmo se utilizarn los nmeros, estos son justamente una representacin de un serie de bits almacenados en la memoria del microprocesador (bajo forma de interruptores (micro swithed) encendidos o apagados). La computadora tan solo est funcionando con datos binarios (con estos pequeos bits se consiguen 2 estados: "bi" de bin). Pero estos datos no son suficientes, para construir un programa, necesita datos e instrucciones. Las instrucciones sern cifradas simplemente usando datos binarios: a cada instruccin escribimos (por ejemplo move.w xxx), correspondemos una instruccin que el procesador pueda entender (00011010101...). Una instruccin cifrada de este modo se llama un "opcode": se observa generalmente en cdigo hexadecimal ( vase I.3)... El trabajo del ensamblador es traducir nuestras instrucciones a su equivalente binario y es el trabajo del desensamblador invertir el proceso. Ejemplo: 4AFA ( en hexadecimal ) = 0100101011111010 ( en binary ) = ilegal ( para el programador ).
Aqu, se presenta un problema que seguramente ha notado: no hay manera para que el microprocesador haga una diferencia entre los datos y las instrucciones, y ms generalmente, entre la forma binaria de los datos. USTED como programador tiene que saber la diferencia entre los datos y las instrucciones. Si dice al procesador ejecutar algo, lo har. Y si hizo que l ejecutara unos ciertos datos en vez de un cierto cdigo verdadero, l nunca sabr... l terminar probablemente con una "interrupcin ilegal", reconociendo un opcode como no existente (vase system.txt I.3).
I.2 ) Binario
Si realmente program un poco, debe saber que todos los programas no son sino una traduccin de un algoritmo, un pseudo cdigo. Son pasos de un algoritmo (bastante detallados) representados por nmeros. Lo qu deseo decir es que todos sus datos no son sino nmeros y usted se ocupar de nmeros en assembly: una variable boleana por ejemplo es un bit. El uno o el cero. Haga cmo lo haga utilizamos nmeros: todo lo que conseguimos es 0 y 1? ? Hacindolo fcil: Puede recordar cuando aprendi a contar? Entonces bien, bsicamente, los nmeros estn representando objetos: 10 es una representacin del " I I I I I I I I I I ", diez unidades de alguna cosa. La diferencia entre la representacin a dos es que es de un alto nivel matemtico: utiliza una "base" para contar. Normalmente contamos en la base 10 mientras que el microprocesador cuenta en la base 2. Aqu est una manera simple de entender cmo pasar a partir de una base a otra. Ejemplo: cul es la diferencia entre 27, 270, 2700. Son multiplicados por 10 que es el nmero de letras que estamos utilizando (para los nmeros): pueden ser descompuestos en:27=2*10+7, 270=2*100+7*10+0, 2700=2*1000+7*100+0*10+0. Usaremos el mismo principio con 2 letras: nmero en potencias de 2: ejemplo: 1=1*2^0 2= 1*2^1+0*2^0 3= 1*2^1 +1*2^0 8= 1*2^3 +0 9= 1*2^3+0+0+1*2^0 intentaremos descomponer un
: 1 : 10 : 11 : 1000 : 1001
No ir ms profundo en el estudio de estos problemas de la conversin: uno debe intentar conseguir un buen programa para hacer estas conversiones rpidamente... Saber cmo es el funcionamiento es absolutamente suficiente. A lo peor usted que est leyendo esto puede decir: Piensa que somos torpes !! Todo lo que hizo es un cambio sencillo... S pero yo creo que si consigui un calculador que hace estas conversiones, es mucho ms rpido, que hacerlas siempre manualmente (mi Casio hace esto absolutamente
bien...), debe intentar trabajar en binario, con estos nmeros, pues estn en el corazn de la mquina. Sin embargo, por favor no pase demasiadas horas en esto: hay muchas otras cosas ms interesantes para aprender, y lo que sucede, si programa mucho en assembly, lo aprender poco a poco. De esa manera, en un byte (8 bits), es posible representar 2^8-1 nmeros donde $FF = %11111111 = 256 y $0 = %00000000 = 0.
Este mtodo (cambio de base) permite que represente nmeros enteros positivos. Los nmeros enteros negativos no pueden ser representados de esta manera.
Hay muchas maneras de representar nmeros positivos y negativos. Sin embargo, solamente tres mtodos sobrevivieron en la historia de la informtica. 1) El complemento a dos ( mire II.2 para porqu y cmo) para los nmeros enteros. 2) BCD nmeros enteros (esto ser incluida en lanzamientos ms ltimos). 3) Coma flotante para cdigo binario. usa BCD, mantisa, y exponente... (ms adelante quizs). Ahora que conoce como opera el microprocesador: entiende los dolores de cabeza de los primeros programadores que tuvieron que programar en binario: es dificilsimo... As pues, para representar el contenido de la memoria, el hexadecimal se utiliza extensamente.
I.3 ) Hexadecimal
El hexadecimal es justamente una representacin del estado de la memoria. Ahora tendr 16 letras: 0-9 y A-F: se ha elegido esto porque consigue de manera mucho ms fcil representar una palabra con esta notacin: a un grupo de 4 bits, se asocia una "letra", como 4 bits permiten los estados 2^4=16 as, se ve bien en la definicin del hexadecimal cmo es de simple... ejemplo: 1100 1010 1000 1101 es CA8D (pienso... :) ) esto es justo otro cambio de base!
I.4 ) El calculador
Su calculador esta construido en dos partes (en realidad cuatro con el teclado y la pantalla J):
*** la memoria: donde los datos se almacenan bajo una forma binaria. Los "datos" significan las instrucciones con sus parmetros que deben ser ejecutados por el procesador. Este mem es la RAM (128 KB en la mayora de los TI-92) y la ROM (1 Mb en la mayora de los TI-92).
*** El procesador, el corazn del calculador: 2 partes
a) a) Una parte pequea de la memoria localizada en el procesador donde los parmetros se almacenan cercanos a las instrucciones: los registros... agrupados formando un gran bloque o banco de registros. b) El procesador en s mismo, donde se ejecutan las instrucciones...
Los registros son algunos micro interruptores en los que se pueden fijar cualquier cosa que deseamos: los utilizamos para almacenar datos que deseamos procesar en estos registros puede poner all nmeros para operar o direcciones a los datos... Cualquier COSA!
Se han creado estos registros porque el tener acceso a la memoria es lento: si los datos estn muy cerca a donde estn siendo procesados, la velocidad se aumenta grandemente. Los registros son muy usados porque permiten una programacin muy flexible... Hay cinco clases de registros:
a) dataregisters: numerados de 0 a 7 ( estos son 8 ) : D0/D7 : 32 bits
D0
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
D1
3
9 8 7 6 5 4 3 2 1 0
D2
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
D3
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
D4
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
D5
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
D6
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
D7
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
A0
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
A1
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
A2
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
A3
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
A4
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
A5
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
A6
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
Estos estn para usted: puede almacenar en estos registros todos los datos que desea, puede almacenar en estos registros 32 datos de tipo bit
c) A7 : Stack register ( es fsicamente similar al A0/A6 pero se utiliza de una manera totalmente diferente vea III ) :32 bits, no es un registro de uso general: sino que tiene una aplicacin especial es el puntero de pila de usuario (USP) y su contenido va a poder ser modificado por ciertas instrucciones especializadas.
A7
3 1
3 0
2 9
2 8
2 7
2 6
2 5
2 4
2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
d) A7 : SSP ( tambin es fsicamente similar al A7) es el registro puntero de pila de supervisor al que se podr acceder nicamente cuando el procesador se encuentre en estado de supervisor.
A7
3 1 3 0 2 9 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 0
e) Status register (SR) (Registro del estado): 16 bits integrados por 2 octetos: el octeto ms bajo, el flag register (registro de bandera) se utiliza extensamente: sus bits se fijan dependiendo del resultado de algunas operaciones ejecutadas por el procesador.
SR
1 5
1 4
1 3
1 2
1 1
1 0
8 7 6 5 4 3 2 1 0
El flag register es: 0 0 0 X N Z V C. Las cinco banderas a la derecha se describen en la seccin de aritmtica.
El octeto superior (byte superior) o el octeto del sistema es un grupo de bites usados por el sistema: usted puede utilizarlo tambin pero requiere que sepa muy bien lo que est haciendo. El uso de estos bites y de excepciones se describe en el archivo de "system.txt".
f) PC : Program counter ( registro contador de programa) : 32 bits habilitados 24 bits
El contador de programa es un registro en el cual se almacena la direccin de la siguiente instruccin que se ejecutar: usted no puede modificar su contenido!
PC
X X X X X X X X 2 3
2 2
2 1
2 0
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
1 0
9 8 7 6 5 4 3 2 1 0
En el MC68K slo salen al exterior 24 terminales del bus de direcciones, esto significa que slo sean utilizables los 24 bits menos significativos, con lo que se podrn direccionar 2^24=16Mbytes, por lo tanto los 16MB tienen direcciones que van de la 00000000h a la 00FFFFFFh.
II.1 ) move
Es la accin ms importante que necesita hacer cuando programa y est manejando datos. Significa que necesita saber mover datos a o desde la memoria. La correspondiente instruccin es: "Move" ( es "mov" para la familia del procesador x86 ). ejemplo: "move D2,D4" se mover ( copiar ) el dato de D2 a D4.
Mas generalmente, en todas las instrucciones que utilizar, el primer parmetro es la fuente y el segundo el destino. Entonces, necesita precisar la forma de datos que utilizar: BYTE, WORD o LONGWORD: puede mover el octeto ms bajo, de una WORD en D2 o su contenido entero. Aqu esta cmo se hace esto: move.B move.W move.L D2,D4 D2,D4 D2,D4 ; byte ; word ; longword
Esta sintaxis se utiliza para todas las instrucciones, (la extensin x donde x=B, W, L es vlida para todas las instrucciones). Importante: al programar, nunca se olvide de precisar la longitud de los datos que utiliza: esto es CAPITAL! Incluso cuando es trivial, debe precisar el lenght... (no hice siempre esto mismo, por lo que no soy ningn ejemplo y tengo que pasar das para eliminar errores de tales errores). El move se puede utilizar para poner ciertos valores en algunos lugares: usted desea poner "1270" (en decimal) en el registro D4. por ejemplo: move.w #&1270,D4 "&" da soporte para decimal y el "#" da soporte para el valor inmediato: almacenar as el nmero 1270 (en decimal) o "10011110110" (en binario) en el registro D4. Si el nmero que consigui es tipo hex: move.w #$4F6,D4 "$" da soporte para hexadecimal. Si el nmero que consigui es tipo oct: move.w #@11,D4 "@" da soporte para octal. Si el nmero que consigui es tipo bin: move.w soporte para binario. #%00000001,D4 "%" da
An, si desea mover datos desde cierto lugar en la memoria (no en el procesador): usted sabe la direccin de los datos que necesita por ejemplo: $4F6. Escriba : move.w ($4F6),D4
El procesador tomar la palabra almacenada en la direccin 4F6 y la copiar a D4. Nota: al pasar a ver cdigo de otros programadores , notar un cierto uso de: move.w $4F6, D4: no escriben parntesis. Parntesis en ese lugar no se necesitan, pero no obstante le sugiero utilizarlos: le ayudarn a distinguir #$4f6 y ($4f6) para que sean dos datos totalmente diferentes. Uno es un indicador y el otro es justo un dato. Similarmente, si ha almacenado en adressregisters las direcciones de los datos que desea, puede escribir: "move.l (A0), D1" (parntesis son necesarios all), significa que es la direccin indirecta: los datos que copiaremos a D1 son los datos a las cuales A0 seala. Tambin, "move.w 32(A0), D1" copiar a D1.w los datos almacenaron en la direccin A0+#32. La adicin se hace en un poco de registro interno del procesador y no afecta al registro A0. Hasta aqu! Ha visto las operaciones principales que puede hacer con move.
Sin embargo, antes de confiarse, Pienso que debe intentar dar una mirada a la gua de Jimmy Mardel: l describe todas las maneras de usar el comando move: todas las maneras de direccionamiento de memoria. Esto no puede parecerse muy emocionante pero es necesario para saber lo que puede hacer con todas las instrucciones antes de intentar programar.
Este pedazo de cdigo har: D0+D1->D1 usted tiene 125 en D1 en el final de este cdigo. Pero por supuesto en binario ahora, para 100 - 25 , move.b #100,D0 move.b #25,D1 sub.b D1,D0 en este caso hace: D0 - D1 ->D0 pero imagine: move.b #100,D0 move.b #25,D1 sub.b D0,D1 entonces, habra - 75 en D1, un nmero negativo! Aqu se presenta el problema de reconocer nmeros negativos. Una convencin simple es utilizar el bit ms a la izquierda para indicar la muestra: si 0, positivo, si 1, negativo. Esto permite que usted cifre -127 por %11111111 y +127 por %01111111. Pero no crea que es as de simple: Nota: todas las operaciones sern hechas ahora en un byte pero ser exactamente igual en una palabra o en un longword. Por ejemplo deseamos agregar +4 y -1, debemos conseguir +3 4 %00000100
+ -1 %10000001 ____________________ +3 %10000101= - 5 Este no es el resultado correcto. As pues, utilizamos una manera levemente diferente de representar nmeros negativos: el complemento a dos. tenemos +4 : %00000100 deseamos -4: llevamos el complemento uno (por lo que invertimos todos los bits del nmero) y agregamos 1. conseguimos: + 11 -------------> estos son los bits de acarreo %11111011 %00000001 __________ %11111100 = (-4) : no se olvide llevan bits !
en otro ejemplo (+4) + (-1)= (+3) 111111 ----------> estos son los bits de acarreo (+4) %00000100 + (-1) %11111111 _________________ (+3) %00000011 Trabajando de esa manera. Algunos pudieron haber notado la importancia de la longitud de los datos usados. He elegido agregar nmeros en un octeto: el resultado es vlido solamente en un octeto. Porque en el extremo de este ejemplo, conseguimos %00000011 con un bit de llevar (ej: el uno a la izquierda). el resultado es +3 si tenamos decidido trabajar con nmeros con signo, y tenemos %0000000100000011 = 259 en una palabra si habamos decidido trabajar con enteros sin signo. En el procesador, todo sucede de la misma manera: calcula su adicin en los datos especificados y almacena el bit de llevar a otra parte (lo almacena en el bit de llevar del registro del estado: Si trabaja con enteros sin signo, debe comprobar el bit de llevar. Si no, su programa es probable que no trabaje. Una vez ms, las mismas reglas de ley: un registro es lo que USTED quisiera que fuera. No espere que el calculador lo sepa por usted. El procesador no tiene ninguna manera de saber que $$FF=%11111111 sea 256 o 1. All, usted puede ver el uso la "ext" opcode. Imagine que tiene un array en el cual todas las entradas sean los bytes y en el qu nmeros pueden ser tambin positivo como negativos... el primer nmero almacenado est -1: $$FF=%11111111 (es un octeto! ahora, deseamos agregar esto a un nmero que se almacene adentro de D0 pero este nmero es una palabra... si lo hicimos: clr.w move.b D1 (A0),D1 ;limpiar la palabra baja del registro D1
add.w
D1,D0
esto sera totalmente falso: no agregaramos -1 a D0 sino +255 a D0 (s: si fue despejado el registro D1, despus tenemos: $00FF en la palabra ms baja de D1). as, si agregamos D1 y D0, agregamos 255=$00FF a D0 y nosotros necesitamos agregar -1 en una palabra a D0: -1 es $$FFFF: ext.w transformar un nmero negativo en un octeto a un nmero negativo en una palabra, el pedazo correcto del cdigo es: clr.w D1 move.b (A0),D1 ext.w D1 ; transforms $00FF to $FFFF add.w D1,D0 Bsicamente, lo qu hace el opcode "ext" es que est copiando el bit pasado del octeto ms bajo para el octeto superior de D1. Ahora que sabe hacer las adiciones y las substracciones... multiplicaciones y divisiones? Qu sobre
Las instrucciones correspondientes son: mulu (unsigned), muls (con signo), divu (unsigned) y divs (con signo). Si trabaja con nmeros con signo, entonces utilice los muls y los divs. "muls.x D2,D4" multiplicar el ms bajo x de D2 y D4, y almacenar un resultado de 32 bit en D4. "divs.x D2,D4" calcular D4/D2 ( D4 es de 32 bits y D2 is 16 bits ) y almacenar el cociente en la palabra ms baja de D4 y el resto en la palabra superior de D4.
Se fija si el bit ms alto del resultado de la operacin aritmtica pasada se fija: de hecho, si est fijado, significa que el resultado era negativo si usted trabajaba con nmeros negativos. X es una copia de C. El no es afectado por todas las operaciones aritmticas.
El procesador 68000 no tiene ninguna estructura de instrucciones para dirigir la aritmtica de la coma flotante (ej: reals)! Para simular estos nmeros de coma flotante, hay dos soluciones: Escriba las rutinas del software que manejarn el clculo en flotante o utilizar los nmeros enteros (nmeros fijos). Las rutinas escritas para manejar nmeros de coma flotante son algo complejas y el cdigo generado es absolutamente lento. La solucin es utilizar aritmtica de punto fijo. (modo "fix" en el calculador) Si estamos en el modo "fix2", Pi=3.1416..... es representado por 3,14. El nmero se trunca despus del segundo digito despus de la coma, el nmero almacenado en memoria es 314. Todos los nmeros son multiplicados por 100. Cuando es hora de exhibirlos, considera el modo usado y agrega un coma. El problema principal con este mtodo es que tiene altos errores del clculo con una exactitud baja. Menos que 10^-2... Aqu, porque trabajamos en la base diez, la idea estaba al multiplicarle por 10^2. En assembly, la idea est igual pero multiplicamos nmeros por 2^10 por ejemplo Como 2^10=1024 ~ 1000. De manera que consigue ms o menos una precisin 10^-3 y que un clculo sea mucho ms simple con 2 potencias
II.5 ) miscelaneos
La instruccin move tiene algunas limitaciones: 1) Cuando usted mueve una palabra o un octeto en un registro de 32 bits, la palabra superior o el octeto superior no se afecta. Algunos programadores utilizan la instruccin ext para limpiar la palabra o el octeto superior: "ext.l D1"
despejar la palabra superior de D1, ext.w D1 de manera semejante limpiar el octeto superior de la palabra ms baja de D1. 2) Cuando se utiliza move para enviar o conseguir algo de la memoria, no puede tener acceso a las direcciones impares, al mover palabras o longwords. Dara lugar a un "error de los adress". 3) Nunca se olvide del parntesis cuando es necesario. 4) Las direcciones se dan a menudo en hexadecimal: es ms conveniente. Su unidad es el byte. ex: 128 KB estn en 2^17 = 131072 bytes (octetos) = $20000
ADD.L D0, A1
Al transferir con registro de direcciones debe utilizar word o longword. Cuando una palabra se transfiere a un registro de direccin, el bit 15 (el bit de signo) ser copiado a la palabra superior del conjunto (bit 16-31). Pues si no estuviera as, un nmero negativo llegara a ser positivo.
Si opera con una palabra o a un longword, la direccin en el registro de direccin debe ser un nmero par. Esto PUEDE CAUSAR PROBLEMAS GRANDES Y ERRORES DE UNEXCEPTED!!
A1=00001000 $1000=01234567
A1=00001004 $1000=01234567
El caso especial de A es cuando utiliza A7 y transfiere un octeto, porque A7 ser aumentado con 2 en vez de 1, porque A7, como puntero de pila, debe ser un nmero par.
En este caso la instruccin contiene dos elementos de la direccin, por un lado indica a un registro de direcciones que apunta a una posicin de memoria que no contiene el operando y, por otro lado, contiene un dato inmediato de 16 bits. A este dato inmediato se le denomina desplazamiento e indica la posicin relativa del operando con respecto a la direccin contenida en el registro.
Ejemplo de instruccin MOVE.L 4(A1),D0 Tambin MOVE.L (4,A1),D0 Antes D0=FFFFFFFF A1=00001000 $1004=01234567 Despus D0=01234567 A1=00001004 $1004=01234567
Ejemplo de instruccin
Antes
Despus
MOVE.L 4(A1,A2.L),D0
Debe tenerse muy clara la diferencia con el direccionamiento inmediato, en la instruccin anterior si se antepusiera el smbolo # al valor $10000, entonces se almacenara ese dato en D0 y no el contenido de una direccin de memoria
Las dos instrucciones que hacen esto son: lsl (cambio lgico izquierdo) y lsr (cambio lgico derecha). Sin embargo, el ejemplo anterior ocult un gran problema: qu tal si habamos tenido nmeros negativos? a partir del %11111111 = -1 cambiados de puesto a la derecha de uno, tenemos %01111111 = +127 en vez de -2... Esto puede arreglarse usando: asl (cambio aritmtico izquierdo) y asr (cambio aritmtico derecho) que hacen igual que lsl y lsr pero en nmeros con signo.
Nota: un uso posible de cambios es optimizar un cierto cdigo pues es una instruccin muy rpida.
( mire lesson_1.txt )
NOT 1 = 0 NOT 0 = 1
OR :
0 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 1 = 1 AND:
III.2.2 ) Usando AND La mejor manera de entender cmo pueden ser utilizadas estas instrucciones es mirar cul ser su resultado en algunos ejemplos.
76543210 ---------> nmero de bit 01010101 AND 01111000 ---------------01010000
a) Mscaras (Masks)
El resultado obvio de esta operacin es limpiar algunos bits. Aqu, los bits 0.1.2.7 son limpiados y los otros fueron respetados limpia y rpidamente. %01111000 se llama una mscara: permite que asle algunos bits en un octeto de modo que sea posible probarlos por separado sin usar bset.
b) Aritmtica
Otro uso de AND es calcular el resto o el cociente de una divisin por una potencia de dos. Aqu est un ejemplo con una divisin por 8=2^3. La ecuacin: (x and %00000111) + (x and %11111000) = x es verdad. Lo qu tiene es: %00000xxx + %xxxxx000 = %xxxxxxxx despus, xxxxx000 = 000xxxxx * 8. De hecho, la primera ecuacin se puede rescribir en: r + q * 8 = x, stos son la definicin de q = cociente y de r = resto. III.2.3 ) Usando OR
76543210 ---------> nmero de bit 01010101 OR 01110000 --------------01110101
El resultado es fijar a 1 los bits 4.5.6, mientras que deja el resto de los bits sin tocar. sta es otra manera de utilizar mscaras: , usted puede fijar (poner en 1) uno o ms de un bit a la vez sin incomodar sobre cambiar otros bits. III.2.4 ) Usando EOR Esta operacin lgica se utiliza para invertir solamente ciertos bits en un byte. Otra manera de utilizar mscaras.
Aqu, los bits 4.5.6 fueron invertidos y el resto de bits no fueron tocados... Observe tambin que EOR es utilizado en el procesador x86 familly para limpiar los registros pues x EOR x es siempre 0.
Motorola 68000 Instruction Set. ------------------------------Condition Codes --------------Instruction Description Z V C ------------------------------ABCD * U * ADD * * * ADDA - - ADDI * * * ADDQ * * * ADDX * * * AND * 0 0 ANDI * 0 0 ASL * * * Add BCD with extend ADD binary ADD binary to An ADD Immediate ADD 3-bit immediate ADD eXtended Bit-wise AND Bit-wise AND with Immediate Arithmetic Shift Left Assembler Syntax --------Dx,Dy -(Ax),-(Ay) Dn,<ea> <ea>,Dn <ea>,An #x,<ea> #<1-8>,<ea> Dy,Dx -(Ay),-(Ax) <ea>,Dn Dn,<ea> #<data>,<ea> #<1-8>,Dy Dx,Dy <ea> Data Size ---B-BWL -WL BWL BWL BWL BWL BWL BWL * U * * - * * * * * * - * - * * * X N
ASR * * * Bcc - - BCHG * - BCLR * - BSET * - BSR - - BTST * - CHK U U U CLR 1 0 0 CMP * * * CMPA * * * CMPI * * * CMPM * * * DBcc - - DIVS * * 0 DIVU * * 0 EOR * 0 0 EORI * 0 0 EXG - - EXT * 0 0 ILLEGAL - - JMP - - JSR - - LEA - - LINK - - LSL * 0 * LSR * 0 *
Arithmetic Shift Right Conditional Branch Test a Bit and CHanGe Test a Bit and CLeaR Test a Bit and SET Branch to SubRoutine Bit TeST CHecK Dn Against Bounds CLeaR CoMPare CoMPare Address CoMPare Immediate CoMPare Memory Looping Instruction DIVide Signed DIVide Unsigned Exclusive OR Exclusive OR Immediate Exchange any two registers Sign EXTend ILLEGAL-Instruction Exception JuMP to Affective Address Jump to SubRoutine Load Effective Address Allocate Stack Frame Logical Shift Left
... Bcc.S <label> Bcc.W <label> Dn,<ea> #<data>,<ea> ... ... BSR.S <label> BSR.W <label> Dn,<ea> #<data>,<ea> <ea>,Dn <ea> <ea>,Dn <ea>,An #<data>,<ea> (Ay)+,(Ax)+ DBcc Dn,<label> <ea>,Dn <ea>,Dn Dn,<ea> #<data>,<ea> Rx,Ry Dn ILLEGAL <ea> <ea> <ea>,An An,#<displacement> Dx,Dy #<1-8>,Dy <ea> ...
BWL BWB-L B-L B-L BWB-L -WBWL BWL -WL BWL BWL -W-W-WBWL BWL --L -WL
* * - - - - - - - * - 0 - * - * - * - * - - * - * - * - * - - * - - - -
--L
- - -
BWL
* *
BWL
* *
Between Effective Addresses To CCR To SR From SR USP to/from Address Register MOVE Address MOVE Multiple
- * I I I I - - - - -
<ea>,<register list> ---------- Page 2. CUT HERE. ---------MOVEP MOVE Peripheral Dn,x(An) - - x(An),Dn MOVEQ MOVE 8-bit immediate #<-128.+127>,Dn * 0 0 MULS MULtiply Signed <ea>,Dn * 0 0 MULU MULtiply Unsigned <ea>,Dn * 0 0 NBCD Negate BCD <ea> * U * NEG NEGate <ea> * * * NEGX NEGate with eXtend <ea> * * * NOP No OPeration NOP - - NOT Form one's complement <ea> * 0 0 OR Bit-wise OR <ea>,Dn * 0 0 Dn,<ea> ORI Bit-wise OR with Immediate #<data>,<ea> * 0 0 PEA Push Effective Address <ea> - - RESET RESET all external devices RESET - - ROL ROtate Left #<1-8>,Dy * 0 * Dx,Dy <ea> ROR ROtate Right ... * 0 * ROXL ROtate Left with eXtend ... * 0 * ROXR ROtate Right with eXtend ... * 0 * RTE ReTurn from Exception RTE I I I RTR ReTurn and Restore RTR I I I RTS ReTurn from Subroutine RTS - - -
- - * - * - * * U * * * * - -
- * - * - * - - -
BWL
- *
- * * * * * I I I I - -
SBCD * U * Scc - - STOP I I I SUB * * * SUBA - - SUBI * * * SUBQ * * * SUBX * * * SWAP * 0 0 TAS * 0 0 TRAP - - TRAPV - - TST * 0 0 UNLK - - -
Subtract BCD with eXtend Set to -1 if True, 0 if False Enable & wait for interrupts SUBtract binary SUBtract binary from An SUBtract Immediate SUBtract 3-bit immediate SUBtract eXtended SWAP words of Dn Test & Set MSB & Set N/Z-bits Execute TRAP Exception TRAPV Exception if V-bit Set TeST for negative or zero Deallocate Stack Frame
Dx,Dy -(Ax),-(Ay) <ea> #<data> Dn,<ea> <ea>,Dn <ea>,An #x,<ea> #<data>,<ea> Dy,Dx -(Ay),-(Ax) Dn <ea> #<vector> TRAPV <ea> An
B-B--
* U - I I
* * - * * * * * * - * - * - - -
BWL
- * - -
-------------------------Symbol -----* 0 1 U I <ea> <data> <label> <vector> <rg.lst> <displ.> ... Meaning ------Set according to result of operation Not affected Cleared Set Outcome (state after operation) undefined Set by immediate data Effective Address Operand Immediate data Assembler label TRAP instruction Exception vector (0-15) MOVEM instruction register specification list LINK instruction negative displacement Same as previous instruction
----------------------------------- Page 3. CUT HERE. ---------Addressing Modes Syntax --------------------Data Register Direct Address Register Direct Address Register Indirect Address Register Indirect with Post-Increment Dn An (An) (An)+
Address Register Indirect with Pre-Decrement Address Register Indirect with Displacement Address Register Indirect with Index Absolute Short Absolute Long Program Counter with Displacement Program Counter with Index Immediate Status Register Condition Code Register Legend -----Dn An b w l x Rx
Data Register (n is 0-7) Address Register (n is 0-7) 08-bit constant 16-bit constant 32-bit constant 8-, 16-, 32-bit constant Index Register Specification, one of: Dn.W Low 16 bits of Data Register Dn.L All 32 bits of Data Register An.W Low 16 bits of Address Register An.L All 32 bits of Address Register -------------------------Condition Codes for Bcc, DBcc and Scc Instructions. --------------------------------------------------Condition Codes set after CMP D0,D1 Instruction.
Relationship -----------D1 < D0 D1 <= D0 Equal D1 = D0 Set) D1 != D0 bit Clear) D1 > D0 D1 >= D0 or Equal Set) (Overflow) DBcc Only Scc Only -
Unsigned -------CS - Carry Bit Set LS - Lower or Same EQ - Equal (Z-bit Set) NE - Not Equal (Z-bit Clear) HI - HIgher than CC - Carry Bit Clear PL - PLus (N-bit Clear) VC - V-bit Clear (No Overflow) RA - BRanch Always
Signed -----LT - Less Than LE - Less than or EQ - Equal (Z-bit NE - Not Equal (ZGT - Greater Than GE - Greater than MI - Minus (N-bit VS - V-bit Set
F - Never Terminate (DBRA is an alternate to DBF) T - Always Terminate SF - Never Set ST - Always Set --------------------------
Parts from "Programming the 68000" by Steve Williams. (c) 1985 Sybex Inc. Parts from BYTE Magazine article.