Вы находитесь на странице: 1из 12

CAPTULO 3

ESTRUCTURA DE UN PROGRAMA EN ENSAMBLADOR


Programas En Ensamblador
El lenguaje ensamblador es un lenguaje que utiliza smbolos en lugar de instrucciones codificadas en lenguaje mquina. Tambin permite hacer referencia a las localidades de memoria por nombres simblicos en lugar de usar sus direcciones directamente. Un programa escrito en lenguaje ensamblador, llamado cdigo fuente, es traducido al cdigo mquina de un microprocesador mediante un programa llamado ensamblador. Un programa en ensamblador consiste en una secuencia de caracteres almacenada en uno o ms archivos que sern traducidos por el ensamblador al lenguaje mquina de una determinada computadora. En este curso se estudiar el lenguaje ensamblador del procesador 8086 y se utilizar el ensamblador Turbo Assembler de la compaa Borland Int.

Palabras Reservadas
Las palabras reservadas son para uso estricto del ensamblador. stas incluyen a los operadores, directivas y smbolos predefinidos. Estas palabras no pueden usarse como identificadores. La tabla 3.1 muestra la lista de palabras reservadas de Turbo Assembler: Tabla 3.1 Palabras reservadas de Turbo Assembler. ; = ? [] + * . .286c .286p .287 .386 .8086 .8087 align .alpha assume %bin. byte catstr @codesize comm comment %conds @cpu %cref .cref %crefall

: () .286 .387 arg codeseg const

/ .186 .386c and @code .const %crefref

ITSON

Manuel Domitsu Kono

20

Estructura de un Programa en Ensamblador

%crefuref dataptr %depth dt Emul Eq .errb erridni even @fardata fword ideal ifdif ifndef irpc length locals masm name %noctls %nomacs %notrunc p186 p386p %pcnt purge .radix .seq sizestr subttl %text %trunc unknown @wordsize

Tabla 3.1 Palabras reservadas de Turbo Assembler (Cont.) %ctls @curseg @data .data dataseg @datasize ??date db df display dosseg dp dup dw dword else End Endif Endm Endp Equ Err .err .err1 .errdef Errdif errdifi erre errifnb Errifndef errnb errndef evendata Exitm extrn far .fardata @fardata? .fardata? @filename ge Global group gt if If1 if2 ifb ifdifi Ife ifidn ifidni %incl Include includelib instr jumps Label .lall large .lfcond %linum %list .list low lt macro %macs masm51 mod model .model ne near %newpage %noconds noemul %noincl nojumps %nolist nomasm51 nomulterrs %nosyms not nowarn offset or org p286 p286n p287 p386 p387 p8086 p8087 page pno87 %poplctl proc ptr %pushlctl pwor quirqs qword record rept .sall seg .sfcond shl short shr small stack .stack struc %subttl %syms symtype %tabsize .tfcond this ??time title type .type udataseg ufardata uses ??version warn width .xall .xcref .xlist xor

.data? dd dq elseif Ends .err2 erridn errnz fardata ??filename high ifdef ifnb irp le local mask multerrs %nocref nolocals nothing %out p386n %pagesize public radix segment size substr tbyte %title union word

Conjunto De Instrucciones Del 8086


El conjunto de instrucciones del lenguaje ensamblador son mnemnicos de las instrucciones en lenguaje mquina del procesador. El conjunto completo de instrucciones de la familia de procesadores 8086 es:

ITSON

Manuel Domitsu Kono

Captulo 3

Estructura de un Programa en Ensamblador

21

aaa cmc daa idiv iret jcxz jmp jne jnp jpo les loope loopwne movsw out rcr ret sal segcs stc stosw xor

aad cmp das imul ja je jna jng jns js lock loopne loopwnz mul pop rep retn sar segds std test

Tabla 3.2 Conjunto de Instrucciones del 8086 aam aas adc cmps cmpsb cmpsw dec div esc in inc int jae jb jbe jg jge jl jnae jnb jnbe jnge jnl jnle jnz jo jp jz lahf lds lods lodsb lodsw loopnz loopw loopwe loopz mov movs neg nop not popf push pushf repe repne repnz retf rol ror sbb scas scasb segss seges shl sti stos stosb wait xchg xlat

add cwd hlt into jc jle jnc jno jpe lea loop loopwz movsb or rcl repz sahf scasw shr stosw xlatb

Estructura De Un Programa En Ensamblador


Un programa en el lenguaje ensamblador consiste de una secuencia de proposiciones, una en cada lnea del cdigo fuente. La sintaxis de una proposicin es la siguiente: [etiqueta] [instruccin|directiva [operandos]] [;comentario] donde etiqueta, instruccin|directiva, operandos, comentario son los campos de la proposicin. Los campos se separan por caracteres blancos: caracteres de espacio y/o de tabulacin. Todos los campos son opcionales, pero el campo operandos slo pueden estar presente si existe el campo instruccin|directiva. etiqueta es un nombre simblico empleado para referirse a nmeros, cadenas de caracteres o localidades de memoria dentro de un programa. Las etiquetas permiten darle nombre a las variables, constantes y localidades de una instruccin particular.

ITSON

Manuel Domitsu Kono

22

Estructura de un Programa en Ensamblador

Las etiquetas pueden contener los siguientes caracteres: A-Z a-z _ @ $ ? 0-9. Los dgitos 0-9 no pueden usarse como el primer carcter de una etiqueta. Un slo carcter $ o ? no puede usarse como etiqueta ya que tienen un significado especial. Las etiquetas deben ser nicas. Con excepcin de las definidas con la directiva =, y las etiquetas locales de macros y subrutinas. Las etiquetas pueden usarse como operandos tantas veces como se desee. Una etiqueta puede aparecer por s sola en una lnea. En este caso el valor asociado a la etiqueta es la direccin de la operacin en la siguiente lnea en el programa. Las palabras reservadas no pueden usarse como etiquetas. Las etiquetas que aparecen solas en una lnea y las que van seguidas de una instruccin deben terminar en dos puntos (:). Las dems etiquetas por lo general no terminan en dos puntos.

instruccin es un mnemnico de una instruccin del procesador. Cada instruccin se traduce directamente a una instruccin del lenguaje mquina del microprocesador. directiva es una instruccin para el ensamblador. No produce cdigo ejecutable, sino que controla varios de los aspectos de cmo opera el ensamblador: el tipo de cdigo generado (8086, 80286, 80386, etc.), los segmentos a usar, etc. operandos consiste de cero, uno o ms operandos. Un operando le especifica al ensamblador qu valor, registro, localidad de memoria, etc., asociar con cada instruccin. Hay varias clases de operandos: registros, constantes, etiquetas, variables y cadenas. El tipo y nmero de operandos depende de la instruccin o directiva. Si hay dos o ms, van separados por comas (,)

comentario es cualquier secuencia de caracteres precedidos por un punto y coma (;) y que termina con el fin de la lnea. Los comentarios son ignorados por el ensamblador Las lneas en blanco se tratan como comentarios.

Por ejemplo considere el programa de la siguiente pgina. Los nmeros a la izquierda del recuadro no forman parte del programa y slo sirven para numerar las lneas: Las lneas 1 a 7, 9, 16, 20, 28 y 45 son lneas con slo comentarios. Las lneas 8, 10, 15, 17, 19, 21, 27, 29, 34, 39, 44 y 46 son lneas en blanco y son tratadas como comentarios. Se usan para separar las partes de un programa y darle mayor claridad. Las lneas 31 y 40 son lneas con slo una etiqueta
ITSON Manuel Domitsu Kono

Captulo 3

Estructura de un Programa en Ensamblador

23

Las lneas 32, 33, 35 a 38 y 41 a 43 contienen instrucciones. Las lneas 11 a 14, 18, 22 a 26, 30 y 47 contienen directivas.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

;********************************************************** ; PRIMER.ASM. ; ; Este programa ilustra la estructura de un programa en ; ensamblador. Tambin muestra las principales directivas ; para El ensamblador. ;********************************************************** ;****** CDIGO DE INICIO ********************************** ideal dosseg model small stack 256 ;****** DECLARACIN DE CONSTANTES SIMBLICAS ************** cte equ 10

;****** VARIABLES DEL PROGRAMA **************************** codsal dato1 dato2 resul dataseg db db db db 0 ? ? ?

;****** CDIGO DEL PROGRAMA ******************************* codeseg inicio: mov mov mov add add mov salir: mov mov int ah, 04Ch al, [codsal] 21h ax, @data ds, ax al, [dato1] al, [dato2] al, cte [resul], al ; Inicializa el segmento de ; datos ; resul = dato1 + dato2 + cte

;****** CDIGO DE TERMINACIN ***************************** end inicio


Manuel Domitsu Kono

ITSON

24

Estructura de un Programa en Ensamblador

Normalmente podemos considerar que un programa en ensamblador est formado de las siguientes secciones: Cdigo de inicio Declaracin de constantes simblicas Variables del programa Cdigo del programa Cdigo de terminacin

Cdigo De Inicio
El cdigo de inicio de un programa en ensamblador para el 8086 tiene como propsito declarar los nombres de los segmentos en los que se almacenar el cdigo del programa, los datos y la pila. Tambin establece el modelo de memoria bajo el que se ensamblar el programa y el tamao de la pila. El cdigo de inicio consta de un conjunto de directivas. En el programa de ejemplo tenemos:

ideal
El modo ideal es una notacin que emplea el ensamblador Turbo Assembler de Borland International para simplificar la sintaxis del cdigo inicial de un programa. La directiva ideal le dice a Turbo Assembler que utilice el modo ideal. Si se omite se utiliza la notacin empleada por la mayora de los ensambladores, por ejemplo el de Microsoft.

dosseg
Esta directiva que forma parte del modo ideal, le instruye al ensamblador que nombre y ordene los segmentos del programa de la misma forma en que lo hacen los compiladores de alto nivel. Esto es adecuado para la mayora de los programas en ensamblador y sobre todo en las rutinas de ensamblador que se van a ligar a un programa en alto nivel.

model
Esta directiva que debe ir despus de la directiva dosseg, selecciona uno de los 6 modos diferentes que tiene Turbo Assenbler de generar el cdigo de un programa dependiendo del tamao que tiene el cdigo y los datos. Estos modos llamados modelos de memoria, difieren en el tipo de apuntadores que el compilador genera por omisin y por lo tanto en la rapidez de ejecucin del cdigo. Los seis modelos de memoria son: Pequeito (tiny), pequeo (small), medio (medium), compacto (compact), grande (large) y extenso (huge). Modelo pequeito (tiny) En el modelo pequeito, el cdigo, los datos y la pila deben de estar en un solo segmento, esto es, el
ITSON Manuel Domitsu Kono

Captulo 3

Estructura de un Programa en Ensamblador

25

programa completo no debe exceder a 64 KB. Todos los registros de segmento son inicializados al mismo valor y permanecen constantes durante la ejecucin del programa. Bajo este modelo el compilador genera apuntadores cercanos. El cdigo ejecutable producido es el ms pequeo y rpido. Modelo pequeo (small) En el modelo pequeo, el cdigo tiene su propio segmento y los datos y la pila estn en otro segmento, esto es, el cdigo no debe exceder a 64 KB ni tampoco los datos y pila. Los registros de segmento permanecen constantes durante la ejecucin del programa. El cdigo producido bajo este modelo utiliza tambin apuntadores cercanos y es igual de rpido que en el modelo pequeito pero el tamao del programa puede ser del doble. Normalmente debemos usar este modelo de memoria a menos que nuestro cdigo o datos exceda los 64 KB. Modelo medio (medium) En el modelo medio, el cdigo del programa puede ocupar varios segmentos pero los datos y la pila ocupan un solo segmento, esto es, el cdigo puede exceder a 64 KB pero los datos y pila no. Por lo tanto, bajo este modelo el cdigo utiliza apuntadores lejanos y los datos apuntadores cercanos. Debido a los apuntadores lejanos la velocidad de ejecucin del programa se ve degradada. Los registros de los segmentos de datos y la pila se inicializan al mismo valor y permanecen constantes durante la ejecucin del programa. Este modelo se debe usar cuando tengamos un programa de cdigo extenso y pocos datos. Modelo compacto (compact) En el modelo compacto, el cdigo del programa est limitado a un segmento, los datos pueden ocupar varios segmentos aunque el total de las variables estticas no pueden exceder los 64 KB. Por lo tanto, bajo este modelo el cdigo utiliza apuntadores cercanos y los datos apuntadores lejanos. Debido a los apuntadores lejanos tambin hay degradacin en la velocidad de ejecucin del programa. El registro del segmento de cdigo permanece constante durante la ejecucin del programa. Este modelo se debe usar cuando tengamos un programa de cdigo pequeo y muchos datos. Modelo grande (large) En el modelo grande, tanto el cdigo del programa como los datos puede ocupar varios segmentos, aunque el total de las variables estticas no pueden exceder los 64 KB. Los apuntadores en este modelo son lejanos tanto para el cdigo como para los datos. Esto hace que la velocidad de ejecucin de un programa compilado bajo este modelo sea ms lenta que cualquiera de las versiones anteriores. Este modelo se debe usar cuando tengamos un programa de cdigo extenso y muchos datos.

ITSON

Manuel Domitsu Kono

26

Estructura de un Programa en Ensamblador

Modelo extenso (huge). En el modelo extenso, es igual que el modelo grande, slo que el total de las variables estticas si pueden exceder los 64 KB. Sin embargo cada variable esttica en forma individual no puede exceder a 64 KB. Los apuntadores en este modelo son lejanos tanto para el cdigo como para los datos. La velocidad de ejecucin de un programa compilado bajo este modelo es ms lenta que cualquiera de los otros modelos.

stack
Esta directiva reserva espacio de memoria para la pila del programa, un rea de memoria que almacena valores temporales empleados por las subrutinas y las direcciones de regreso de las subrutinas.

Declaracin de constantes simblicas


Las constantes simblicas son identificadores que le asociamos a constantes numricas o a constantes cadenas. El uso de constantes simblicas en un programa hace que sea ms fcil de leer y modificar. Hay dos formas de declarar constantes simblicas: mediante la directiva equ y mediante la directiva =. Por ejemplo: filas cols tam msj tam equ equ = equ = 10 5 filas * cols "Hola" 0

Las directivas equ y = tienen las siguientes reglas: Las constantes simblicas no son variables. Ni el nombre ni su valor asociado se almacena en el segmento de datos del programa. La directiva equ permite darle nombre a constantes numricas, expresiones y cadenas. La directiva = slo permite darle nombre a constantes numricas y expresiones. No se le puede cambiar el valor asociado a un smbolo declarado con la directiva equ. En cambio a un smbolo declarado con la directiva = se le puede cambiar su valor tantas veces como se desee. Las directivas equ y = pueden aparecer en cualquier parte del programa. Pero es preferible colocarlas al principio ya que son ms visibles. Las expresiones declaradas con = se evalan inmediatamente, mientras que las expresiones declaradas con equ se evalan hasta que el smbolo se usa.

ITSON

Manuel Domitsu Kono

Captulo 3

Estructura de un Programa en Ensamblador

27

Variables del programa


Las variables de un programa se declaran en el segmento de datos, por lo que la seccin de declaracin de variables empieza con la directiva dataseg. Esta directiva le indica a Turbo Assembler que almacene las variables en el segmento de datos del programa. Las variables pueden estar inicializadas o no. Los valores de las variables inicializadas se almacenan en el cdigo del programa y se cargan en las variables al ejecutar el programa. Para declarar variables podemos utilizar las directivas db, dw, dd o dq. La directiva db define una variable de un byte, la directiva dw define una variable de tipo palabra (dos bytes), la directiva dd define una variable de tipo palabra doble (cuatro bytes) y la directiva dq define una variable de tipo palabra cudruple (ocho bytes). La sintaxis de estas directivas son: nomVar nomVar nomVar nomVar db dw dd dq exp exp exp exp

donde nomVar es el nombre de la variable y exp es una expresin constante cuyo valor se utiliza para inicializar la variable. Si la variable no se inicializa exp se substituye por un signo de interrogacin, ?. Por ejemplo bdato cresp bdatx wdato db db db dw 10h 'A' ? 0123h ; Variable de un byte ; inicializada a 10h. ; Variable de un byte ; inicializada a 65d. ; Variable de un byte ; no inicializada. ; Variable de tipo ; palabra inicializada ; a 0123h. ; Variable de tipo ; palabra no ; inicializada. ; ; ; ; Variable de tipo palabra doble inicializada a 01234567h.

wdatx

dw

ddato

dd

01234567h

ddatx

dd

; Variable de tipo ; palabra doble ; no inicializada

qdato

dq

0123456789ABCDEFh ; Variable de tipo ; palabra cuadruple ; inicializada a


Manuel Domitsu Kono

ITSON

28

Estructura de un Programa en Ensamblador

; 0123456789abcdefh. qdatx dq ? ; Variable de tipo ; palabra cudruple ; no inicializada

Cdigo del programa


En esta seccin van las instrucciones que el microprocesador ejecutar al correr el programa. Todas las instrucciones van en el segmento de cdigo, por lo que la seccin de cdigo del programa empieza con la directiva codeseg. Esta directiva le dice a Turbo Assembler que almacene las instrucciones en el segmento de cdigo del programa. El cdigo del programa en la mayora de los casos empieza con las siguientes lneas: codeseg inicio: mov mov ax, @data ds, ax ; Inicializa el segmento ; de datos

La primera lnea contiene la directiva codeseg mencionada anteriormente. La segunda lnea establece que inicio es una etiqueta asociada a la direccin de la primera instruccin del programa, que en este ejemplo aparece en la siguiente lnea. Esta etiqueta es usada en la directiva end explicada en la siguiente seccin. En la tercera y cuarta lnea se carga en el registro DS la direccin de inicio del segmento de datos del programa. El smbolo predefinido @data tiene el valor de esa direccin. La instruccin mov mueve datos entre registros o entre registros y localidades de memoria. En este ejemplo la primera instruccin mov almacena la direccin del inicio del segmento de datos en el registro AX y la segunda instruccin mov mueve esa direccin del registro AX al registro de segmento DS. No se puede cargar una direccin directamente a uno de los registros de segmento, por lo que la instruccin mov ds, @data ; No vlido

no es vlida. La direccin debe cargarse primero a un registro de propsito general y luego de ah moverse al registro de segmento. Tambin la mayora de los programas que se van a ejecutar bajo el sistema operativo MSDOS deben terminar con las siguientes lneas de cdigo: salir: mov mov int ah, 04Ch al, [codsal] 21h

El propsito de este cdigo es llamar a una de las rutinas del sistema operativo que termina la ejecucin
ITSON Manuel Domitsu Kono

Captulo 3

Estructura de un Programa en Ensamblador

29

del programa y nos regresa al sistema operativo. Esta rutina que se conoce como una rutina de servicio a interrupcin se ver en el Captulo 8: INTERRUPCIONES. La llamada a esa rutina se hace mediante la instruccin: int 21 Previamente se carg en el registro AH el valor 04Ch que especifica que se desea terminar el programa y regresar al sistema operativo y en el registro AL el valor de la variable codsal, que es el cdigo de salida del programa. El programa le regresa al sistema operativo el valor del cdigo de salida en la variable de ambiente errorlevel. Por convencin, un cdigo de salida de cero denota que el programa termin con xito y un cdigo diferente de cero indica que hubo un error durante la ejecucin del programa. El valor del cdigo identifica al error ocurrido. En los programas en C tambin se acostumbra regresarle un cdigo de salida al sistema operativo. esto se hace mediante la proposicin return en la funcin main(): int main(void) { ... return 0; }

Cdigo de terminacin
Todo programa en ensamblador debe contener una directiva end, la cual marca el final del cdigo fuente. Turbo Assembler ignora cualquier lnea despus de la directiva end. La sintaxis de la directiva end es la siguiente: end [etiqueta]

etiqueta es el nombre simblico de la direccin de la instruccin por la que empezar a ejecutarse el programa. Si se omite, el programa empezar su ejecucin en la primera instruccin del cdigo fuente. En un programa de un slo mdulo, es decir con un archivo con cdigo fuente, la directiva end debe siempre especificar el inicio del programa. En un programa que consiste de ms de un mdulo, slo la directiva end en el mdulo que contiene la primera instruccin a ejecutar debe llevar una etiqueta. En los otros mdulos la directiva end debe aparecer por s sola.

Bibliografa
1. Abel, Peter. Lenguaje Ensamblador y Programacin para PC IBM y Compatibles. Tercera Edicin. Prentice-Hall Hispanoamericana, S. A. Mxico. 1996.

ITSON

Manuel Domitsu Kono

30

Estructura de un Programa en Ensamblador

2. Borland Int. Turbo Assembler Reference Guide. Version 1. Borland International. Scotts Valley, CA. 1988. 3. Brey, Barry B. Los microprocesadores Intel: 8086/8088, 80186, 80286, 80386 y 80486. Arquitectura, programacin e interfaces. Tercera Edicin. Prentice-Hall Hispanoamericana, S. A. Mxico. 1995. 4. Godfrey, J. Terry. Lenguaje Ensamblador para Microcomputadoras IBM para Principiantes y Avanzados. Prentice-Hall Hispanoamericana, S. A. Mxico. 1991. 5. Hyde, Randall. The Art of Assembly Language Programming. Este libro se encuentra como una serie de documentod PDF en el siguiente servidor FTP: ftp.cs.ucr.edu/pub/pc/ibmpcdir 6. Swan, Tom. Mastering Turbo Assembler. Hayden Books. Indiana, U.S.A. 1989.

ITSON

Manuel Domitsu Kono

Вам также может понравиться