CENTRO DE EDUCACION SUPERIOR TECNOLOGICA JALPAN DE SERRA, QUERETARO
INGENIERIA EN SISTEMAS COMPUTACIONALES LENGUAJE ENSAMBLADOR
PROFESOR :
ING.ANA MARIA GARCIA RODRIGUEZ.
ALUMNO:
y
JULIO CESAR DIAZ CARRASCO.
RABAJO: T RABAJO:
y
1.8
Estructura de un programa en ensamblador
17 DE FEBRERO DEL 2011. JALPAN DE SERRA, QUERETARO.
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
1.4.-
ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR.
Un programa en lenguaje ensamblador estará formado por una s ecuencia de sentencias. Cada sentencia ocupa una sola línea y tiene la siguiente estructura: [Etiqueta] [Operación] [Operandos] [; Comentarios] Los cuatro campos de una sentencia son opcionales, si no aparece ninguno de ellos (una línea en blanco) tendríamos una sentencia vacía. Su estructura en un programa ejemplo muy simple:
Hemos visto la estructura general. Ahora veremos la posición de los elementos del código por 4 columnas:
Columna 1: Etiquet as . Las etiquetas se rigen por las siguientes normas: y y y
Debe
situarse en la primera columna. Debe contener únicamente caracteres alfanuméricos. El máximo de caracteres es de 31.
2
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
y
y
y
Columna 2: Operac ió n. En esta columna se situarán las instrucciones. El campo del código de operación es el único que nunca puede estar vacío; éste s iempre contiene una instrucción o una directiva del ensamblador. Columna 3: Operandos . El campo de operandos o de dirección puede contener una dirección o un dato, o puede estar en blanco. Normalmente contendrá registros o literales con los que se operará (f, l ok , b y w). Columna 4: Coment ar i o. El campo del comentario o de etiquetas es opcional. Aquí se situará cualquier comentario personalizado que deseemos. Estos son útiles para saber qué hace un programa sin tener que descifrar el código entero. El compilador (ensamblador) ignorará todotexto más allá del carácter punto y coma ";".
Las sentencias se dividen en dos tipos: * I ns tr ucc i ones : Estas sentencias representan órdenes al procesador y tras el proceso de compilación generan código ejecutable. * Di rec tiv as : Estas sentencias dirigen el proceso de compilación o construcción del programa ejecutable. No generan código ejecutable. Normalmente se utilizan para aumentar la legibilidad del código fuente. *Es t ruc tu ra de un fi chero en lenguaje ensamblador Los ficheros de código fuente escritos en lenguaje ensamblador se organizan en líneas. Cada una de las l íneas del fichero puede contener una directiva, una instrucción o ambas cosas a la vez en los casos en que sea posible. Todos los ficheros fuente tienen que adecuarse a una estructura fija dividida en secciones. La estructura a seguir se muestra a continuación: escala EQU 1000
;Definición de constantes simbólicas ORIGEN 7F40h ;Definición del origen de carga del programa INICIO ini;Definición de la etiqueta que marca la ;primera instrucción a ejecutar del programa .PILA 100h ;Definición de la pila .DATOS ;Definición de los datos del programa dato1 VALOR 12h « .CODIGO ;Definición del código del programa INI: MOV R5, R4 « FIN
No existe una convención establecida para la estructura de un programa en lenguaje ensamblador (no como sucede con otros lenguajes, como C/C++). Como regla de oro, es necesarios la declaración de dos segmentos, la de código (CO DE) y la de pila (STACK). En total, hay 4 segmentos principales: Segmento de datos, Segmento de código, Segmento de pila y Segmento Extra. Los diferentes segmentos tienen las siguientes funciones:
3
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
Segmento de datos : Contiene la dirección donde inicia la declaración de variables. Aquí, escribiremos nuestras variables. Segmento de código: Contiene la dirección de inicio donde se encuentran las instrucciones del programa. Aquí, escribiremos todo el código de nuestro programa Segmento de pi la: Contiene la dirección donde se encuentra la pila. Segmento Extra: Contiene la dirección donde podemos almacenar datos extras.
1.8.1
DATA SEGMENT
El DS es un registro de segmento cuya función es actuar como policía donde se encuentran los datos. Cualquier dato, ya sea una variable inicializada o no, debe estar dentro de este segmento. La única excepción es cuando tenemos programas del tipo *.com, ya que en éstos sólo puede existir un segmento. 1.8.2
SNACK SEGMENT
El SS tiene la tarea exclusiva de manejar la posición de memoria donde se encuentra la pila (stack). Esta es una estructura usada para almacenar datos en forma temporal, tanto de un programa como de las operaciones internas de la computadora personal (PC, por s us siglas en inglés ) En términos de operación interna, la CPU usa este segmento para almacenar las direcciones de retorno de las llamadas a rutinas. 1.8.3
CODE SEGMENT
Elregistro de segmentos más importante es el CS o segmento de código. Es aquí donde se encuentra el código ejecutable de cada programa, el cual está directamente ligado a los diferentes modelos de memoria. El segmento de código (CS) contiene las instrucciones de máquina que son ejecutadas por lo común la pr imera instrucción ejecutable está en el inicio del segmento, y el s istema operativo enlaza a esa localidad para iniciar la ejecución del programa. 1.8.4
INTRUCCIONES DEL PROGRAMA
El juego completo de instrucciones reconocidas por los procesadores intel 8086 a 80286, junto con los coprocesadores 8087 y 80287, se enlistan en el apéndice E. Como puede verse en dicho apéndice, la mayoría de las instrucciones requieren algunos operandos o expresiones para trabajar, y lo cual es válido también para las directivas. Los operandos representan valores, registros o localidades de memoria a ser accesadas de alguna manera. Las expresiones combinan operandos y operadores aritméticos y lógicos para calcular en valor o la dirección a acceder. Los operandos permitidos se enlistan a continuación: Constantes .- Pueden ser números, cadenas o expresiones que representan un valor fijo. Por ejemplo, para cargar un registro con valor constante usaríamos la instrucción MOV indicando el registro y el valor que cargaríamos dicho registro.
4
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
mov ax,9 moval,´c´ Directos .- Aquí se debe especificar la dirección de memoria a accesar en la forma segmento:offset. mov ax,ss:0031h mov al,data:0 movbx,DGROUP:block Relocalizables .-Por medio de un símbolo asociado a una dirección de memoria y que puede ser usado también para llamados. mov ax, value call main moval,OFFSETdgroup:tabla movbx, count count sólo será válido si fue declarado con la directiva DW. Contador de localización.- Usado para indicar la actual localización en el actual segmento durante el ensamblado. Representado con el símbolo $ y también conocido como centinela.
help DB ´OPCIONES´,13,10 F1 DB ´ F1 salva pantalla´,13,10 F10 DB ´ F10 exit´,13,10,´$ DISTANCIA
= $-help
Registros .- Cuando se hace referencia a cualquiera de los registros de propósito general, apuntadores, índices, o de segmento. Basados .- Un operador basado representa una dirección de memoria relativa a uno de los registros de base (BP o BX). Su sintaxis es: desplazamiento[BP] desplazamiento[BX] [desplazamiento][BP] I ndexado.- Un operador indexado representa una dirección de memoria relativa a uno de los registros índice (SI o DI ). Su sintaxis es:
5
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
d esplazamiento[DI ]
Desplazamiento[SI ] Estructuras.- Su sintaxis es variable.campo. variable es el nombre con que se d eclaró la estructura, y campo es el nombre d el campo d entro d e la estructura. dat e STRUC
*Lista Alf ab ética d e Instr uccion es Lista Alf ab ética d e Instr uccion es ACALL Absol ut eCall ADD Add Acc umulator ADDC Add Acc umulator wit h Carr y AJMP Absol ut e Jump ANL Lo gical AND f or byt e varia bl es ANL bit Lo gical AND f or bit varia bl es CJNE Compar e and Jump i f Not Equal CLR A Cl ear Acc um ulator CLR bit Cl ear bit CPL A C ompl em ent Acc um ulator CPL bit Compl em ent bit DA Decimal Ad just o f Acc um ulator DEC Decr em ent Regist er DIV D ivid e Acc um ulator by B DJNZ Decr em ent Regist er and Jump i f Not Zero INC Incr em ent Regist er JB Jump i f Bit Set JBC Jump i f Bit Set and Cl ear Bit JC Jump i f Carr y Set JMP @ Jump indir ect to Addr ess JNB Jump i f Bit Not Set JNC Jump i f Carr y Not Set JNZ Jump i f Acc um ulator Not Zero
JZ Jump i f Acc umulator Zero LCALL Lon g Call LJMP Lon g Jump MOV Mov e byt e varia bl e MOV bit Mov e bit MOVC Mov e Cod e Memor y MOVX Mov e Ext ernal Memor y MUL Multipl y Acc um ulator by B NOP No Op eration ORL Lo gical OR f or byt e varia bl es ORL bit Lo gical OR f or bit varia bl es POP Pop From Stac k PUSH Pus h Onto Stac k RET Ret urn From Subro utin e RETI Ret urn From Int err upt RL Rotat e
Acc um ulator Lef t
RLC Rotat e
Acc um ulator Lef t Thro ugh Carr y RR Rotat e Acc um ulator Ri ght RRC Rotat e Acc um ulator Ri ght Thro ugh Carr y SETB Set Bit SJMP Short Jump SUBB Subtract From Acc um ulator Wit h Borro w SWAP Swap Acc um ulator Ni bbl es XCH Exc han ge Byt es XCHD Exc han ge D i gits X RL Excl usiv e OR ?? Und ef in ed Instr uction
6
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
1.8.5
DIRECTIVAS.
El MASM posee un conjunto de instrucciones que no pertenecen al lenguaje ensamblador propiamente sino que son instrucciones que únicamente son reconocidas por el ensamblador y que han sido agregadas para facilitar la tarea de ensablamblado, tanto para el pr ogramador como para el programa que lo lleva a cabo. Dichas instrucciones son denominadas directivas. En general, las directivas son usadas para especificar la organización de memoria, realizar ensamblado condicional, definir macros, entrada, salida, control de archivos, listados, cross-reference, direcciones e información acerca de la estructura de un programa y l as declaraciones de datos. El apéndice D proporciona una lista completa de estas directivas. * Conjunto de instrucciones.- Dentro de las directivas más importantes, tenemos las que establecen el conjunto de instrucciones a soportar para un microprocesador en especial: .8086(default).- Activa las instrucciones para el 8086 y 8088 e inhibe las del 80186 y 80286. .8087(default).- Activa instrucciones para el 8087 y desactiva las del 80287. .186.- Activa las instrucciones del 80186. .286c.- Activa instrucciones del 80286 en modo no protegido. .289p.- Activa instrucciones del 80286 en modo protegido y no protegido. .287.- Activa las instrucciones para el 80287. * Declaración de segmentos.- En lo que respecta a la estructura del programa tenemos las directivas SEGMENT y ENDS que marcan el inicio y final de un segmento del programa. Un segmento de programa es una colección de instrucciones y/o datos cuyas direcciones son todas r elativas para el mismo registro de segmento. Su sintaxis es: nombreSEGMENT [alineación] [combinación] [´clase´] nombreENDS El nombre del segmento es dado por nombre, y debe ser único. Segmentos con el mismo nombre se tratan como un mismo segmento. Las opciones alineación, combinación, y clase proporcionan información al LINK sobre cómo ajustar los segmentos. Para alineación tenemos los siguientes valores: byte (usa cualquier byte de dirección), word(usa cualquier palabra de dirección, 2 bytes/word), para (usa direcciones de parráfos, 16 bytes/parráfo, deafult), y page (usa direcciones de página, 256 bytes/page). combinación define cómo se combinarán los segmentos con el mismo nombre. Puede asumir valores de: public(concatena todos los segmentos en uno solo), stack (igual al anterior, pero con direcciones relativas al r egistro SS, common(crea segmentos sobrepuestos colocando el inicio de todos en una misma dirección), memory (indica al LINK tratar los segmentos igual que MASM con public, at address (direccionamiento relativo a address). claseindica el tipo de segmento, señalados con cualquier nombre. Cabe señalar que en la definición está permitido el anidar segmentos, pero no se permite de ninguna manera el sobreponerlos. * Fin de código f uente.- Otra directiva importante es la que indica el final de un módulo. Al alcanzarla el ensamblador ignorará cualquier otra declaración que siga a ésta. Su sintaxis es :
7
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
END [expr esión ] la op ción expr esión p er mi te def inir la dir ección en la cual el pr ogr ama ini ci ar á. * Asignación de segmentos.- La dir ect i va ASSUME p er mi te in di car cuales s er án los valor es p or default que asi mir án los r egis tr os de s egmen to. Exis ten dos for mas de hacer es to: ASSUME r egis tr os egmen to:n ombr e,,, ASSUME NOTHING NOTHING can cela valor es pr evi os . * Etiquetas.- Las et i quetas s on declar adas n ombr e:
don de n ombr e cons ti tuye un a caden a de car acter es . * Declaración de datos.- Es tos s e declar an s egún el t ip o, medi an te la r egla [n ombr e] dir ect i va valor ,,, don de dir ect i va p uede s er DB (bytes ), DW (p alabr as ), DD (p alabr a doble), DQ (p alabr a cuádr up le), DT (di ez bytes ). Tambi én p ueden us ars e las dir ect i vas LABEL (cr ea et i quetas de ins tr ucci on es o datos ), EQU (cr ea s ímbolos de i gualdad) , y el s ímbolo = ( asi gn a abs olutos ) p ar a declar ar s ímbolos . Es tos t i en en la si gui en te sin taxis : n ombr e= expr esi on n ombr eEQU expr esión n ombr eLABEL t ip o
don det ip op uedes er BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR. * Declaración de estructuras.- Par a la declar ación de es tr uctur as de datos s e emp lea la dir ect i va STRUC. Su sin taxis es : n ombr eSTRUC
camp os n ombr e ENDS
8
Julio Cesar Díaz Carrasco ISC IV Sem LENGUAJE ENSAMBLADOR
Bibliografía Y Páginas WEB:
Peter Abel. Lenguaje Ensamblador y Programación para PC I BM y compatibles. Editorial Prentice Hall, 3ª edición [1996]. http://sistemas.itlp.edu.mx/tutoriales/ensamblador/index.html http://www.monografias.com/trabajos76/estructura-programa-ensamblador/estructura-programa-ensamblador2.s html http://www.mitecnologico.com /Main/InstruccionesDelProgramaEnsamblador http://www.mitecnologico.com /Main/DirectivasLenguajeEnsamblador http://html.rincondelvago.com/ensamblador_5. html
9