Está en la página 1de 9

Programacin en lenguaje ensamblador/Primeros conceptos

1
Programacin en lenguaje ensamblador/Primeros
conceptos
Registros de la CPU
La UCP x86 tiene 14 registros internos y bsicos. Algunos son realmente de 32 bits pero por ahora se utilizar el
modo real que es compatible con el procesador 8086 (Igualmente accesibles a la parte alta de stos registros,
inclusive en el modo real). Los registros son los siguientes (stos registros son de 16 bits nombrados de la siguiente
manera, a excepcin del registro de banderas).
Registros de uso general
AX: Acumulador (AL:AH)
BX: Registro base (BL:BH)
CX: Registro contador (CL:CH)
DX: Registro de datos (DL:DH)
Registros de segmento (Solo se pueden usar para los usos mencionados a excepcin de ES)
DS: Registro del segmento de datos
ES: Registro del segmento extra
SS: Registro del segmento de pila
CS: Registro del segmento de cdigo
Registros punteros (Tambin pueden tener uso general)
BP: Registro de apuntadores base
SI: Registro ndice fuente
DI: Registro ndice destino
Registros especiales (Solo se pueden usar para los usos mencionados)
SP: Registro apuntador de la pila
IP: Registro apuntador de la siguiente instruccin
F: Registro de banderas (8 bits)
La parte baja del registro AX se llama AL y la parte alta AH. La parte baja del registro BX se llama BL y la parte
alta BH, y tambin ocurre lo mismo con el registro CX y DX.
Bits del registro de banderas
Overflow
NV (Apagado): No hay desbordamiento
OV (Encendido): Si lo hay
Direction
UP: Hacia adelante
DN: Hacia atras
Interrupts
DI: Desactivadas
EI: Activadas
Sign
PL: Positivo
NG: Negativo
Programacin en lenguaje ensamblador/Primeros conceptos
2
Zero
NZ: No es cero
ZR: Si lo es
Auxilary carry
NA: No hay acarreo auxiliar
AC: Hay acarreo auxiliar
Parity
PO: Impar
PE: Paridad par
Carry
NC: No hay acarreo
CY: Si lo hay
Sintaxis del lenguaje ensamblador
La sintaxis es la siguiente
Nombre de la instruccin Operando 1, Operando 2, Operando 3, Operando 4, ...
El nombre de la instruccin est formada por 2 o 3 letras, los operandos pueden ser registros, constantes o
direcciones de memoria. La cantidad de operandos depender de la instruccin.
Por ejemplo:
MOV AL, [1000]
Esta instruccin indica que se copie el valor de la porcin de la memoria que est en la ubicacin 1000 (En
hexadecimal) a la parte baja del registro AX (AL). Cuando un operando es un valor de una direccin de memoria,
sta direccin se escribe entre corchetes, recordar que el operando 1 es el destino y el operando 2 es el origen. Y
cuando es una constante depender del ensamblador, en el caso del debug (Un programa que sirve para crear y editar
aplicaciones que viene con el DOS) se interpretarn como hexadecimales, en los siguientes ejemplos se interpretar
que las constantes son nmeros hexadecimales.
Tambin se puede tomar un valor de la memoria apuntado por un registro, por ejemplo:
MOV AL, [DI]
DI est apuntado al valor que est en la memoria que ser copiado al registro AL. El nombre MOV viene de la
palabra move, que es una palabra del ingles que significa mover. Justamente la instruccin mencionada significa,
mover el valor apuntado por DI a AL.
Tambin se puede copiar el valor de un registro a otro
MOV AL, BL
En este caso se copia el valor de BL a AL
Igualmente se puede copiar el valor de la parte baja de un registro a la parte alta de otro registro
MOV CH, DL
As como tambin operar con las partes altas
MOV AH, DH
Inclusive se puede copiar el valor de un registro a una direccin de memoria
MOV [1000], AL
Igualmente apuntada la direccin de memoria a DI
Programacin en lenguaje ensamblador/Primeros conceptos
3
MOV [DI], AL
Y tambin con los registros completos (Solamente completos en el procesador 8086)
MOV AX, DX
Tambin trabajar con los registros completos para todos los procesadores de 32 bits
MOV EBX, EDX
En ste caso mueve la totalidad del registro DX a la totalidad del registro BX, en ste caso se est trabajando con los
registros en forma extendida (32 bits), pero hay que tener precaucin ya que el procesador 8086 no interpretar
correctamente sta instruccin (El procesador 8086 es obsoleto por sta desventaja y otras ms, por ejemplo slo
puede direccionar 1 MB), adems el debug no puede interpretar sta instruccin.
No se puede realizar lo siguiente porque no se pueden pasar valores en la memoria sin la intervencin de un registro,
adems no se ha especificado el tamao
MOV [1000], [2000]
Igualmente no se puede hacer lo siguiente
MOV [DI], [1000]
As como tambin lo siguiente
MOV [DI], [SI]
Sin embargo lo siguiente es correcto
MOV [1000], AX
Pero no lo siguiente porque no se est especificando el tamao
MOV [SI], 1F
Lo correcto sera lo siguiente
Si se quiere transferir un byte
MOV byte [SI], 1F
Si se quiere transferir una palabra (16 bits)
MOV word [SI], 1F
Si se quiere transferir una doble palabra (32 bits)
MOV dword [SI], 1F
Direccionamientos
Dado que es necesario transferir datos existen los siguientes tipos de direccionamiento.
Valor de un registro Ejemplo: MOV AX, DX
Constante Ejemplo: MOV BX, 1AB
Valor apuntado por una constante Ejemplo: MOV AX, [1000]
Apuntado por un registro de segmento y uno de offset (Solo puede ser BX, BP, DI o SI) Ejemplo: MOV CX,
ES:[DI]
Apuntado por DS y la suma de BX con una constante o apuntado por SS y la suma de BP con una constante
Ejemplo: MOV DX, DS:[BP+1000]
Apuntado por DS y la suma de DI o SI con una constante Ejemplo: MOV BX, DS:[SI+6F9]
Apuntado por DS y la suma de BX y SI o BX y DI con una constante o apuntado por SS y la suma de BP y SI o
BP y DI con una constante
Ejemplos
MOV AX, DS:[BX][SI]+1FB9
Programacin en lenguaje ensamblador/Primeros conceptos
4
MOV DX, SS:[BP][DI]+C9F8
El primer programa
ste programa sumar 1000 + 2000 y volcar el resultado en AX
En DOS, en el smbolo de sistema, escribir Cls y luego Debug. Aparecer un guin (De sta manera se inicia el
debug, con el comando Debug).
Escribir "A 0100" y presionar la tecla Enter. "A" es una orden del debug que permite ensamblar instrucciones a
partir de una direccin (Normalmente se empieza en la direccin 0100h), el Debug generalmente utiliza nmeros
hexadecimales.
Aparecer lo siguiente ("xxxx" es el segmento en donde est el programa, aparecer un nmero en ste lugar, que
ser el valor de CS).
-A 0100
xxxx:0100
Escribir las siguientes instrucciones en assembler
MOV AX, 1000
MOV BX, 2000
ADD AX, BX
INT 20
Presionar la tecla Enter
Escribir "p 0100" (Con sta orden se ejecuta el programa y se mostrarn los sucesivos cambios de los registros).
Luego aparece "el programa ha terminado de forma normal" o "Program terminated normally".
Luego (Al terminar el programa), antes del mensaje que indica el fin del programa, aparece lo siguiente (Bloque de
estado):
AX=3000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=XXXX ES=XXXX SS=XXXX CS=XXXX IP=0108 NV UP EI PL NZ NA PE NC
0CB3:0108 CD20 INT 20
El Debug muestra el estado de los registros antes de ejecutar la instruccin que muestra en el bloque de estado.
El programa hace lo siguiente
La instruccin MOV AX, 1000 ordena que AX tome el valor de 1000.
La instruccin MOV BX, 2000 ordena que BX tome el valor de 2000.
La instruccin ADD AX, BX ordena que AX sea sumado con BX
Por lo tanto es lgico que AX tenga el valor 3000 luego de la instruccin "ADD AX, BX", ya que se le sum a AX el
valor de BX.
La instruccin INT 20 ordena provocar una interrupcin que es 20h, que le cede el control a DOS, y DOS termina el
programa. Una interrupcin es una interrupcin de la ejecucin de un programa para realizar una determinada tarea,
a veces el control no vuelve al programa original (Por ejemplo en el caso de INT 20h en el DOS).
Las interrupciones pueden ejecutarse por las circunstancias ms variadas, por ejemplo el usuario presiona una tecla y
sto provoca una interrupcin y se ejecuta las instrucciones del controlador de teclado y almacena la tecla
presionada, luego le devuelve el control al programa original (Con una instruccin sin operandos llamada IRET).
Cuando ocurre una interrupcin se empuja a la pila CS e IP, y stos 2 registros se modifican para apuntar a la rutina
deseada. Los valores de stos 2 registros estn almacenados en la tabla de vectores de interrupcin (sta est ubicada
en el comienzo de la memoria en 0000:0000). Para encontrar stos 2 valores (Llamado vector de interrupcin), se
Programacin en lenguaje ensamblador/Primeros conceptos
5
multiplica el nmero de interrupcin por 4 (El offset), y se lee 4 bytes en el offset mencionado y en el segmento
0000. Los primeros 2 bytes (El primer word) del vector de interrupcin es el offset (IP), y los 2 restantes (El segundo
word) es el segmento (CS).
En el caso de la interrupcin 20h fue provocada por el mismo programa, para evitar interrupciones que no sean
provocadas por el programa se utiliza la instruccin CLI y para luego activarlas se utiliza STI, pero no se pueden
enmascarar las interrupciones menores de 8 ya que no son enmascarables. Hay que tener en cuenta que en la
arquitectura x86, el microprocesador almacena en la memoria, desde los bytes menos significativos hasta los ms
significativos (Si no se tiene en cuenta sto puede haber misteriosos fallos del programa que se est programando).
Por lo tanto en un vector de interrupcin, el primer word (Palabra) contiene el valor que se le asignar a IP (Offset),
el segundo word contiene el valor que se le asignar a CS (Segmento), cuando se provoque la interrupcin del
correspondiente vector.
Hola mundo
ste programa mostrar "Hola mundo" en la pantalla, utilizando servicios de DOS.
Se entra al Debug y se escribe lo siguiente (Sin utilizar la orden ensamblar)
E 1000 'Hola mundo$'
"E" significa escribir, se escribe en el segmento de datos (Indicado por DS). La sintaxis de sta orden del debug es la
siguiente:
E Offset '[Cadena de carcteres]'
El carcter "$" que est a la derecha de la frase "Hola mundo", sirve para que el servicio de DOS que se va a utilizar
para mostrar Hola mundo en la pantalla no muestre informacin ms alla del caracter que est a la izquierda del
caracter '$', es decir ste caracter limitador es el fin de la cadena, es decir a partir de ste no mostrar ms caracteres.
Importante: Si no finaliza la cadena con el carcter '$', al llamar al servicio de DOS para mostrar el caracter,
probablemente se bloquear la PC hasta encontrar un carcter '$', inclusive puede ser que nunca lo encuentre.
A continuacin ensamblar las siguientes instrucciones (A partir de 0100h):
MOV AH, 09
MOV DX, 1000
INT 21
INT 20
Luego ejecutar el ejemplo con la orden "g"
El programa mostrar el mensaje "Hola mundo", luego el debug mostrar un mensaje diciendo que el programa ha
terminado normalmente.
Al provocar la interrupcin 21h se llama a un servicio de DOS, el nmero de servicio est determinado por la parte
alta de AX (AH).
El servicio 09h muestra la informacin en forma de carcteres a partir del comienzo apuntado por el registro DX (El
offset, en ste caso 1000h), muestra la informacin hasta el carcter anterior al carcter '$' (Anteriormente
mencionado).
Luego se provoca la interrupcin 20h que finaliza el programa.
La orden escribir del debug tambin acepta bytes individuales, por ejemplo:
E 3000 0, BF, 5F, C4
Tambin acepta en forma mixta (Bytes individuales y cadenas de carcteres)
E 3000 'JRJGOR', 0, 21, 'Ejd', 2F
Programacin en lenguaje ensamblador/Primeros conceptos
6
Es decir la orden ensamblar est acompaada del offset de los datos a escribir y de los items.
Un item puede ser un byte individual o una cadena de carcteres (Que sta ltima debe estar entre simples comillas).
Saltos incondicionales y condicionales
A veces un programa debe cambiar el flujo del programa en forma incondicional o bajo una condicin (Para tomar
una decisin), por lo tanto debe haber instrucciones que permitan cambiar el flujo de un programa sin ningn
requisito, o en caso de que una condicin se cumpla. Existen instrucciones para ste propsito. Son las instrucciones
de saltos incondicionales y condicionales, que saltan a un determinado punto si se cumpla la condicin.
Saltos incondicionales
La nica instruccin que existe para ste fin es JMP (Abreviatura de JUMP, que significa en ingls SALTAR). La
sintaxis es la siguiente.
JMP XXXX
XXXX: Es la ubicacin de la instruccin en donde se continuar el programa (A partir de sta se ejecutan las
siguientes).
Ejemplo:
XXXX:0100 MOV AX, 1000
XXXX:0103 JMP 0107
XXXX:0105 XOR AX, AX
XXXX:0107 INT 20
En ste caso al ejecutarse la instruccin de salto incondicional (JMP), se contina la ejecucin a partir de la
instruccin (INT 20h), no ejecutandose la instruccin XOR (sta instruccin realiza la operacin XOR de el
operando 2 sobre el operando 1) que provocara el borrado de registro AX (Que provocara que AX tome el valor 0),
si se ejecuta.
Es decir, se ejecutan las siguientes instrucciones:
MOV AX, 1000
JMP 0107
INT 20
No se ejecuta "XOR AX, AX" por el salto incondicional.
El operando puede ser una direccin constante (Por ejemplo 0107), un salto a nivel de offset, tambin puede ser un
salto largo (Que cambie los valores de los registros CS e IP), (Por ejemplo FFFF:0000, que salta al ROM BIOS).
Tambin puede ser el valor de un registro, por ejemplo:
JMP DI
En ste caso salta a la instruccin apuntada por DI.
Tambin puede ser un valor apuntado por un registro puntero, por ejemplo:
JMP [SI]
En ste caso salta a la instruccin apuntada por el valor apuntado por SI.
El operando puede ser cualquier direccionamiento vlido (Puede ser cualquiera de los direccionamientos utilizados
en el operando origen de la instruccin MOV, explicados anteriormente).
Programacin en lenguaje ensamblador/Primeros conceptos
7
Comparaciones
Saltos condicionales
Son similares a JMP en la sintaxis, pero la diferencia es el nombre.
Las instrucciones son las siguientes:
JE o JZ: Salta si est prendido el bit Zero del registro de banderas.
Objetivo: Saltar si la ltima comparacin realizada da igual.
JA o JNBE: Salta si el bit carry (CF) o el bit zero (ZF) del registro de banderas est desactivado.
Objetivo: Saltar si la ltima comparacin realizada con nmeros naturales da mayor.
JB o JNAE: Salta si CF est activada.
Objetivo: Saltar si la ltima comparacin realizada con nmeros naturales da menor.
JG o JNLE: Salta si ZF es cero o si OF y SF son iguales.
Objetivo: Saltar si la ltima comparacin realizada con nmeros enteros da mayor.
JL o JNGE: Saltar si SF es diferente a OF
Objetivo: Saltar si la ltima comparacin realizada con nmeros enteros da menor.
JC: Saltar si CF est prendida
Objetivo: Saltar si hay acarreo
JO: Saltar si OF est prendido
Objetivo: Saltar si hay desbordamiento
JP: Saltar si PF est prendido
Objetivo: Saltar si hay paridad
JS: Saltar si SF est prendido
Objetivo: Saltar si es negativo
JNE o JNZ: Comportamiento inverso a JE o JZ
JNA o JBE: Comportamiento inverso a JA o JNBE
JNB o JAE: Comportamiento inverso a JB o JNAE
JNG o JLE: Comportamiento inverso a JG o JNLE
JNL o JGE: Comportamiento inverso a JL o JNGE
JNC: Comportamiento inverso a JC
JNO: Comportamiento inverso a JO
JNP o JPO: Comportamiento inverso a JP
JNS: Comportamiento inverso a JS
Hay otras instrucciones que hacen saltos condicionales, pero que no necesitan la instruccin CMP, son las siguientes:
JCXZ: Salta si el registro CX es cero.
LOOP: Decrementa CX, restndole 1 y salta si CX es distinto de cero.
Objetivo: Hacer un bucle, utilizando como contador CX
LOOPE: Decrementa CX en 1 y salta si CX es distinto de cero y ZF est prendido.
Objetivo: Hacer un bucle, utilizando como contador CX y terminar si el contador llega a cero, o se apaga el bit Zero.
LOOPNE: Decrementa CX en 1 y salta si ZF est prendido
Objetivo: Hacer un bucle que siga funcionando hasta que se apague el bit Zero.
Programacin en lenguaje ensamblador/Primeros conceptos
8
La sintaxis de stas instrucciones son similares a la instruccin JMP, lo nico que cambia es el nombre.
Instruccin genrica para comparar
La instruccin es CMP, sta permite comparar 2 operandos, la sintaxis es la siguiente:
CMP <Operador 1>, <Operador 2>
El operador 1, se compara con el 2.
Los operandos pueden ser cualquier direccionamiento vlido, cumpliendo las reglas de la instruccin MOV con
respecto a los operandos.
sta instruccin compara 2 operandos y luego cambia el registro de banderas en base al resultado de la comparacin.
Fuentes y contribuyentes del artculo
9
Fuentes y contribuyentes del artculo
Programacin en lenguaje ensamblador/Primeros conceptos Fuente: http://es.wikibooks.org/w/index.php?oldid=145187 Contribuyentes: ESTUDIANTE, Jarisleif, Maribelita, Morza, 5
ediciones annimas
Licencia
Creative Commons Attribution-Share Alike 3.0 Unported
//creativecommons.org/licenses/by-sa/3.0/

También podría gustarte