ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

10
CENTRO DE EDUCACION SUPERIOR TECNOLOGICA JALPAN DE SERRA, QUERETARO INGENIERIA EN SISTEMAS COMPUTACIONALES LENGUAJE ENSAMBLADOR PROFESOR: ING.ANA MARIA GARCIA RODRIGUEZ. ALUMNO: JULIO CESAR DIAZ CARRASCO. TRABAJO: 1.8 Estructura de un programa en ensamblador

Transcript of ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Page 1: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

CENTRO DE EDUCACION SUPERIOR TECNOLOGICA

JALPAN DE SERRA, QUERETARO

INGENIERIA EN SISTEMAS COMPUTACIONALES

LENGUAJE ENSAMBLADOR

PROFESOR: ING.ANA MARIA GARCIA RODRIGUEZ.

ALUMNO:

JULIO CESAR DIAZ CARRASCO.

TRABAJO:

1.8 Estructura de un programa en ensamblador

17 DE FEBRERO DEL 2011. JALPAN DE SERRA, QUERETARO.

Page 2: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

2

1.4.- ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR.

Un programa en lenguaje ensamblador estará formado por una secuencia 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: Etiquetas. Las etiquetas se rigen por las siguientes normas:

Debe situarse en la primera columna. Debe contener únicamente caracteres alfanuméricos. El máximo de caracteres es de 31.

Page 3: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

3

Columna 2: Operació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 siempre 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 o k , b y w).

Columna 4: Comentario. 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á todo texto más allá del carácter punto y coma ";".

Las sentencias se dividen en dos tipos:

* Instrucciones:

Estas sentencias representan órdenes al procesador y tras el proceso de compilación generan código ejecutable.

* Directivas:

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.

*Estructura de un fichero 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 (CODE) y la de pila (STACK). En total, hay 4 segmentos principales: Segmento de datos, Segmento de código, Segmento de pila y Segmento Extra.

Page 4: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

4

Los diferentes segmentos tienen las siguientes funciones:

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 programaSegmento de pila: 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 sus 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

El registro 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 primera instrucción ejecutable está en el inicio del segmento, y el sistema 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.

Page 5: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

5

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.

mov ax,9

mov al,´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

mov bx,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

mov al,OFFSET dgroup:tabla

mov bx, 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]

Page 6: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

6

desplazamiento[BX]

[desplazamiento][BP]

Indexado.- Un operador indexado representa una dirección de memoria relativa a uno de los registros índice (SI o DI). Su sintaxis es:

desplazamiento[DI]

Desplazamiento[SI]

Estructuras.- Su sintaxis es variable.campo. variable es el nombre con que se declaró la estructura, y campo es el nombre del campo dentro de la estructura.

date STRUC

*Lista Alfabética de Instrucciones

Lista Alfabética de Instrucciones JZ Jump if Accumulator ZeroACALL Absolute Call LCALL Long CallADD Add Accumulator LJMP Long JumpADDC Add Accumulator with Carry MOV Move byte variableAJMP Absolute Jump MOV bit Move bitANL Logical AND for byte variables MOVC Move Code MemoryANL bit Logical AND for bit variables MOVX Move External MemoryCJNE Compare and Jump if Not Equal MUL Multiply Accumulator by BCLR A Clear Accumulator NOP No OperationCLR bit Clear bit ORL Logical OR for byte variablesCPL A Complement Accumulator ORL bit Logical OR for bit variablesCPL bit Complement bit POP Pop From StackDA Decimal Adjust of Accumulator PUSH Push Onto StackDEC Decrement Register RET Return From SubroutineDIV Divide Accumulator by B RETI Return From InterruptDJNZ Decrement Register and Jump if Not Zero

RL Rotate Accumulator Left

INC Increment RegisterRLC Rotate Accumulator Left Through Carry

JB Jump if Bit Set RR Rotate Accumulator Right

JBC Jump if Bit Set and Clear BitRRC Rotate Accumulator Right Through Carry

JC Jump if Carry Set SETB Set BitJMP @ Jump indirect to Address SJMP Short Jump

JNB Jump if Bit Not SetSUBB Subtract From Accumulator With Borrow

JNC Jump if Carry Not Set SWAP Swap Accumulator NibblesJNZ Jump if Accumulator Not Zero XCH Exchange Bytes

XCHD Exchange Digits

Page 7: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

7

XRL Exclusive OR?? Undefined Instruction

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 programador 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 las 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 relativas para el mismo registro de segmento. Su sintaxis es:

nombre SEGMENT [alineación] [combinación] [´clase´]

nombre ENDS

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 registro 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). clase indica el tipo de segmento, señalados con cualquier

Page 8: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

8

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 fuente.- 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:

END [expresión]

la opción expresión permite definir la dirección en la cual el programa iniciará.

* Asignación de segmentos.- La directiva ASSUME permite indicar cuales serán los valores por default que asimirán los registros de segmento. Existen dos formas de hacer esto:

ASSUME registrosegmento:nombre,,,

ASSUME NOTHING

NOTHING cancela valores previos.

* Etiquetas.- Las etiquetas son declaradas

nombre:

donde nombre constituye una cadena de caracteres.

* Declaración de datos.- Estos se declaran según el tipo, mediante la regla

[nombre] directiva valor,,,

donde directiva puede ser DB (bytes), DW (palabras), DD (palabra doble), DQ (palabra cuádruple), DT (diez bytes). También pueden usarse las directivas LABEL (crea etiquetas de instrucciones o datos), EQU (crea símbolos de igualdad) , y el símbolo = ( asigna absolutos) para declarar símbolos. Estos tienen la siguiente sintaxis:

nombre = expresion

nombre EQU expresión

nombre LABEL tipo

donde tipo puede ser BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR.

* Declaración de estructuras.- Para la declaración de estructuras de datos se emplea la directiva STRUC. Su sintaxis es:

nombre STRUC

campos

nombre ENDS

Page 9: ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR

Julio Cesar Díaz Carrasco ISC IV SemLENGUAJE ENSAMBLADOR

9

Bibliografía Y Páginas WEB:

 Peter Abel. Lenguaje Ensamblador y Programación para PC IBM 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.shtml

http://www.mitecnologico.com/Main/InstruccionesDelProgramaEnsamblador

http://www.mitecnologico.com/Main/DirectivasLenguajeEnsamblador

http://html.rincondelvago.com/ensamblador_5.html