ARQUITECTURA DE COMPUTADORES II Resumen del Capítulo IV ENSAMBLADORES Y COMPILADORES: Existen dos clases de lenguajes de programación: de alto nivel y de bajo nivel. Los programadores que escriben en un lenguaje de alto nivel codifican comandos poderosos cada uno de los cuales puede generar muchas instrucciones en lenguaje máquina. Los programadores que escriben en lenguaje ensamblador codifican instrucciones simbólicas, cada una de las cuales genera una instrucción en lenguaje máquina. Algunas de las ventajas de codificar en un lenguaje máquina son: Proporciona más control sobre el manejo particular de los requerimientos de hardware. Genera módulos ejecutables más pequeños y más compactos. Con mayor probabilidad tiene una ejecución más rápida. Un lenguaje de alto nivel utiliza un compilador para traducir el código fuente a lenguaje máquina. Mientras un lenguaje de bajo nivel utiliza un ensamblador para dicha traducción. Un programa enlazador completa la operación para ambos niveles. COMENTARIOS EN LENGUAJE ENSAMBLADOR: El uso de comentarios de un programa mejora su claridad, en especial en lenguaje ensamblador. Un comentario empieza con punto y coma (;) y, a su derecha el comentario que sea prudente. PALABRAS RESERVADAS: Existen palabras reservadas para sus propios propósitos y son usadas sólo bajo condiciones especiales. Por categorías las palabras reservadas incluyen: Instrucciones : operaciones que la computadora puede ejecutar como ADD y MOV Directivas: se emplean para proporcionar comandos al ensamblador (END Y SEGMENT). Operadores: se utilizan en expresiones como FAR y SIZE. Símbolos Predefinidos: que regresan información a su programa como @Data y @Model. IDENTIFICADORES: Un identificador es un nombre que se aplica a elementos del programa. Los dos tipos de identificadores que existen son los nombres, que se refiere a la dirección de un elemento de dato y las etiquetas, que se refiere a la dirección de una instrucción. Un identificador puede utilizar letras del alfabeto, signo de interrogación, subrayado, signo de pesos, arroba, punto y dígitos; los dos últimos no pueden ser el primer dígito. La longitud máxima de un identificador es 31 caracteres. 1 INSTRUCCIONES: Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de enunciados son: Instrucciones: que el ensamblador traduce a código objeto, tal como MOV. Directivas: que indican al ensamblador que realice una acción específica, como definir un elemento de dato. El formato general de un enunciado, en donde los corchetes indican una entrada opcional: Identificador: El término nombre se aplica al nombre de un elemento o directiva definida, mientras que el término etiqueta se aplica al nombre de una instrucción. Operación: La operación debe ser codificada, es con mayor frecuencia usada para la definición de áreas de datos y codificación de instrucciones. Una operación como DB o DW define un campo, área de trabajo o constante. Para una instrucción, una operación como MOV o ADD indica una acción a realizar. Operando: El operando si existe, proporciona información para la operación que actúa sobre él. Para un elemento de datos, el operando identifica su valor inicial. NOMBRE COUNTER OPERACIÓN DB OPERANDO 0 COMENTARIO ;Define un byte [DB] con el valor 0 Para una instrucción, un operando indica en donde realizar la acción. OPERACIÓN RET INC ADD OPERANDO CX AX,12 COMENTARIO ; REGRESA ;Incrementa el registro CX. ;Suma el 12 al registro AX OPERANDO NINGUNO UNO DOS DIRECTIVAS: Las directivas son diferentes enunciados que permiten controlar la manera en que un programa ensambla y lista. Estos actúan sólo durante el ensamblado de un programa y no generan código ejecutable de máquina. Directivas para listar: Las directivas PAGE y TITLE ayudan a controlar el formato de un listado de un programa en ensamblador. PAGE: al inicio de un programa, la directiva PAGE designa el número máximo de líneas para listar en una página y el número máximo de caracteres en una línea. Por ejemplo 60 líneas por página y 132 caracteres por línea: PAGE 60, 132 2 TITLE: Se emplea al inicio de un programa para hacer un título al programa. Se recomienda después del título poner un comentario después del título establecido. SEGMENT: Un programa ensamblado en formato .EXE consiste en uno o más segmentos. Un segmento de datos define los elementos de datos y un segmento de código proporciona Un segmento de pila define el almacén de la pila, un segmento de datos define los elementos de datos y un segmento de código proporciona un código ejecutable. El enunciado SEGMENT define el inicio de un segmento. El operando de un enunciado SEGEMENT puede tener tres tipos de opciones: alineación, combinar y clase. Tipo alineación: la entrada alineación indica el límite en el que inicia el segmento. Tipo combinar: la entrada combinar indica si se combina el segmento con otros segmentos cuando son enlazados después de ensamblar. Los tipos combinar son STACK, COMMON, PUBLIC y la expresión AT. Se utiliza PUBLIC y COMMON en donde tenga el propósito de combinar de forma separada programas ensamblados cuando los enlaza. En otros casos, donde un programa no es combinado con otros, puede omitir la opción o codificar NONE. Tipos Clase: La entrada clase, encerrada entre apóstrofos, es utilizada para agrupar segmentos cuando se enlazan. Generalmente se utiliza la clase `code' para el segmento de códigos, `data' por segmento de datos y `stack' para el segmento de la pila. PROC : El segmento de código contiene el código ejecutable de un programa. También tiene uno o más procedimientos, definidos con la directiva PROC. El operando FAR que se escribe quizás después de la directiva esta relacionado con la ejecución del programa Y SU INCIO.. La directiva ENDP define el fin del procedimiento antes de un ENDS que define el final del segmento. ASSUME: Un programa utiliza al registro SS para direccionar la pila, al registro DS para direccionar el segmento de datos y al registro CS para direccionar el segmento de código. Para este fin se debe indicar al ensamblador el propósito de cada segmento en el programa. Para ello se utiliza esta directiva de la siguiente manera: OPERACIÓN ASSUME OPERANDO SS: [Nombre de la pila], DS: NOMSEGDATOS, CS: NOMSEGCODIGO Un programa termina su ejecución de la siguiente manera MOV AH, 4CH ; Solicitud de terminación MOV AL, retcode ; código de regreso (opcional) INT 21H ; SALIR Esta interrupción utiliza un código de función en el registro AH para especificar una acción que será realizada. DB es el formato preferido para la definición de cadenas de caracteres, ya que permite cadenas de más de dos bytes de longitud y las convierte a la secuencia normal de izquierda a derecha. 3 Los elementos DB son usados para procesar la mitad de registros (AL, BL...). DW para registros completos (AX, BX...) y DD para registros extendidos (EAX, EBX...) RESUMEN DEL CAPITULO V EJECUCIÓN DE UN PROGRAMA: El programa es sólo un archivo de texto realizado en un editor. Es necesario ensamblarlo y luego enlazarlo. • El paso de ensamble consiste en la traducción del código fuente al código objeto y la generación de un archivo intermedio .OBJ (Objeto). • El paso de enlace implica convertir el módulo .OBJ es un módulo de código máquina .EXE. • El último paso es cargar el programa para su ejecución. El programa ensamblador de Microsoft es MASM.EXE, mientras que el programa de Borland es TASM.EXE o se puede utilizar el DEBUGGER del DOS. El enlazador (LINK o TLINK) convierte un archivo .OBJ en un archivo .EXE. RESUMEN DEL CAPÍTULO VI Los registros son conocidos por sus nombres específicos: AX Acumulador BX Registro base CX Registro contador DX Registro de datos DS Registro del segmento de datos ES Registro del segmento extra SS Registro del segmento de pila CS Registro del segmento de código BP Registro de apuntadores base SI Registro índice fuente DI Registro índice destino SP Registro del apuntador de la pila IP Registro de apuntador de siguiente instrucción F Registro de banderas 4 Instrucciones de transferencia: Son utilizadas para mover los contenidos de los operandos. Cada instrucción se puede usar con diferentes modos de direccionamiento. MOV MOVS (MOVSB) (MOVSW) Instrucciones de carga: Son instrucciones específicas de los registros. Son usadas para cargar en algún registro bytes o cadenas de bytes. LODS (LODSB) (LODSW) Carga una cadena LAHF Transfiere el registro AH el contenido de las banderas LDS Cargar el registro de segmento de datos LEA Carga la dirección del operando fuente. LES Carga el registro de segmento extra Instrucciones de la pila: Estas instrucciones permiten el uso de la pila para almacenar y extraer datos. POP Remueve una palabra de la pila. POPF PUSH Agrega a la pila. PUSHF Instrucciones lógicas. Son utilizadas para realizar operaciones lógicas sobre los operandos. AND Conjunción lógica. NEG NOT Negación lógica. OR Disyunción lógica. TEST XOR Disyunción exclusiva Instrucciones aritméticas. Se usan para realizar operaciones aritméticas sobre los operandos. ADC Adición con acarreo. ADD SUMA DIV DIVIDE SIN SIGNO 5 IDIV División con signo MUL Multiplica sin signo. IMUL Multiplicación de dos operandos con signo. SBB Substracción con acarreo SUB Substracción. Instrucciones de salto: Son utilizadas para transferir el flujo del proceso al operando indicado. JMP Salta. JA (JNBE) Bifurca si es mayor o salta si no es menor o igual. JAE (JNBE) Salta si es mayor o igual o salta si no es menor. JB (JNAE) Salta si es mayor o igual o salta si no es menor. JBE (JNA) Salta si es mayor o igual o salta si no es menor. JE (JZ) Salta si es igual o salta si es cero. JNE (JNZ) Salta si es igual o salta si es cero. JG (JNLE) Salta si es mayor o igual o salta si no es menor. JGE (JNL) Salta si es mayor o igual o salta si no es menor. JL (JNGE) Salta si es mayor o igual o salta si no es menor. JLE (JNG) Salta si es mayor o igual o salta si no es menor. JC Salta si hay acarreo o salta si no lo hay JNC Salta si hay acarreo o si no lo hay JNO Si hay desbordamiento o si no lo hay. JNP (JPO) Salta si no hay paridad o salta si la paridad es impar. JNS Salta si el signo es positivo o si es negativo. JO Si hay desbordamiento o si no lo hay. JP (JPE) Si hay paridad o salta si la paridad es par. JS Salta si el signo es positivo o si es negativo. Instrucciones para ciclos: LOOP Transfieren el flujo del proceso, condicional o incondicionalmente, a un destino repitiéndose esta acción hasta que el contador sea cero. 6 LOOP Repetir el ciclo hasta que se complete. LOOPE Repetir el ciclo mientras sea cero. LOOPNE Repetir el cclo mientras no sea cero. Instrucciones de conteo: Se utilizan para decrementar o incrementar el contenido de los contadores. DEC Decrementa. INC Incrementa Instrucciones de comparación Son usadas para comparar operandos, afectan al contenido de las banderas. CMP Compara cadenas. CMPS (CMPSB) (CMPSW) Instrucciones de banderas Afectan directamente al contenido de las banderas. CLC Limpia la bandera de acarreo. CLD Limpia la bandera de dirección. CLI Limpia la bandera de interrupción. CMC Complementa la bandera de acarreo. STC Establece la bandera de acarreo. STD Establece la bandera de dirección STI Establece la bandera de interrupción Instrucción MOV Propósito: Transferencia de datos entre celdas de memoria, registros y acumulador. Sintaxis: MOV Destino,Fuente Donde Destino es el lugar a donde se moverán los datos y fuente es el lugar donde se encuentran dichos datos. Los diferentes movimientos de datos permitidos para esta instrucción son: Destino: memoria. Fuente: acumulador Destino: acumulador. Fuente: memoria Destino: registro de segmento. Fuente: memoria/registro 7 Destino: memoria/registro. Fuente: registro de segmento Destino: registro. Fuente: registro Destino: registro. Fuente: memoria Destino: memoria. Fuente: registro Destino: registro. Fuente: dato inmediato Destino: memoria. Fuente: dato inmediato Ejemplo: MOV AX,0006h MOV BX,AX MOV AX,4C00h INT 21H Este pequeño programa mueve el valor 0006H al registro AX, luego mueve el contenido de AX (0006h) al registro BX, por último mueve el valor 4C00h al registro AX para terminar la ejecución con la opción 4C de la interrupción 21h. Instrucción INC Propósito: Incrementar el operando. Sintaxis: INC destino La instrucción suma 1 al operando destino y guarda el resultado en el mismo operando destino. Instrucción DEC Propósito: Decrementar el operando Sintaxis: DEC destino Esta operación resta 1 al operando destino y almacena el nuevo valor en el mismo operando. RESUMEN DEL CAPÍTULO VII Un programa .COM es más compacto y pequeño que un programa .EXE contraparte. Este clase de extensión no define una pila o un segmento de datos ni actualiza el registro DS. 8 Un programa para correr como .COM utiliza ORG 100HY inmediatamente después del enunciado SEGMENT. El enunciado establece la dirección de desplazamiento al inicio de la ejecución que sigue al PSP. La omisión de un solo registro .COM puede provocar que un programa falle. [ IDENTIFICADOR ] OPERACION [OPERANDO (S)] [;COMENTARIO] 9