4.1: Ejecución de un programa en la CPU de una dirección
- Page ID
- 80666
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Las siguientes instrucciones detallan cómo usar la CPU de una dirección.
- Primero descargue el archivo One-AddressCPU.zip del sitio web del autor, http://chuckkann.com. Descomprima el archivo en una ubicación adecuada.
- En el directorio raíz de este zip hay un archivo JAR ejecutable llamado OneAddressAssembler.jar. Haga doble clic en este icono, y debería ver la siguiente pantalla.
- Haga clic en el botón Examinar y aparecerá un cuadro de diálogo de archivo. Seleccione el directorio AssemblyPrograms.
- Seleccione el programa AdditionExample.asm. Este es el Programa 2.5 del Capítulo 2, y agrega dos valores de la memoria juntos y almacena el resultado nuevamente en la memoria.
- El programa mostrará la siguiente pantalla, que dice que el ensamblador utilizará como entrada el archivo AdditionExample.asm, y si se completa con éxito producirá dos archivos de salida, AdditionExample.mc (el código de máquina) y AdditionExample.dat (los datos). Haga clic en el botón Ensamblar.
- Debe recibir el siguiente mensaje de que el montaje se completó con éxito. Haga clic en Salir para cerrar el ensamblador.
- Vaya al subdirectorio llamado Logisim, y haga clic en el icono de logisim-generic-2.7.1.jar. Esto abrirá Logisim, y deberías ver la siguiente pantalla. Elija la opción Archivo- >Abrir, seleccione el directorio Logisim y abra el archivo OneAddress CPU.circ.
- Ahora debería ver una pantalla con la CPU de una dirección en ella. Establezca el tamaño del zoom (con un círculo en la imagen) en 75% (o 50% si es necesario) para ver el diagrama completo. Por ahora las únicas dos áreas de la CPU se interesan son la Memoria de Texto y la Memoria de Datos, las cuales están rodeadas en el diagrama.
- Haga clic con el botón derecho en el cuadro Memoria de texto y seleccione la opción Editar contenido. Deberías ver el siguiente editor para que la memoria aparezca en tu pantalla. Tenga en cuenta que los valores de entrada para esta memoria están en hexadecimal, pero vamos a rellenarlo a partir de los archivos que fueron creados por el ensamblador, y el ensamblador ha escrito los archivos en hexadecimal.
- Elija la opción Abrir, vaya al directorio AssemblyPrograms y seleccione el archivo AdditionExample.mc.
- Ahora deberías tener el código de máquina AdditionExample en este bloque de datos, como en el siguiente ejemplo. Seleccione la opción cerrar y el código de máquina ya está disponible en la CPU.
- Repita los pasos 9-11 para la memoria de datos usando el archivo AdditionExample.dat. Sus datos y la memoria del programa deben ahora ser inicializados.
- Al hacer clic dos veces en el reloj (recuerde que los registros y la memoria solo cambian en un disparador de borde positivo, no un activador de borde negativo), y la instrucción
clac
se ejecutará. Esto no dará lugar a un cambio porque el$ac
ya es cero. Haga clic en el reloj dos veces más, y debería ver que el programa está en la instrucción 2, y el$ac
cambia a 5. - Al hacer clic en el reloj 6 veces más se muestra que el programa se ha completado, y se ha calculado el valor de 7 (5+2) y se almacena en la dirección de memoria 0. Las dos últimas instrucciones, clac y beqz stop, simplemente ponen el programa en un bucle infinito al final para que no continúe ejecutándose por el resto de la memoria.
En Logisim hay varias formas de controlar la simulación usando la opción Simulación. De particular utilidad es la frecuencia de tick (con qué frecuencia ocurre un clic de reloj), tick habilitado (que ejecuta el reloj a la frecuencia de tick) y Logging (que proporciona una manera fácil de revisar sus resultados).