Arquitectura de computadores Lab Tema 1 INTRODUCCIN AL
Arquitectura de computadores Lab Tema 1 “ INTRODUCCIÓN AL ENSAMBLADOR “
• Los registros de segmento apuntan al segmento, y los de índice indican el desplazamiento dentro del segmento. • Los registros de índice se pueden usar como registros de datos sin problemas para sumas, movimiento de datos. . . no así los de segmento, que tienen fuertes limitaciones. • Cuando se diga "un registro" como operando de una instrucción, eso incluye en principio cualquier registro menos los de segmento.
(1) Ensambla, desde el Debug del MS-DOS, utilizando el comando “a”, las siguientes operaciones de transferencia: En la primer columna tenemos las posición de nuestras instrucciones comenzando desde la posición 0100 (2) Desensambla, utilizando el comando “u”, el código a ejecutar. ¿Por qué aparece más código del introducido? Interrupción 20 h: Terminación del programa. Su función es informar al sistema operativo que el programa ha terminado y que puede liberar la memoria que ocupaba. El primer byte es el código de operación El segundo a los dos últimos dígitos del número que nosotros queremos cargar en el acumulador. El tercer byte tiene los dos primeros número del número que nosotros ingresamos.
(3) Ejecuta con el comando “t” la primera instrucción. • ¿Qué ocurre con el registro AX? • ¿Y con el registro IP? (4) Ejecuta la siguiente instrucción. A continuación, y utilizando el comando “r”, modifica el valor de BH a 12(hex). Termina de ejecutar las dos líneas restantes. -rbx BX 0000: 0 C 00 BH BL
(5) Ensambla, desde el Debug del MS-DOS, el siguiente código: MOV AX, 8000 MOV BX, 8000 ADD AX, BX (6) Ejecuta, con el comando “t”, las tres sentencias anteriores y observa los distintos flags. ¿Cuáles cambian, y por qué?
(7) Repite el ejercicio 5 y el 6, pero tras ejecutar las dos primeras instrucciones modifica, con el comando “a”, la última instrucción, sustituyéndola por SUB AX, BX. Ejecuta y observa ahora los flags. ¿Cuál cambia, y por qué?
(8) Ensambla, utilizando el Debug del MS-DOS, el siguiente código: MOV AX, 1010 MOV BX, 2020 PUSH AX ADD AX, BX MOV CX, AX POP AX PUSH: guarda un byte en la cima de la pila. POP: extrae el byte de la cima de la pila (9) Ejecuta, con el comando “t”, las tres primeras líneas. • ¿Qué pasa con el puntero de pila? . • ¿Por qué se decrementa? . PUSH Rr ; Pone el contenido del registro Rr en la pila, y luego decrementa SP en una unidad. SS: SP apuntan a la pila. La pila crece hacia abajo, es decir, cuando metemos algo en la pila el puntero de pila se decrementa, y cuando lo sacamos se incrementa. Siempre se meten valores de 16 bits. Significan Stack Segment y Stack Pointer, claro. Por lo general SS no se toca, y SP quizá pero poquito, ya que hay instrucciones específicas para manejar la pila que alteran SP indirectamente. Digamos que uno dice "tiro esto a la pila" o "saco lo primero que haya en la pila y lo meto aquí" y el micro modifica SP en consecuencia.
Muestra, con el comando “d”, el contenido de la pila. • ¿Qué registro de segmento hay que utilizar para acceder a las posiciones de memoria de la pila? Hasta donde llega nuestro programa está subrayado. -d (DISPLAY) que nos muestra la memoria. Esta está dividida en dos partes: a)La comprendida por caracteres hexadecimales que nos permiten ver todo el contenido de la memoria porque la combinación de bits en un nibble (4 bits) siempre tiene representación en hexadecimal. b)En caracteres, en castellano o ingles, pero noten que es inentendible porque normalmente la configuración de memoria no tiene una estructura semántica y sintáctica que podamos comprender. El resto es basura que no nos pertenece. El guión que separa en dos partes la memoria expresada en hexadecimal no indica el cambio de palabra. DI y SI son registros índice, es decir, sirven para indicar el offset dentro de un segmento. En las instrucciones de cadena DI se asocia por defecto a DS, y SI a ES.
Muestra, con el comando “d”, el contenido de la pila. • ¿Qué registro de segmento hay que utilizar para acceder a las posiciones de memoria de la pila? SP (índice de pila) almacena el desplazamiento dentro del segmento de pila, y apunta al último elemento introducido en la pila. Se usa conjuntamente con el registro SS. BP (índice de base) se usa para almacenar desplazamiento en los distintos segmentos. Por defecto es el segmento de la pila SP BP SS segmento de Pila
(10) Termina de ejecutar las líneas introducidas. Mov ax, 8000 Ax => 1010 • ¿Qué pasa con AX? . Mov bx, 2020 Bx => 2020 • ¿Cómo queda el puntero de pila? . Push ax Add ax, bx Mov cx, ax Pop ax Ax=ax+bx Ax=1010+2020 Ax=3030 PILA Cx=3030 1010 ? ? ?
EMU 8086 El emu 8086 es un emulador del microprocesador 8086 (Intel o AMD compatible), este entorno corre sobre Windows y cuenta con una interfaz gráfica muy amigable e intuitiva que facilita el aprendizaje el leguaje de programación en assembler. Dado que en un entorno emulado de microprocesador no es posible implementar una interfaz real de entrada/salida, el emu 8086 permite interfacear con dispositivos virtuales y emular una comunicación con el espacio de E/S. Para esto, el emu 8086 cuenta con una serie de dispositivos virtuales preexistentes en el software base, listos para ser utilizados, entre los que se encuentran una impresora, etc. Documento “Introducción al Emu 8086” (https: //rinapilar. files. wordpress. com/2020/01/introduccion_emu 8086 -1. docx)
• Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de enunciados o líneas de programación son: • 1. - Instrucción, tal como MOV y ADD, que el ensamblador traduce a código objeto. • 2. - Directiva, que indican al ensamblador que realice una acción especifica, como definir un elemento de dato.
• ENUNCIADO O LINEA DE PROGRAMACIÓN: [Etiqueta] <Operación o directiva> [ operando (s) ] [ ; comentarios ] NOTA: Los corchetes indican una entrada opcional ETIQUETA o IDENTIFICADOR. - Es un nombre para designar un dato y la dirección donde se encuentra dicho dato, no debe tener espacios en blanco en medio de la etiqueta. • Para definir una etiqueta se usan los directivos DW, DB. Una etiqueta puede tener los siguientes usos: Como variable. - Ejemplo: num db 65 ; A num se le asocia el valor 65. También podemos hacer: num dw 6567 H • Como dirección. - En la cual puede continuar el programa: SUMA: ADD AX, DX _____________ JMP SUMA
• ENUNCIADO O LINEA DE PROGRAMACIÓN: [Etiqueta] <Operación o directiva> [ operando (s) ] [ ; comentarios ] NOTA: Los corchetes indican una entrada opcional • OPERACIÓN O DIRECTIVA. - En este campo deberá estar el nombre de la operación (Mnemónico) que el micro deberá realizar, o el nombre de una orden (directiva) que el programa ensamblador deberá ejecutar al momento de ensamblar nuestro programa. (Instrucción) Etiq 1: MOV AX, 20 H Algunas directivas serían: . Model. Stack. Data. Code. End Indica el modelo de memoria que usará Indica el tamaño del Stack o pila Indica el inicio del segmento de datos Indica el inicio del segmento de código Indica el fin del programa
El registro DS contiene la dirección del segmento de datos. En este segmento se almacenan las variables empleadas por un programa. - Calcula el tamaño que ocupan estos datos:
• ENUNCIADO O LINEA DE PROGRAMACIÓN: [Etiqueta] <Operación o directiva> [ operando (s) ] [ ; comentarios ] NOTA: Los corchetes indican una entrada opcional • OPERANDO. - (Si existe) proporciona información para la operación que actúa sobre el. Ø Para un elemento de datos, el operando identifica su valor inicial. Por ejemplo, en la definición siguiente de un elemento de datos llamado COUNTER, la operación DB significa “definir byte”. ETIQUETA Counter OPERACIÓN DB OPERANDO COMENTARIO 0 ; define un byte con valor=0 Ø Para una instrucción un operando indica en donde realizar la operación. Una instrucción puede tener uno, dos o tal vez ningún operando. Aquí están tres ejemplos: OPERACIÓN RET INC ADD OPERANDO CX AX, 12 COMENTARIO ; Regresa ; Incrementa el registro CX ; Suma 12 al registro AX
• • ESTRUCTURA DE UN PROGRAMA. Los requerimientos mínimos para un programa escrito en lenguaje ensamblador son: . Model. STACK. DATA ___ ___. CODE ___ ___ MOV AH, 4 CH INT 21 H END SMALL 200 ; indica el modelo de memoria (SMALL) ; indica el tamaño del STACK (bytes) ; indica que la siguiente información ; deberá quedar en el segmento de datos ; indica que la siguiente información ; es el programa ejecutable ; necesario para terminar el programa ; y regresar al prompt C> ; Indica el fin del programa
MODOS DE PROGRAMA (. com. exe) Existen 2 tipos de programas: a). - Los programas. EXE b). - Los programas. COM Algunas de las diferencias básicas es: el tamaño del programa, la segmentación y la inicialización. Un programa. COM es mas pequeño que un programa. EXE Un programa. COM está restringido a un solo segmento de 64 Kb. El segmento de código, el segmento de datos, el segmento de stack y el segmento extra están todos traslapados en uno solo. Esto no sucede así en los programas. EXE En un programa. COM los datos están en el mismo segmento que el de código, por lo tanto la primera instrucción es un salto a donde continua el código del programa , evitando que el CPU lea los datos como si fueran instrucciones. En los programas. EXE no existe este problema ya que el segmento de código y el de datos están separados, mas sin embargo las primeras instrucciones en este tipo de programas son para obtener la dirección en donde el sistema operativo guardo los datos, y cargársela al registro DS. MOV AX, @ DATA DS, AX
• Utiliza EMU 8086, pero antes debes leer “introducción a Emu 8086” (en el blog) (11) Escribe, ensambla y ejecuta el siguiente código:
(12) Ejecuta el programa de la actividad 11 paso a paso desde la aplicación. Observa las variables declaradas, utilizando los comandos: Emu 8086 : Botón VARS 1 3 2
(13) Ejecuta el programa de la actividad 11, y al ejecutar la instrucción MOV AL, OPERANDOR 1 realiza la siguiente operación con la aplicación: • Emu 8086 : Haz doble clic sobre uno de los casilleros del registro AX, escribe en la casilla Unsigned el valor 255 • Finalmente, continúa ejecutando el programa. ¿Qué pasa con el resultado?
(14) Cambia la línea ADD AL, OPERANDO 2 del programa de la actividad 11 por SUB AL, OPERANDO 2. Ensambla, enlaza y ejecuta el nuevo programa. ¿Qué hace? ? ? ?
(15) Escribe, ensambla y ejecuta el siguiente código: Explica el resultado de la ejecución:
(16) En el programa anterior coloca en AX el valor 0 FFh. Ensambla y ejecuta el nuevo programa: Explica el resultado de la ejecución:
(17) Cambia la instrucción DIV por la IDIV en la actividad anterior, y observa: qué es lo que ocurre con el resultado de la división? (18) Prueba diferentes valores con la división, observa dónde queda el cociente y dónde el resto
(19) Emu 8086: Activa las ventanas de STACK, y de VARS. Escribe, ensambla y ejecuta el siguiente código: (20) ¿Qué ocurre con el resultado de la ejecución anterior?
(21) Escribe y ensambla siguiente código: (22) Observa los errores detectados e identifica la línea y el tipo de error que se produce.
(23) Corrige el código con la siguiente información: • Línea MOV BX, NUMERO debe poner MOV BH, NUMERO • Línea JLE DIG 3 hay que poner JLE DIG 2 Ensambla de nuevo y ejecuta. ¿Qué hace el programa? . …… Dibuja el diagrama de flujo de este programa!!. . . . (24) Activa la ventana de FLAGS. Ejecuta paso el programa corregido. Observa cómo a veces salta desde JLE DIG 2 a ADD DL, 30 H y otras veces no. ¿Por qué? (25) Ejecuta el programa paso, y al ejecutar la instrucción JLE DIG 1 realiza la siguiente operación: Emu 8086 : Dentro de la ventana de FLAGS, coloca en la casilla SF el valor 0. Finalmente, continúa ejecutando el programa. ¿Qué pasa con el resultado?
(26) Hacer un programa en ensamblador : • Debe realizar las cuatro operaciones aritméticas básicas, para dos datos de 8 bits facilitados al comienzo del programa en las variables Op 1 y Op 2. • Los resultados deben dejarse en las variables Res. Suma, Resta, Res. Mul, Coci. Div y Resto. Div.
- Slides: 30