Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
REGISTROS
Los registros de datos, como su nombre indica, contienen generalmente datos. (S, lo s, no
parecen gran cosa, pero es lo que hay) A veces se les llama "de propsito general", y la verdad
es que es un nombre ms apropiado, si bien un poco ms largo. Aunque tiene distinto nombre
cada uno de ellos, cuentan bsicamente con la misma funcionalidad, con algunas excepciones.
Determinadas operaciones por ejemplo la multiplicacin exige que los operandos estn en
registros especficos.
AX es a menudo llamado acumulador, ms por motivos histricos que por otra cosa.
BX se puede usar como registro base en algunos modos de direccionamiento, es decir,
para apuntar a posiciones de memoria con l.
CX es usado por algunas instrucciones como contador (en ciclos, rotaciones..)
DX o registro de datos; a veces se usa junto con AX en esas instrucciones especiales
mencionadas.
Cada registro de estos est dividido a su vez en dos registros de 8 bits, que pueden ser ledos o
escrito de manera independiente:
REGISTRO
AX
BX
CX
DX
HIGH
1111
1111
1111
1111
LOW
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
Aparte de los registros x8086 nos provee otros tipos de estructura como ser:
PILA: La pila o stack es bsicamente una estructura de almacenamiento para los registros antes
el almacenamiento era restringido a un mximo 7 registros almacenados, pero ahora con esto
ya no es tan restringido pudiendo la pila almacenar FFF9 registros en ella. Cabe mencionar que
la pila solo almacena registros de 16 bits y no as de 8 bits. Tambin vale la pena mencionar
que usa LIFO (Last In Fisrs Out) en su estructura. Con las aclaraciones mencionadas
anteriormente se sugiere manejar la pila con el menor de datos almacenados posible.
Para almacenar un registro en la pila se usa la siguiente sintaxis
push origen
Siendo:
push -> Una palabra reservada
origen -> El registro de origen
Siendo:
pop -> Una palabra reservada
destino -> registro destino donde se des empilara
VARIABLES
A veces requerimos almacenar algn valor en alguna variable o simplemente mostrar una
cadena en la consola para hacer cualquiera de estas opciones es necesario tener declarada una
variable la sintaxis para declarar una variable es la siguiente:
Identificador tipo valor
Siendo:
identificador -> un nombre para nuestra variable
tipo -> podran ser
db: Este define un byte lo que es lo mismo decir 8 bits. Lo que nos dice en otra
manera que solo podemos almacenar 8 bits en esta variable recordemos que un
registro est compuesta por 16 bits la mitad serian 8 bits entonces vale decir que el
mximo rango que se podr almacenar solo ser o lo que este en la parte Alta(*H) del
registro o en la parte baja(*L) o bien en otras palabras podra almacenar FF o su
equivalente en decimal 255 como mximo valor.
dw: Este define un Word lo que es lo mismo decir 16 bits. Entonces como mximo
valor podramos almacenar FFFF o su equivalente 65535. Toma todo el registro como
valor mximo.
NUMEROS
Cualquier operacin que se haga en los registros ser en hexadecimales, pero esto no infiere al
modo en cmo debemos declarar un nmero. Para declarar un numero como variable
necesitamos analizar ciertos puntos el numero ira creciendo? ser una constante?
Recordemos que un registro almacena valores de 8 bits (255) y 16 bits (65535) como mximo
entonces teniendo idea de eso podemos definir el tamao en memoria a almacenar
contador db 0
numero dw 4000
OPERACIONES BASICAS
MOVER(mov) : esta instruccin nos permite mover datos entre registros o tambin mover
variables a registros su sintaxis es la siguiente.
mov origen, destino
donde:
origen -> es el registro donde se tiene la informacin
destino -> es el registro el cual ira la informacin.
La mecnica es la siguiente: Se obtiene la informacin del origen, verifica si el destino es del
mismo tamao, si lo es borra lo que hay en el destino y remplaza por la informacin.
Nota
Cabe mencionar que el comando mov solo mueve registros del mismo tamao al igual que las
variables.
Ejemplos:
mov bx,0 -> Cuando hacemos esta instruccin lo que le decimos es mover al registro bx 0 algo a
tomar en cuenta es que toda operacin sobre los registros es en hexadecimales as que cualquier
valor que se mande que no sea un registro ser convertido a hexadecimal.
mov ax,10 -> En el registro ax despus de realizar este comando se tendr 000A
mov ax,10o -> En el registro ax se tendr lo siguiente 0008 porque estamos diciendo que en ax
se almacenara el valor 10 en sistema octal para decir que un nmero esta en base ocho tenemos
que poner un o al final del numero en este ejemplo 10o es 8 en hexadecimal.
mov ax,11101111b -> En el registro ax se tendr lo siguiente 00EF lo mismo que en el caso
anterior el nmero 11101111 que est en binario se convierte a hexadecimal y lo almacenara
en ax para que ensamblador se d cuenta que el nmero que estamos asignando esta en binario
tenemos que poner b al final del nmero.
mov ax,10h -> lo que tendremos en ax sera 0010 en este caso no convertir a hexadecimal
porque al poner h al final del numero decimos que el nmero es hexadecimal as que solo lo
mueve al registro ax
mov al,1d -> Al igual que en los otros casos especificamos que el numero esta en decimal con
la letra d como no es hexadecimal entonces se lo convierte en este caso al tendr el valor 01
Resta(sub)
Esta instruccin es utilizada para restar los valores de 2 registros sigue la misma sintaxis de add
y las mismas restricciones como ser que ambos deben ser del mismo tamao y el resultado se
almacena en registro 1.
sub resgistro1, registro2
Multiplicacin(mul)
Esta instruccin es especial como su nombre lo indica su nombre se encarga de realizar una
multiplicacin, pero su sintaxis es algo curiosa.
mul registro
como nos podemos percatar solo le pasamos un registro. En este punto podemos pensar si es
multiplicacin porque tan solo le paso un registro. Lo que ensamblador hace es multiplicar el
registro por ax o al segn sea el registro que se pas en mul hay que tener cuidado con esto un
ejemplo claro cuando tenemos en ax 0100 y en bx 000A y realizamos la instruccin mul bl la
consecuencia de este comando agarra el 10 de bl y lo multiplicara por al que en este caso ser
00 al hacer esta multiplicacin se borrara lo que hay en ax y se remplazara con el resultado de
la multiplicacin que seria 0000 pero aqu hay inconsistencia el resultado debi ser 0A00 es lo
que se esperaba el error esta en que escribimos mul bl estamos multiplicando registros de 8
bits y ax en esta instancia tiene mas de 8 bits exactamente 12 bits asi que solo agarrara la
parte de 8 bits de este y lo multiplicara lo que producir el error en el resultado entonces la
solucin a este problema es realizar una multipliacion a 16 bits poniendo bx en lugar de bl
cuando realizamos mul bx se multiplicaran registros de 16 bits recordemos que el maximo
rango que puede almacenar un registro de 32 bits es 65535 cuando la multiplicacin sobrepasa
este valor utiliza a dx como parte del resultado.
Divisin(div)
La divisin en ensamblador es parecida a la multiplicacin solo recibe un registro.
El tamao mximo del dividendo ser el tamao de bits que se desea dividir si es 8 bits ser
255 y si es 16 bits ser 65535.
Divisin 8 bits
1. En al se almacena el dividendo.
2. Nos aseguramos que en ah sea 0, si no fuera 0 podra formar parte del
dividendo y estara en contra de dividir 8 bits.
3. En bl ponemos el divisor.
4. Ejecutamos div bl
5. Luego de ejecutar la instruccin en ah estar el residuo y en al cociente.
Divisin 16 bits
1. En ax se almacena el dividendo
2. Limpiamos el registro dx si no lo hacemos podra haber inconsistencia en la
divisin porque tomara dx como parte del dividendo
3. En bx el divisor
4. Ejecutamos div bx
5. Luego de ejecutar la instruccin en dx estar el residuo y en ax el cociente
Manejo de cadenas
Como mencionamos anteriormente ensamblador provee 3 puntero a cadenas ahora
aprenderemos como usarlos.
AH
AL
1111
1111
AL
1111
1111
Ahora podemos darnos cuenta que cualquier valor que tenga al, ah o ax por ms que veamos
sus valores en hexadecimales por debajo son binarios
Veamos un ejemplo:
Ax
00
FF
As se ve cuando usamos la instruccin -> mov al,255 pero viendo ms detallado el registro lo
que se tiene es:
AX
0000
0000
1111
111
Ohh ahora todo tiene sentido. Cuando pensemos en convertir a binario ya no tenemos que
pensar en divisiones sucesivas, pero entonces como lo hacemos como mencionamos
anteriormente ensamblador nos provee ciertas instrucciones para este propsito las cuales
veremos ahora cabe mencionar que estas instrucciones hacen uso del flag Carry:
Corrimiento a la izquierda(SHL)
Para los ejemplos de aqu en adelante utilizaremos este como referencia.
Supongamos que en ax ejecutamos la siguiente instruccin -> mov ax,15
En ax quedara algo asi:
Ax
00
0F
0000
0000
0000
1111
Quiz en este ejemplo no se comprendi bien su funcionalidad haremos un ejemplo para ver
ms detalladamente suponiendo que en tengo esto en al:
AL
abcdefgh
Al ejecutar la instruccin anterior quedara asi:
AL
Carry
bcdefgh0
a
Ohh ahora ya se entiende mejor la teora como vemos a se desplaz a la izquierda en otras
palabras se sac el valor a y todos los dems recorrieron uno atrs y el ultimo se puso en 0.
Ahora como dijimos antes podemos colocar en cl la cantidad de veces que queremos que se
desplace supongamos que en el anterior ejemplo colocamos en cl 3 el resultado sera lo
siguiente:
AL
Carry
defgh000
c
Carry solo es 1 bit asi que a medida que se vaya haciendo el desplazamiento este se va
actualizando.
Desplazamiento hacia la derecha(shr)
Al igual que en la anterior instruccin hace exactamente lo mismo solo que esta vez hacia la
derecha basndonos en el ejemplo anterior. Cabe mencionar que tiene la misma sintaxis que
en la anterior instruccin el cual es:
shr destino, fuente
ahora si yo ejecuto la siguiente instruccin -> shr al, 1 tendr lo siguiente
AL
Carry
0abcdefg
h
Rotacin a la derecha(ror)
Esta instruccin tiene la misma sintaxis que las anteriores, pero con un efecto diferente como
bien indica su nombre es rotacin as que el efecto que hace sobre el registro es mover 1 hacia
la derecha los dems y al primer bit ira el ultimo del registro, al carry va el ultimo bit.
Si ejecuto la siguiente instruccin:
ror al,1
tendr lo siguiente
AL
Carry
habcdefg
h
Rotacin a la izquierda(rol)
Misma sintaxis que el anterior y mismo efecto que el ultimo mencionado solo que esta vez lo
har hacia la izquierda si ejecuto la siguiente instruccin
rol al,1
tendr lo siguiente
AL
Carry
bcdefgha
a
1
00000000
carry
Carry
0
10000000
Ahora
1
00000000
carry
Carry
0
00000001
Ahora
Saltos
Salto sin condicin(jmp)
Ensamblador nos ofrece una instruccin jmp el cual significa salto sin condicin se puede
colocar en cualquier parte del programa y lo que necesita es una etiqueta a donde saltara es
de carcter obligatorio que exista la etiqueta. Su sintaxis es la siguiente:
jmp etiquetaDestino
Saltos condicionales
Ensamblador ofrece una serie de instrucciones que se ejecutan baja cierta condicin el cual es
una comparacin entre registros se usa la siguiente sintaxis
cmp registro1,registro2
salto condicional
En donde:
registro1 y registro2 son del mismo tamao
salto condicional puede ser:
Instruccin
ja
Jb
jz
je
jae
jbe
Funcin
Salta si es mayor
Salta si es menor
Salta si es igual a zero
Salta si son iguales
Salta si es mayor igual
Salta si es menor igual
sintaxis
ja etiqueta
jb etiqueta
jz etiqueta
je etiqueta
jae etiqueta
jbe etiqueta
Su sintaxis es la siguiente:
EtiquetaIncio:
Instrucciones
loop EtiquetaInicio
Instruccin call:
Ahora que ya tenemos idea de cmo empezara a programar en ensamblador se nos viene a la
cabeza ideas como para leer un carcter necesito usar la interrupcin 21h y tengo que poner
en ah,01h ahora si quiero leer 4 nmeros tendra que repetir esto 4 veces y no habr alguna
forma de evitar esto. Pues el lenguaje ensamblador nos provee una instruccin que hace esto
el cual es denominado call, cuya funcin es hacer una llamada a un subproceso la sintaxis de
esta instruccin es la siguiente:
call etiquetaSubproceso
.
int 20h
etiquetaSubproceso:
conjunto de instrucciones
ret
la mecnica de call es la misma que la del santo incondicional solo que a diferencia de esta,
este tiene una instruccin ret que dice retornar de donde fue llamada esto es una gran ventaja
adems que nos permite hacer un salto a una etiqueta ejecutar el conjunto de instrucciones
que hay en ella y despus volver.
Macros:
Los macros en ensamblador no son ms que subprogramas que podemos usarlas en cualquier
parte del cdigo y no solo en nuestro cdigo actual sino tambin en otros cdigos la forma en
como utilizaremos este macro es haciendo un include del archivo que tiene los macros para
poder utilizar los macros contenidos en l. La sintaxis de un macro es la siguiente
macro identificador parmetros
esqueleto cdigo macro
endm
en donde: