|
Bienvenido a mis Tutorías
©
en la UNED
Ejemplos de utilización Motorola 68000 |
|
![]() |
Ejemplo 1:
abello
Examen de la primera semana de la convocatoria de febrero, curso 1999/2000
15-Dado el siguiente fragmento de programa decir el valor del registro D2
al final del mismo
ORG 2500
INI EQU $F5F
MOVE.L #$000F0481,D2
ADD.L ET,D2
AND.W #INI,D2
ET DC.L $42
END
a --> $0000F443
b --> $000F04CF
c --> $0000F4C3
d --> $000F0443
Quizás lo primero que tendríamoss que hacer sería probar el código
con el simulador del Motorola 68000 que viene en el cdrom de la
carrera. Yo siempre empiezo por ahí
En este caso concreto, lo resumo, lo que hace el código es:
$000F0481 + $42 = $000F04C3
$000F04C3 AND $F5F = $000F0443
Es decir, la solución buena es la D.
Ejemplo 2: abello
Examen de la primera semana de la convocatoria de febrero, curso 1999/2000
16-Contenido en memoria de ST despues de el fragmento sería:
ORG 2500
TAB DS.L $12
LIB EQU *+2048
CAN DC.W 256+LIB
ST DC.W $400+CAN
END
Digo lo mismo que antes, aunque en este caso ni siquiera hace falta
correr el programa, ya que la etiqueta ST toma el calor durante la
compilación. Sólo es necesario entonces escribir el código y correr el
asm68k.exe con la opción -lx para estudir con cuidado el listado que
genera para este trozo de código.
El "truco" de este ejercicio está en la utilización de números decimales
y hexadecimales y hay que tener cuidado al manipularlos.
El contenido del fichero .LST es el siguiente
> MC68000 Cross Assembler
> Copyright (C) Stephen Croll, 1991. Author: Stephen Croll
> Version 2.00 beta 1.02
>
> 000009C4 1 ORG 2500
> 000009C4 2 TAB DS.L $12
> 0000120C 3 LIB EQU *+2048
> 00000A0C 130C 4 CAN DC.W 256+LIB
> 00000A0E 0E0C 5 ST DC.W $400+CAN
> 00000A10 6 END
>
> No errors detected.
>
> Symbol Value Type Line References
>
> CAN 00000A0C Rel 4 5
> LIB 0000120C Rel 3 4
> ST 00000A0E Rel 5 *** UNREFERENCED ***
> TAB 000009C4 Rel 2 *** UNREFERENCED ***
Es decir, la solución correcta es 0E0C. ¿Por qué? Veamos como funciona
El código empieza en 2500 (dec) = $09C4
Luego se reservan $12(hex) = 18(dec) datos largos: 18*4=72 bytes = $48
El valor del * corresponde a la dirección actual de ensamblado: $09C4+$48=$0A0C
Por lo tanto, el valor de la etiqueta LIB será: $0A0C+$0800=$120C
El valor almacenado en la dirección CAN, ya no es una etiqueta como LIB,
es: $120C+$0100=$130C
El valor almacenado en la dirección ST, que tampoco es una etiqueta, depende
de la dirección de CAN y no de su contenido, por lo que todo lo que
hemos hecho hasta ahora apenas sirve de nada.
ST = $400+CAN = $400+$0A0C = $0E0C
que es el resultado que buscamos.
Ejemplo 3: abello
Una vez ensamblado el siguiente segmento de código en
ensamblador M68000, donde @,% y $ representan octal,
binario y hexadecimal respectivamente, el contenido de
la dirección de memoria apuntada por DATO3 es:
ORG @100
DATO1 EQU *+%1010
ZONA1 DS.B $BB
EVEN
DATO2 DC.L 50
DATO3 DC.W DATO3-ZONA1+DATO1
Como en los ejercicios anteriores generamos el archivo .LST:
> MC68000 Cross Assembler
> Copyright (C) Stephen Croll, 1991. Author: Stephen Croll
> Version 2.00 beta 1.02
>
> 00000040 1 ORG @100
> 0000004A 2 DATO1 EQU *+%1010
> 00000040 3 ZONA1 DS.B $BB
> 000000FB 4 EVEN
> 000000FC 00000032 5 DATO2 DC.L 50
> 00000100 010A 6 DATO3 DC.W DATO3-ZONA1+DATO1
> 00000102 7 END
> No errors detected.
>
> Symbol Value Type Line References
>
> DATO1 0000004A Rel 2 6
> DATO2 000000FC Rel 5 *** UNREFERENCED ***
> DATO3 00000100 Rel 6 6
> EVEN 000000FB Rel 4 *** UNREFERENCED ***
> ZONA1 00000040 Rel 3 6
Tenemos que averiguar el valor de cada etiqueta, en unos casos
vendrá dado por la posición dentro de la memoria (ZONA1) y en
otros (DATO1, DATO2, DATO3) son variables que reciben un valor
como resultado de la correspondiente operación.
El programa empieza en 100 (octal) = 64 (dec) = 40 (hex)
El valor del * corresponde a la dirección actual de ensamblado: $0040+%1010=$004A
Ya tenemos un primer valor: DATO1 = $004A
ZONA1 corresponde en realidad a la posición en memoria de la
primera instrucción "real". La instrucción EQU no ha alterado el
contador de programa, por tanto ZONA1 = $0040
Se reservan ahora $BB bytes, $0040+ $00BB = $00FB
La instrucción EVEN nos hace saltar a la siguiente posición "par": $00FC
y ahí se almacenan 4 bytes (DC.L) con el valor 50 (dec) = $32. El valor
de DATO2 es la posición de memoria donde hemos guardado ese valor: $00FC
Avanzamos 4 bytes hasta $0100 y ahí se guarda un valor que es resultado
de operar con DATO3 que es esa posición de memoria ($0100) y el resto de
etiquetas que hemos calculado antes.
Por lo tanto, el contenido de la posición de memoria apuntada por DATO3
será: $0100 - $0040 + $004A = $010A, como ya sabíamos a la vista del
listado anterior.
|
|
No dudes en escribir si tienes alguna pregunta sobre estos ejemplos
abello |