Title | 68K notes - Instrucciones ensamblador - Motorola 68K |
---|---|
Course | Estructura de Computadores II |
Institution | Universitat de les Illes Balears |
Pages | 18 |
File Size | 552.7 KB |
File Type | |
Total Downloads | 82 |
Total Views | 144 |
Instrucciones ensamblador - Motorola 68K...
INTRODUCCIÓN A LA PROGRAMACIÓN EN ENSAMBLADOR (ENSAMBLADOR 68000)
Alberto Ortiz, Javier Antich, Manuel Barranco Estructura de Computadores 1 Grado en Ingeniería Informática Escola Politècnica Superior (UIB)
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
Introducción a la programación en ensamblador Un procesador ejecuta instrucciones de su conjunto de instrucciones, expresadas en lenguaje máquina (1101001101) Para evitar la especificación de programas en binario y facilitar la programación: - lenguajes de alto nivel: proveen niveles de abstracción que permiten especificar operaciones complejas, agregación de datos en forma de estructuras de datos, construcciones complejas para el control de la ejecución de las operaciones, etc. requieren un programa compilador para generar el lenguaje máquina - lenguaje ensamblador: nivel inmediatamente anterior al lenguaje máquina, sustituye combinaciones binarias por mnemónicos e introduce símbolos asociados a los elementos hardware del procesador accesibles para el programador requirere un programa ensamblador para generar el lenguaje máquina Procesador Motorola 68000 Procesador de los años 80, pero con un conjunto de instrucciones moderno y potente. Es el primero de una familia de procesadores empleados en múltiples microordenadores de los años 80 (Macintosh, Amiga, etc.)
Alberto Ortiz
2
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
El 68000 es un procesador de 16 bits en el sentido de que su bus de datos es de 16 bits, pero a nivel software es de 32 bits (registros y operaciones con 32 bits) 2 accesos a memoria por cada dato de 32 bits. Estructura de registros:
8 registros de datos (D0,…,D7) Para manipulación genérica de bytes, words y long words
8 registros de direcciones (A0, …, A7) Intervienen en un número inferior de instrucciones
El A7 actúa como puntero de pila (SP)
NOTA: La fase de fetch incrementa automáticamente el PC en 2 para que siempre apunte a la siguiente instrucción a ejecutar, incluso durante la ejecución de la instrucción actual
Alberto Ortiz
3
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
Catálogo de instrucciones 7 grupos: TRANSFERENCIA DE DATOS ARITMÉTICA ENTERA OPERACIONES LÓGICAS DESPLAZAMIENTOS Y ROTACIONES MANIPULACIÓN DE BITS CONTROL DE PROGRAMA OTRAS INSTRUCCIONES Todas las instrucciones siguen el mismo patrón:
- Indica la operación a realizar
- Operandos que intervienen - Se indican mediante modos de direccionamiento: * Directo registro (datos): D0, D1, … * Directo registro (direcciones): A0, A1, … * Absoluto: A, Z, M1, VECTOR, … * Inmediato: #4, #$ABC, #%1001, #@764
→ [operando está en registro] →[ “ ] → [operando está en memoria (variable)] → [operando es una constante]
Instrucción MOVE Establece el contenido del operando destino a partir de una constante o el contenido de un registro/posición de memoria: MOVE a,b
Ejemplo 1:
b [a] Lenguaje de transferencia de registros Habitual en descripciones de conjuntos de instrucciones !! * [x] = contenido de x * izda. flecha siempre dirección (nombre registro es su dirección) * dcha. flecha siempre valor
D3 Antes 3 Después 3
Alberto Ortiz
D4 [D3]
MOVE D3,D4 D4 ? 3
4
Estructura de Computadors 1 Ejemplo 2:
Escola Politècnica Superior (UIB) D0 [A]
MOVE A,D0 A Antes 20 Después 20
Ejemplo 3:
D0 ? 20
A es el nombre asignado a una posición de memoria, el ensamblador traducirá el nombre por la dirección de la posición.
D1 4
MOVE #4,D1
Variantes de MOVE:
MOVE = MOVE.W copia valores de 16 bits (words), mientras que MOVE.B y MOVE.L copia valores de 8 (bytes) y 32 bits (long words) respectivamente. En el conjunto de instrucciones del 68K prácticamente todas las instrucciones contemplan la posibilidad de operar con bytes, words y long words. Si no se especifica nada, la operación se realiza sobre words. Las operaciones a nivel de byte o word se realiza con los bits menos significativos, sin alterar los bits restantes: MOVE.L #$00000000,D0 MOVE.W #$FFFF,D0 MOVE.B #0,D0
D0 0000 00 00 0000 FF FF 0000 FF 00
MOVE no puede emplear todos los modos de direccionamiento en los dos operandos, hay que mirar la tabla de instrucciones. Hay versiones rápidas de MOVE para direcciones y constantes: MOVEA a, An
An [a]
MOVEQ #k, Dn
Dn k
k es una constante con signo de 8 bits no hay extensión de signo
Instrucciones ADD y SUB En general: ADD.S a, b
b [b] + [a]
SUB.S a, b
b [b] - [a]
S = B, W, L
Pero, en realidad, no todos los direccionamientos están disponibles para los dos operandos, lo que da lugar a diversas variantes, las mismas para ambas instrucciones: ADD.S Dm, b SUB.S Dm, b S = B, W, L b [b] + [Dm] b [b] - [Dm] ADD.S a, Dn SUB.S a, Dn S = B, W, L Dn [Dn] + [a] Dn [Dn] - [a] ADDA.S a, An SUBA.S a, An S = W, L An [An] + [a] An [An] - [a] ADDI.S #k, b SUBI.S #k, b S = B, W, L b [b] + k b [b] - k ADDQ.S #k, b SUBQ.S #k, b b [b] + k b [b] - k S = B, W, L, k {1,…,7}
Alberto Ortiz
5
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
NOTA: ADD.S #k, Dn es correcta pero restringe el destino a únicamente registros de datos; por esta razón existe ADDI.S #k, b. ADDQ es una version rápida de ADDI limitada a k < 8, útil para programar contadores con paso inferior a 8. PROGRAMA EJEMPLO 1 *----------------------------------------------------------* Program : Example 1 * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: C.W = A.W + B.W, D.W = A.W - B.W *----------------------------------------------------------ORG $1000 A B C D
DC.W DC.W DS.W DS.W
40 13 1 1
; labels without ‘:’ must always start in column 1 !!! ; labels with ‘:’ can start at any column !!!
START:
; first instruction of program MOVE.W A,D0 ADD.W B,D0 MOVE.W D0,C MOVE.W A,D0 SUB.W B,D0 MOVE.W D0,D MOVE.B TRAP
#9,D0 #15
; halt simulator, ALSO STOP #$2000
* Variables and Strings END
START
; last line of source
Instrucción CMP También hay diversas variantes, aunque menos que para ADD y SUB (no todos los direccionamientos están disponibles para los dos operandos): CMP.S a, Dn CMPA.S a, An CMPI.S #k, b
[Dn] - [a] [An] - [a] [b] - k
S = B, W, L S = W, L S = B, W, L
Esta instrucción tiene como único objetivo modificar los flags N, Z, C y V (no modifica X) a través de la resta que realiza, lo cual permite implementar comparaciones sin necesidad de incluir un comparador en la ALU. N=1 Z=1 C=1 V=1 X=1
Alberto Ortiz
si última operación ALU < 0 si última operación ALU = 0 Cout de última operación ALU si última operación ALU provocó desbordamiento igual que C, pero le afectan menos instrucciones (está pensado para implementar suma y resta de más de 32 bits)
Ojo!! CMP no modifica este flag
6
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
Instrucción BEQ Provoca un salto en el programa si Z = 1: BEQ etiqueta
SI Z = 1 ENTONCES PC dirección de memoria correspondiente a ‘etiqueta’ en el programa ( la siguiente instrucción a ejecutar es la indicada por ‘etiqueta’) SI Z = 0 ENTONCES se ejecuta la siguiente instrucción del programa
PROGRAMA EJEMPLO 2 *----------------------------------------------------------* Program : Example 2 * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: set C.W to 0 if A.W = B.W, and to 1 otherwise *----------------------------------------------------------ORG $1000 A B C
DC.W DC.W DS.W
40 13 1
START:
; first instruction of program MOVE.W A,D0 CMP.W B,D0 BEQ ET0 MOVE.W #1,C MOVE.B TRAP
ET0:
#9,D0 #15
; halt simulator
MOVE.W #0,C MOVE.B TRAP
#9,D0 #15
; halt simulator
END
START
; last line of source
Tras ensamblarlo, obtenemos el siguiente fichero (extensión .L68): 00001006 Starting Address Assembler used: EASy68K Editor/Assembler v5.9.0 Created On: 10/02/2012 8:44:01 00000000 00000000 00000000 00000000 00000000 00000000 00001000 00001000 00001000= 0028 00001002= 000D 00001004
Alberto Ortiz
1 2 3 4 5 6 7 8 9 10 11
*---------------------------------------------* Program : Example 2 * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: set C.W to 1 if A.W = B.W, and t *---------------------------------------------ORG $1000 A B C
DC.W DC.W DS.W
40 13 1
7
Estructura de Computadors 1 00001006 00001006 00001006 0000100A 0000100E 00001012 00001018 00001018 0000101C 0000101E 0000101E 00001024 00001024 00001028 0000102A 0000102A 0000102A
3038 B078 6700 31FC
Escola Politècnica Superior (UIB) 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30
1000 1002 000E 0001 1004
103C 0009 4E4F 31FC 0000 1004 103C 0009 4E4F
START:
; first instruc MOVE.W A,D0 CMP.W B,D0 BEQ ET0 MOVE.W #1,C MOVE.B TRAP
ET0:
#9,D0 #15
; halt simulato
MOVE.W #0,C MOVE.B TRAP
#9,D0 #15
; halt simulato
* Variables and Strings END START
; last line of
No errors detected No warnings generated SYMBOL TABLE INFORMATION Symbol-name Value ------------------------A 1000 B 1002 C 1004 ET0 101E START 1006
O de otra manera: A: B: C: START:
ET0:
Alberto Ortiz
dirección 1000 1002 1004
contenido 0028 000D ????
1006 1008
3038 1000
MOVE.W
100A 100C
B078 1002
CMP.W
100E 1010
6700 000E
BEQ ET0
--------------!
1012 1014 1016
31FC 0001 1004
MOVE.W
B tras CMP B, A A B tras CMP B, A
Expresión lógica basada en flags C+Z=0 C+Z=1 C=0 C=1 C=0 C=1 Z=0 Z=1 V=0 V=1 N =0 N=1 NV=0 NV=1 Z+NV=0 Z+NV=1
Instrucción BRA Provoca un salto incondicional: BRA etiqueta
Alberto Ortiz
PC dirección de memoria correspondiente a ‘etiqueta’ en el programa
9
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
PROGRAMA EJEMPLO 3 *----------------------------------------------------------* Program : Example 3 * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: set C.W to 0 if A.W = B.W, and to 1 otherwise *-----------------------------------------------------------
A B C
ORG
$1000
DC.W DC.W DS.W
40 13 1
START:
; first instruction of program MOVE.W A,D0 CMP.W B,D0 BEQ ET0 MOVE.W #1,C BRA FINISH
ET0:
MOVE.W #0,C
FINISH: MOVE.B TRAP END
#9,D0 #15
; halt simulator
START
; last line of source
Instrucción JMP También provoca un salto incondicional: JMP etiqueta
PC dirección de memoria correspondiente a ‘etiqueta’ en el programa
Diferencias entre JMP y BRA 1) BRA no permite saltar a cualquier posición de la memoria, al contrario que JMP. De hecho BRA implementa un salto relativo al PC: BRA.S d
PC [PC] + d d [-128 .. 127] (desplazamiento con signo de 8 bits)
BRA.L d
PC [PC] + d d [-32768 .. 32767] (desplazamiento con signo de 16 bits)
Cualquier otra instrucción Bxx opera de la misma manera. Por ello, se denominan instrucciones de salto corto, frente a JMP que sería una instrucción de salto largo. 2) Bxx tiene como parámetro un desplazamiento constante, mientras que JMP admite expresar la dirección de salto tanto mediante un direccionamiento absoluto como mediante otros direccionamientos que veremos a continuación (no todos los direccionamientos son aplicables, ver tabla de instrucciones). En Alberto Ortiz
10
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
este segundo caso, la dirección de salto puede variar cada vez que se ejecuta la instrucción JMP, ya que los mencionados direccionamientos hacen referencia al contenido de posiciones de memoria. PROGRAMA EJEMPLO 4 *-------------------------------------------------------------* Program : Example 4 * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: Calculate the sum of the N first natural numbers *--------------------------------------------------------------
N SUM
ORG
$1000
EQU DS.L
5 1
START:
; assume N fits in a word ; assume SUM fits in a long word ; first instruction of program
CLR.L D0 CLR.L SUM LOOP: ADD.L D0,SUM ADDQ.W #1,D0 CMP.W #N,D0 BLS LOOP MOVE.B TRAP
#9,D0 #15
; halt simulator
END
START
; last line of source
Instrucción DBRA Facilita la implementación de bucles cuando el número de iteraciones es conocido: DBRA Dn, etiqueta
Dn [Dn] – 1 SI [Dn] -1 ENTONCES PC [PC] + d d [-32768 .. 32767] (desplazamiento con signo de 16 bits)
PROGRAMA EJEMPLO 5A *-------------------------------------------------------------* Program : Example 5A * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: Calculate the sum of the N first natural numbers *--------------------------------------------------------------
N SUM
ORG
$1000
EQU DS.L
5 1
START:
; assume N fits in a word ; assume SUM fits in a long word ; first instruction of program
MOVE.L #N,D0 CLR.L SUM
Alberto Ortiz
11
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
LOOP: ADD.L D0,SUM DBRA D0,LOOP MOVE.B TRAP
#9,D0 #15
; halt simulator
END
START
; last line of source
Hay una variante de DBRA que permite salir del bucle y decrementar el registro de forma selectiva: DBcc Dn, etiqueta
SI no(c) ENTONCES Dn [Dn] – 1 SI [Dn] -1 ENTONCES PC [PC] + d d [-32768 .. 32767] (desplazamiento con signo de 16 bits)
Se implementan las mismas condiciones que en el caso de Bcc, por lo que se dispone de las instrucciones DBHI, DBLS, DBCC, DBCS, DBNE, DBEQ, DBVC, DBVS, DBPL, DBMI, DBGE, DBLT, DBGT y DBLE. Por ejemplo, el siguiente código sólo completa 3 iteraciones de las 4: PROGRAMA EJEMPLO 5B *----------------------------------------------------------* Program : Example 5B * Written by : A. Ortiz (UIB) * Date : 10/02/2012 * Description: Calculate P = A*B, except if A*B > MX *----------------------------------------------------------ORG $1000 MX A B P
EQU DC.W DC.W DS.W
10 4 4 1
START:
; first instruction of program MOVE.W B,D0 SUBQ.W #1,D0 MOVE.W A,D1 CLR.W P
LOOP: ADD.W D1,P CMP.W #MX,P DBHI D0,LOOP MOVE.B TRAP
#9,D0 #15
; halt simulator
END
START
; last line of source
Otros modos de direccionamiento El procesador 68000 dispone de un total de 12 modos de direccionamiento, entre los que se encuentran los 5 ya descritos directo registro (datos y direcciones), absoluto (largo y corto), e inmediato. Veamos un
Alberto Ortiz
12
Estructura de Computadors 1
Escola Politècnica Superior (UIB)
ejemplo que demuestra que los anteriores direccionamientos no permiten resolver ciertos casos de manera eficiente: PROGRAMA EJEMPLO 6: Poner a 0 el bloque de memoria comprendido entre $1000 y $10FF (256 bytes). Solución A. Repetir una instrucción MOVE.B tantas veces como sea necesario.
V
ORG
$1000
DS.B
256
V
START:
ORG
$1000
DS.B
256
START: MOVE.B #0,$1000 MOVE.B #0,$1001 MOVE.B #0,$1002
MOVEA.L #$1000,A0 LOOP: MOVE.B #0,(A0) ADDA.L #1,A0 CMPA.L #$1100,A0 BNE LOOP
... MOVE.B #0,$10FE MOVE.B #0,$10FF
(I)
Solución B. Evitar la repetición de la instrucción MOVE.B implementando un bucle que itera sobre la dirección, a base de utilizar direccionamiento registro indirecto.
MOVE.B TRAP
#9,D0 #15
END
START
MOVE.B TRAP
#9,D0 #15
END
START
MODO INDIRECTO REGISTRO (de direcciones) (An)
Acceso a memoria: Dirección efectiva (EA) = [An] Operando = [[An]]
Ejemplo: MOVE (A0),D1
A0 0432 hex =========>
(II)
3F31
0432h
=======>
3F31
D1
MODO (indirecto registro) POSTINCREMENTO (para procesar posiciones contiguas de memoria) (An)+
Alberto Ortiz
(1) Acceso a memoria Dirección efectiva (EA) = [An] 13
Estructura de Computadors 1
Escola Politècnica Superior (UIB) Operando = [[An]] (2) Actualización de An An An + B B = 1, 2 ó 4 según ”tamaño” de la operación
(III)
MODO (indirecto registro) PREDECREMENTO (para procesar posiciones contiguas de memoria) -(An)
(1) Actualización de An An An - B B = 1, 2 ó 4 según ”tamaño” de la operación (2) Acceso a memoria Dirección efectiva (EA) = [An] Operando = [[An]]
PROGRAMA EJEMPLO 6.C: *----------------------------------------------------------* Program : Example 6C * Written by : A. Ortiz * Date : 10/02/2012 * Description: Clear a memory block *-----------------------------------------------------------
V
ORG
$1000
DS.B
256
START:
; first instruction of program MOVEA.L #$1000,A0
LOOP: MOVE.B #0,(A0)+ CMPA.L #$1100,A0 BNE LOOP MOVE.B TRAP END
(IV)
#9,D0 #15 START
; halt simulator ; last line of source
MODO INDEXADO BÁSICO (para procesar posiciones contiguas de memoria, p.e. vectores) X(An)
Acceso a memoria: Dirección efectiva (EA) = [An] + X Operando = [[An] + X] X constante con signo de 16 bits 31
15
7
0
An X + EA
Alberto Ortiz
14
Estructura de Computadors 1 (V)
Escola Politècnica Superior (UIB)
MODO INDEXADO COMPLETO (para procesar posiciones contiguas de memoria, p.e. vectores) X(An, Rk.S)
31
Acceso a memoria: Dirección efectiva (EA) = [An] + [Rk] + X Operando = [[An] + [Rk] + X] X constante con signo de 8 bits S W o L para restringir los bits de Rk (=Dk o Ak) utilizados para indexar (W por defecto) 15
7
0
An Rk.W X + EA
31
15
7
0
An Rk.L X + EA
Ejemplo: D0 LIST START:
ORG DC.W
$1000 4, 5, 6, 7
MOVEA.L MOVE.W ADDQ.L MOVE.W
#0,A0 LIS...