You are on page 1of 72

Unidad II.

Programacin
Bsica
Temario
2.1 Ensamblador (y ligador) a utilizar 2.11 Obtencin de cadena con representacin
decimal
2.2 Ciclos numricos
2.12 Instrucciones lgicas
2.3 Captura bsica de cadenas
2.13 Desplazamiento y rotacin
2.4 Comparacin y prueba
2.14 Obtencin de una cadena con la
2.5 Saltos representacin hexadecimal
2.6 Ciclos condicionales 2.15 Captura y almacenamiento de datos
numricos
2.7 Incremento y decremento
2.16 Operaciones bsicas sobre archivos de disco
2.8 Captura de cadenas con formato
2.9 Instrucciones aritmticas
2.10 Manipulacin de la pila
Ensamblador (y ligador) a utilizar
Ensamblado
Un ensamblador es el programa que convierte un listado de cdigo fuente, escrito en un fichero
de texto, en cdigo objeto, es decir, lenguaje mquina (el que finalmente interpretar el
procesador) en el que slo le faltan las referencias a rutinas externas.
El cdigo fuente es un fichero que contiene la secuencia de instrucciones en lenguaje
ensamblador que forma el programa, as como ciertas directivas o comandos para el propio
ensamblador, que ha sido creado utilizando un editor de texto.
El cdigo objeto consta del cdigo en lenguaje mquina y de la informacin necesaria para
enlazarlo con otros mdulos objeto. Con TASM el proceso de ensamblado se realiza escribiendo
lo siguiente en la ventana de comandos:
Ensamblar un programa (sintaxis)
tasm /zi /l nombre
Donde:
nombre es el nombre del fichero .asm con el cdigo fuente. La extensin no
es necesaria ponerla.
los parmetros /zi y /l slo son tiles si queremos hacer un proceso de
depuracin (debug) con el Turbo Debugger.

Tras la ejecucin de esta lnea se nos crear un fichero nombre.obj


Linkado y montado
Los mdulos objeto resultantes del ensamblado, algunos de los cuales pueden estar
agrupados en libreras, deben ser enlazados para formar el mdulo de carga, antes de que
se pueda ejecutar el programa.

Adems de dar como salida el mdulo de carga, el linker o enlazador imprime un mapa de
memoria que indica donde sern cargados los mdulos objeto en la memoria.

Despus de crearse el mdulo de carga, ste es cargado por el cargador en la memoria del
ordenador y comienza la ejecucin.
Sintaxis linkado
Para linkar con TASM escribimos:
tlink /v nombre

Tras esto se nos crear el fichero ejecutable (.exe o .com) que el sistema
operativo se encargar de cargar en memoria cuando lo ejecutemos.
De nuevo, la extensin no es necesaria ponerla y el parmetro /v slo es til
para el Turbo Debugger.
Estructura Bsica de un Programa en
Ensamblador
Un programa en lenguaje ensamblador se compone de las siguientes
partes:

rea de comentarios
Definicin del modelo de memoria
rea de datos
Cuerpo del programa
CABECERA

El rea de comentarios sirve para incluir comentarios acerca


del programa que se est elaborando, comienza con la
directiva .COMMENT y el comentario es colocado entre dos
caracteres *.
.MODEL

Es una directiva, que selecciona uno de los 6 modos diferentes que


tiene Turbo Assembler el cdigo de un programa dependiendo del
tamao que tiene el cdigo y los datos.

Los seis modos son Pequeito (tiny), Pequeo (small), medio


(mdium), Compacto (compact), Grande (large) y Extenso (huge).
MODELO No. De Segmentos de Cdigo No. De Segmentos de Datos
TINY * *
SMALL 1 1
MEDIUM Mas de 1 1
COMPACT 1 Mas de 1
LARGE Mas de uno 1 Mas de uno
EXTENSO
STACK

Esta directiva reserva espacio de memoria para la pila del programa,


un rea de memoria que almacena valores temporales empleados
para las subrutinas y las direcciones de regreso de las subrutinas.
.DATA
Es el segmento de datos, y se declaran las variables del programa.

Esta directiva le indica al 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.
El rea de datos es el lugar donde deben ser declaradas las
constantes y variables del programa.

Las variables son declaradas despus de la directiva .DATA y


las constantes despus de .CONST.
Para declarar variables podemos utilizar las directivas:
DB define una variable de un byte,
DW define una variable de una palabra,
DD define una variable de tipo palabra doble
DQ define una variable de tipo palabra cudruple
.CODE - .END
En el cuerpo del programa es donde se colocan las
instrucciones en lenguaje ensamblador que se encargarn
de realizar las tareas deseadas.

El cuerpo del programa comienza con la directiva .CODE y


termina con la directiva END. Esta parte corresponde al
Begin y End de un programa de alto nivel.
Adicionalmente se debe indicar un punto de entrada al programa. El
punto de entrada se indica por medio de una etiqueta antes de la
primer instruccin real del programa.

En el ejemplo anterior el punto de entrada es INICIO: y el punto final


de las instrucciones se indica por medio de la instruccin END
INICIO.
Cuando se requiere comentar las instrucciones de un
programa, se debe colocar un punto y coma (;) y as el
ensamblador interpreta todo lo que sigue como un
comentario de una sola lnea.

Si requiere comentarios de ms de una lnea puede usar la


directiva .COMMENT.
Formatos de instrucciones
En el lenguaje ensamblador existen tres tipos de instrucciones:
instrucciones con dos operandos, instrucciones con un operando e
instrucciones con operandos implcitos.

El campo nemnico es ocupado por cualquiera de las instrucciones


que forman parte del conjunto de la familia x86.
Ejemplos:
Instruccin con dos operandos:
Mov AX,BX
En este caso Mov es el nemnico, AX es el operando 1 y BX es el operando 2.
Instruccin con un operando:
INC BX
En este caso INC es el nemnico y BX es el nico operando.
Instrucciones con operandos implcitos o sin operandos:
PUSHF
Donde PUSHF es el nemnico y nico elemento de la instruccin.
Instrucciones
El otro elemento que forma parte de cualquier programa
escrito en lenguaje de ensamblador son las instrucciones.

Al final de la instruccin podemos aadir un comentario


precedido del smbolo ;.
Los elementos entre [] son opcionales; por lo tanto,
el nico elemento imprescindible es el nombre de la
instruccin.
Etiquetas
Una etiqueta hace referencia a un elemento dentro del programa
ensamblador.

Su funcin es facilitar al programador la tarea de hacer referencia a


diferentes elementos del programa.

Las etiquetas sirven para definir constantes, variables o posiciones


del cdigo y las utilizamos como operandos en las instrucciones o
directivas del programa.
Ejemplo:

En este fragmento de cdigo hay


definidas tres etiquetas:
Servicio define una constante,
msg define una variable y
printHola define una posicin de
cdigo.
Las etiquetas para marcar posiciones de cdigo se
utilizan en las instrucciones de salto para indicar el
lugar donde se debe saltar y tambin para definir la
posicin de inicio de una subrutina dentro del cdigo
fuente.
Instrucciones Bsicas de Ensamblador
La instruccin esencial es MOV.

Ella translada datos de un lugar a otro (como el operador de


asignacin en un lenguaje de alto nivel). Toma dos
operandos:
mov dest, src
La instruccin ADD se usa para sumar enteros.
add eax, 4 ; eax = eax + 4
add al, ah ; al = al + ah
La instruccin SUB resta enteros.
sub bx, 10 ; bx = bx - 10
sub ebx, edi ; ebx = ebx - edi
Las instrucciones INC y DEC incrementan o decrementan
valores en uno. Ya que el uno es un operando implcito, el
cdigo de mquina para INC y el DEC es ms pequeo que
los de las instrucciones ADD y SUB.
inc ecx ; ecx++
dec dl ; dl--
USO DEL DEBUG
Para manejar el lenguaje ensamblador, es aconsejable conocer bsicamente la
arquitectura de la computadora, en especial cmo funciona el CPU.

Por tanto es necesario saber utilizar la herramienta DEBUG.COM que ofrece el MS-
DOS.

DEBUG es un programa que permite introducir o escribir pequeos programas en


ensamblador o lenguaje mquina.
Se pueden ejecutar instrucciones una a una (paso a paso), de esta manera
se pueden localizar y corregir errores en los programas.

Un "bug" (chinche, bicho, microbio, etc.) se denomina en informtica a un


error de programa (se dice que los errores de un programa "chinchan"). El
proceso de buscar, localizar y capturar "bugs" o errores, se denomina
debugging (depuracin), y de ah el nombre de DEBUG.
Nuestro objetivo con la herramienta DEBUG es introducir instrucciones en lenguaje
mquina e ir viendo cmo se van ejecutando, cmo se almacenan los resultados, dnde
deben estar los datos y el desarrollo de los procesos que determinan el funcionamiento del
computadora.

Esta herramienta nos ayudar a entender cmo funciona la mquina y, sobre todo, para
entender cmo funcionan las rdenes y las operaciones antes de incluirlas definitivamente
en un programa.
Ejecutar DEBUG
Para ejecutar DEBUG se pueden utilizar dos mtodos desde el
prompt del DOS:
1. DEBUG.- Ejecuta DEBUG en una nueva sesin
2. DEBUG nombre_archivo_EXE__COM.- Ejecuta DEBUG cargando en
memoria el archivo .EXE .COM que indiquemos como parmetro.

Al entrar en DEBUG, aparecer un guin en la parte izquierda, y, a su


derecha, un cursor. Este es el prompt de DEBUG, desde donde
introduciremos las rdenes correspondientes.
Comandos del DEBUG
El uso de DEBUG se rige bajo unos comandos especiales, los cuales
se escriben desde el prompt de DEBUG:
? (help) Ayuda.- muestra una lista con los comandos de DEBUG y su
uso.
Sintaxis: ?

Q (Quit).- salir de DEBUG.


Sintaxis: Q
Comandos del DEBUG
H (Hex).- Suma y resta los nmeros indicados como parmetros. DEBUG
trabaja siempre en formato hexadecimal, por lo que los nmeros a
introducir y los resultados se expresarn en dicho formato.

Sintaxis: H <nmero> <nmero>


Ejemplo:
-H 3 2
0005 0001
R (Register).- Muestra el contenido actual de los registros, permitiendo su
modificacin. Si no se especifica ningn parmetro visualiza el contenido de
todos los registros y banderas:
Sintaxis: R [nombre_registro]
Ejemplo:
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=3BD0 ES=3BD0 SS=3BD0 CS=3BD0 IP=0100 NV UP EI PL NZ NA PO NC
3BD0:0100 0000 ADD [BX+SI],AL
En la primera lnea se visualiza el contenido o el valor de los
registros de trabajo - o generales - (AX, BX, CX y DX), de los
registros punteros de pila (SP y BP) y de los registros ndice (SI y
DI).

En la segunda lnea se visualiza el contenido de los registros de


segmento (DS, ES, SS y CS), del registro puntero de instrucciones
(IP) y el valor de las banderas o indicadores.
Como se puede apreciar en el ejemplo, todos los segmentos
tienen el mismo valor o apuntan al mismo segmento de
memoria.

Esto se debe a que DEBUG trabaja normalmente con


archivos COM, y estos ocupan un nico segmento solapado
de 64 K, en el que los segmentos de datos, el de pila y el de
cdigo se encuentran aglutinados en el mismo segmento.
El registro puntero de instruccin vale 0100 (256 en decimal), se dice
que est apuntando a la primera instruccin de un programa, puesto
que los archivos COM poseen una cabecera de 255 bytes (de 0000 a
0099).

Los indicadores aparecen aqu codificados mediante la siguiente


tabla:
Si se especifica el nombre de un registro, muestra el valor o
contenido actual de ese preciso registro, y debajo el signo : (dos
puntos), invitando a introducir un nuevo valor para dicho registro. Si
no se introduce ningn valor, conserva su valor anterior.
Ejemplo:
-R AX
AX 0000
Para mostrar y/o modificar el valor de los indicadores se
indica una F (mayscula) como parmetro.
Ejemplo:
-R F
NV UP EI PL NZ NA PO NC -
E (Enter).- Muestra el contenido de la posicin de memoria indicada (se
introduce siempre la direccin relativa dentro del segmento actual),
permitiendo modificar dicho contenido con un nuevo valor.
Sintaxis: E<direccin>
Ejemplo:
-E 100
3BD0:0100 E4.01
-E 101
3BD0:101 85.D8
Los valores E4 y 85 son los antiguos valores que contenan
las direcciones 0100 y 0101, tras el punto, aparece un cursor
parpadeante y es aqu donde introduciremos el nuevo valor
del byte en esa posicin de memoria.
T (Trace).- Ejecuta una instruccin en la posicin actual (CS:IP), a no
ser que se indique otra. Tras la ejecucin, muestra el contenido de
los registros (como en la orden R), con el fin de analizar los
resultados y los efectos de la instruccin.
Sintaxis: T [<direccin>]

G (go).- Ejecuta un programa, detenindose en la direccin


especificada como parmetro.
Sintaxis: G [<direccin>]
U (unassemble).- Desensambla los cdigos de las direcciones de
memoria especificadas, es decir, que muestra un listado en
ensamblador equivalente a los cdigos encontrados. Por defecto,
desensambla desde la posicin actual (CS:IP), de 32 en 32 bytes.
Sintaxis: u [<rango>]
A (assemble).- Permite introducir directamente instrucciones o
sentencias en ensamblador, con el fin de crear rutinas o programas
en lenguaje mquina. El juego de sentencias del lenguaje mquina se
denomina mnemotecnia y, a las sentencias, mnemnicos.
Sintaxis: A[<direccin>]
Ejemplo:
-A
3DB0:0100 ADD AX,BX
3DB0:0102
Tras la direccin ofrece el cursor para introducir las instrucciones. Al
pulsar Return pasa a la siguientes, y as hasta que no introduzcamos
ninguna orden (directamente Return), volviendo al prompt.
N (name).- Asigna un nombre al archivo del programa. Esta orden
NO GUARDA EL PROGRAMA, SI NO QUE SOLO ASIGNA EL NOMBRE.
Sintaxis: N <nombre_archivo.COM>
-N PRUEBA.COM
W (write).- Guarda el programa en el archivo indicado con la orden N. Hay que
tener en cuenta que hay que asignar el nmero de bytes que ocupa el programa
en el par de registros BX:CX, lo cual se puede hallar rpidamente con la orden H,
indicando la direccin donde termina el programa y la direccin donde
comienza.
Sintaxis: W
Ejemplo:
-N PRUEBA.COM Aqu se asigna el nombre
-R BX A continuacin se asigna una longitud de archivo de 8 bytes
BX 0000
:0
-R CX
CX 0000
:8
-W Por ltimo, se guarda el archivo
Writing 0008 bytes
D (dump).- Vuelca o muestra el contenido de la memoria en
pantalla. No muestra instrucciones, slo muestra el contenido de las
celdas de memoria (valor de sus bytes).
Sintaxis: D [<intervalo>]
Los caracteres ASCII no imprimibles se representarn con un punto (.).
Los Registros CS e IP
El CS (Segmento de cdigo) + IP (Apuntador de instrucciones) Contiene la
primera direccin del segmento de cdigo de la memoria asignada a nuestro
programa.
Eso significa que si ensamblo un programa, entonces las instrucciones se
almacenarn a partir de la direccin B290 0B19:0100, esto ltimo significa
la direccin 0B19[0] + 0100.
Vemos que hay en la memoria en esas direcciones antes de ensamblar.
Ensamblamos un programa simple:

Podemos ver que:


mov ax,23 ocupa 3 direcciones de memoria: 0B19[0]+0100, 0B19[0]+0101, 0B19[0]+0102
mov bx,5a ocupa 3 direcciones de memoria: 0B19[0]+0103, 0B19[0]+0104, 0B19[0]+0105
add ax,bx ocupa 2 direcciones de memoria: 0B19[0]+0106, 0B19[0]+0107
Ahora verificaremos que las instrucciones mov ax,23 mov bx,5a
add ax,bx se hayan cargado en memoria.
Memoria despus de ensamblar el programa (Lo que ahora tiene):
Desensamblamos el programa:
Volvemos a verificar la memoria y nos damos cuenta que aunque
sabemos que el sistema operativo ya liber esas localidades, la
informacin se queda como basura:
Reiniciamos el ordenador y verificamos, al reiniciar, entonces el
programa que cargamos en memoria (las 3 instrucciones) debe de
desaparecer ya que al reiniciar, inicialmente la memoria sufre un
RESET.
Por qu si reinici tengo la misma informacin que cuando
comenc el proceso, antes de ensamblar?
Es evidente que cuando el sistema operativo arranca pone todas las
direcciones de memoria en 0000 entonces asigna este segmento a
otro programa y despus que termina de ejecutarse libera ese
segmento que ahora est listo para reasignarse, lo que provoca que
en ese segmento encuentre basura.
Esta particularidad puede variar en distintos ordenadores y con
distintos SOs.
Depurar un Programa
Utilizando el comando T vemos como depuramos el
programa. La primera T nos muestra como con el comando
mov ax,23 nos rellena el primer espacio de memoria que es
AX con el nmero 23. Y nos muestra que la siguiente
instruccin es mov bx,5a.
Volvemos a poner T y BX es igual al segundo comando que
es mov bx,5a :
Volvemos a poner el comando T, add ax,bx:

23+5A=7D
35+90=125

You might also like