Pregunta 1

Anuncio
ESCUELA TÉCNICA SUPERIOR DE INGENIEROS
DE TELECOMUNICACIÓN
Sistemas Electrónicos Digitales
Convocatoria ESPECIAL. Diciembre 2006
DATOS PERSONALES
Apellidos
SOLUCIÓN
Nombre
Firma
D.N.I.
CALIFICACIONES
Pregunta 1
1.5
Pregunta 5
1.5
Pregunta 2
1.5
Pregunta 6
Pregunta 3
2.5
Pregunta 7
Pregunta 4
1.0
Revisado
2.0
Calificación final
Las Palmas de Gran Canaria a 16 de diciembre de 2006
Convocatoria Especial
Sistemas Electrónicos Digitales
Diciembre 2006
Pregunta 1 (1.5 Pto.)
1. 0.2 El salto se produce si los bits 7 y 0 están a “1” lógico.
2. 0.2 Se codifica con 4 bytes. Los bytes son: $5F $23 $81 $FC.
3. 0.2 La optimización se consigue con una única instrucción de comparación y salto. En
nuestro caso sería: BRCLR DATO $40 *.
4. 0.2 El valor del registro sería $00.
5. 0.2 Se mantiene activo hasta que se vuelva a escribir sobre el PORTCL.
6. 0.2 El contenido del vector de reset sería $E000.
7. 0.2 El contenido del acumulador será $11. Al negar el contenido de A el resultado es
$09 y al sumar 2 se queda en $0B. Como se ajusta decimalmente, el resultado final es
$11.
8. 0.1 La sustitución quedaría de la siguiente manera:
ADDB
#1
ADCA
#0
Pregunta 2 (1.5 Ptos.)
Para la resolución suponemos que los índices m y n empiezan a numerarse por 0. El
código de la rutina es:
Etiqueta
Nemónico , Operando
Comentario
ORG
$100
BRA
INICIO
TABLA
RMB
LONG
M
EQU
X
N
EQU
Y
INICIO
LDS
#$1FF
LDX
#$1000
* 0.3 Paso de parámetros
LDY
#TABLA
PSHY
LDAA
#M
PSHA
LDAA
#N
PSHA
BSR
EXCT
* 0.2 Eliminación de los parámetros introducidos en la pila
PULA
PULA
PULY
……
* 1.0 Código de la rutina
EXCTST
PSHA
TPA
PSHA
PSHB
PSHX
PSHY
TSY
LDAB
LDAA
LDX
LDY
ASLA
ASLB
ABY
TAB
ABX
LDD
$09,Y
$0A,Y
$0C,Y
$0C,Y
; Transferimos SP a Y
; Recuperamos N en B
; Recuperamos M sobre A
; Recuperamos dirección de comienzo de la TABLA en X
; Recuperamos dirección de comienzo de la TABLA en Y
; Al ser elementos de 16 bits calculamos la dirección x2
; Y apuntando al elemento N
$00,X
; X apuntando al elemento M
; D contiene elemento M
1
Solución
Convocatoria Especial
PSHA
PSHB
LDD
STD
PULB
PULA
STD
PULY
PULX
PULB
PULA
TAP
PULA
RTS
Sistemas Electrónicos Digitales
Diciembre 2006
; Lo guardamos temporalmente en la pila
$00,Y
$00,X
; D contiene elemento N
; Salvamos N en la tabla
; Recuperamos M
$00,Y
; y lo salvamos en la tabla
Pregunta 3 (2.5 Ptos.)
1. El programa quedaría de la siguiente manera:
Etiqueta
Nemónico , Operando
Comentario
ORG
$FFFE
; Vector de Reset
FDB
$D000
ORG
$FFF2
; Vector de STRA
FDB
RSISTRA
CONT
ORG
RMB
$0000
2
ORG
LDS
LDX
BSET
BSR
LDD
STD
LDAA
STAA
CLI
BRA
$D000
#$1FF
#$1000
OPTION,X $80
DEL1MS
#1000
CONT
#$42
PIOC,X
; Zona de datos en memoria RAM
; Contador de interrupciones
; Activamos el conversor A/D
; Inicializamos a 1000 el contador de interrupciones
; Programamos STRA por interrupciones y flanco de subida
*
* Rutina de interrupción para STRA
RSISTRA
LDY
CONT
DEY
BNE
RSIOUT
L1SEG
LDY
#1000
LDAA
#$07
STAA
ADCTL,X
BRCLR
ADCTL,X $80 *
LDAA
ADR1,X
LDAB
#8
MUL
PSHX
LDX
#255
IDIV
XGDX
PULX
CLR
PORTB,X
L1LOOP
TSTB
BEQ
RSIOUT
ASL
PORTB,X
BSET
PORTB,X $01
DECB
; Decrementamos contador
; Inicializamos el contador
; Programamos el conversor A/D para convertir el pin 7
; Esperamos fin de conversión
; Leemos el valor convertido
; Calculamos el número de leds a encender
; El número de leds a encender está en registro B
; Borramos leds en puerto B
; Comprobamos si número de leds es cero
; Si es cero salimos
; Desplazamos el contenido del puerto B
; y encendemos el bit menos significativo
; Decrementamos contador de leds
2
Solución
Convocatoria Especial
RSIOUT
BRA
STY
LDAA
LDAA
RTI
* Rutina de retardo de 1ms
DEL1MS
LDY
L0
DEY
BNE
RTS
Sistemas Electrónicos Digitales
L1LOOP
CONT
PIOC,X
PORTCL,X
Diciembre 2006
; y seguimos en el bucle
; Actualizamos valor del contador
; Iniciamos secuencia de borrado del flag
286
L0
Pregunta 4 (1.0 Pto.)
1. 0.2 Un posible código sería:
PEA
NEXT(PC)
JMP
L1
NEXT
EQU
*
2. 0.2
ORG
$1000
DATO
DC.B
$2A
LONG
EQU
35
LEA
DATO,A0
MOVE.W
#DATO(PC),A0
MOVE.L
#DATO(PC),A0
LEA
LONG,A0
LEA
#LONG,A0
MOVE.B
DATO+LONG,A0
byte
; Guardamos dirección de retorno en la pila
; Actualizamos valor del contador
; Válida. El dato cargado en A0 es $1000
; No válida. Dato no puede ser un valor inmediato.
; No válida. Dato no puede ser un valor inmediato.
; Válida. Carga el valor 35 en A0
; No válida. La fuente no puede ser dato inmediato
; No válida. A un registro de direcciones no se puede mover un
3. 0.2 IFEQ \2-0. Esta directiva de ensamblado condicional, ensambla el código que le
sigue siempre y cuando no haya segundo parámetro real en la llamada.
4. 0.2 El puntero de pila apunta a una posición ocupada/escrita ya que para salvar un
dato en la pila, operación PUSH, se debe usar el modo indirecto con predecremento.
5. 0.2. La instrucción DBcc tiene el formato: DBcc Dn, etiqueta. Por tanto necesita una
palabra de operación (OW) codificando el Dn (3 bits), y la condición (4 bits), siendo los
restantes bits para el código de operación. Además incluye una palabra de extensión
para codificar el desplazamiento en 16 bits.
Pregunta 4 (1.5 Ptos.)
1. 1.2 El código de la macro es el que se adjunta. Para una mejor comprensión se adjunta
a continuación el formato de la llamada a la macro:
ARITHM
TABLA, LONG, Dn
Etiqueta
Nemónico , Operando
Comentario
ARITHM
MACRO
BRA
INIM\@
DATO\@
DS.B
1
INIM\@
MOVEM.L
D0-D2/A0,-(A7)
LEA
\1,A0
; Ponemos en A0 dirección de comienzo de la tabla
MOVE
\2,D0
; Ponemos en D0 longitud de la tabla
SUBQ
#1,D0
; Restamos una unidad para poder usar DBcc
CLR
D1
; Matendremos la suma parcial en D1
LOOP\@
MOVE.B
(A0)+,D2
; Recuperamos elemento en D2
EXT.W
D2
; Lo pasamos a tamaño palabra
ADD.W
D2,D1
DBF
D0,LOOP\@
; Decrementamos longitud y continuamos
MOVE
\2,D0
; Ponemos en D0 longitud de la tabla
DIVS
D0,D1
; Dividimos la suma por la longitud de la tabla
MOVE.B
D1,DATO\@
; Salvamos la media en memoria
MOVEM.L
(A7)+,D0-D2/A0
3
Solución
Convocatoria Especial
Sistemas Electrónicos Digitales
Diciembre 2006
MOVE.B
DATO\@,\3
ENDM
2. 0.3 Se denominan rutinas abiertas ya que no se retorna al punto de llamada. Se
invocan incluyendo el código durante la fase de ensamblado y no durante la ejecución.
Pregunta 5 (2.5 Ptos.)
El código es el siguiente:
Etiqueta
Nemónico , Operando
PSZONE
EQU
20
PSPOS
EQU
16
PSSTAT
EQU
12
PSLONG
EQU
8
VSNUM
EQU
-2
LOCPROG
EQU
-2
POS
STAT
ZONE
LONG
INICIO
* Subrutina RX
RX
LOOP
OUTRTS
ORG
JMP
DS.B
DS.B
DS.B
DS.W
MOVE.L
PEA
PEA
PEA
PEA
JSR
ADD.L
……..
$2000
INICIO
1
1
300
1
#$3000,A7
ZONE
POS
STAT
LONG
RX
#16,A7
LINK
MOVEM.L
MOVE.L
MOVE.L
MOVE.L
CLR
TST.B
BEQ
CMP.B
BEQ
MOVE.B
ADDQ
BRA
MOVE
MOVEM.L
UNLK
RTS
END
A6,#LOCPROG
A0-A3,-(A7)
PSZONE(A6),A0
PSPOS(A6),A1
PSSTAT(A6),A2
VSNUM(A6)
(A2)
LOOP
#$0D,(A1)
OUTRTS
(A1),(A0)+
VSNUM(A6)
LOOP
VSNUM(A6),(A3)
(A7)+,A0-A2
A6
Comentario
; Direccionada por A0
; Direccionada por A1
; Direccionada por A2
; Direccionada por A3
; Inicializamos Stack Pointer
; Depositamos dirección de ZONE, POS y STAT en la pila
; Depositamos la longitud en la pila
; Eliminamos de la pila los parámetros
; Creamos marco de la rutina
; Guardamos el contexto
; Recuperamos dirección de ZONE en A0
; Recuperamos dirección de POS en A1
; Recuperamos dirección de STAT en A2
; Borramos contador
; Comprobamos si hay dato
; Si no hay seguimos comprobando
; Comprobamos si el dato es ENTER
; Si es igual salimos
; En caso contrario depositamos el dato en ZONE
; e incrementamos el contador
; Seguimos en el bucle
; Actualizamos la longitud
; Recuperamos el contexto
4
Solución
Descargar