Resumen de Lenguaje ensamblador del procesador
REGISTROS INTERNOS DEL MICROPROCESADOR
La Unidad Central de Proceso (CPU, por sus siglas
en inglés) tiene 14 registros in-ternos
cada uno de 16 bits. Los
primeros cuatro, AX, BX, CX y DX, son de uso general y se pueden usar
también como registros de 8 bits. Es
decir, AX se puede
dividir en AH y AL (AH es el byte
alto, high, y AL es el byte
bajo, low) Lo mismo es
aplicable a los otros tres (BX en BH y BL, CX en CH y CL y DX en DH y DL)
Estos son los únicos registros que
pueden usarse de modo dual (en 8 o 16 bits)
Los registros de la CPU son conocidos por sus nombres propios, que son:
· AX (acumulador)
·
BX(registro base)
·
CX(registro contador)
·
DX(registro de datos)
·
DS(registro del segmento de datos)
·
ES(registro del segmento extra)
·
SS(registro del segmento de pila)
·
CS(registro del segmento de código)
·
BP(registro de apuntadores base)
· SI (registro índice fuente)
· DI (registro índice destino)
·
SP(registro del apuntador de pila)
· IP (registro del apuntador de siguiente instrucción)
· F (registro de banderas)
|
|
Significado de los bits:
|
||||
|
·
|
Overflow
|
|
|
|
NV = no hay desbordamiento
|
|
|
|
|
|
|
OV = Sí lo hay
|
|
·
|
Direction
|
|
|
|
UP = hacia adelante
|
|
|
|
|
|
|
DN = hacia atrás
|
|
·
|
Interrupts
|
|
|
|
DI = desactivadas
|
|
|
|
|
|
|
EI = activadas
|
|
·
|
Sign
|
|
|
|
PL = positivo
|
|
|
|
|
|
|
NG = negativo
|
|
·
|
Zero
|
|
|
|
NZ = no es cero
|
|
·
|
|
|
|
|
ZR = sí lo es
|
|
Auxiliary Carry
|
|
|
NA = no hay acarreo auxiliar
|
||
|
·
|
|
|
|
|
AC = hay acarreo auxiliar
|
|
Parity
|
|
|
|
PO = paridad non
|
|
|
|
|
|
|
|
PE = paridad par
|
|
·
|
Carry
|
|
|
|
NC = no hay acarreo
|
|
|
|
|
|
|
CY = sí lo hay
|
|
|
Significado de los bits:
|
||||
|
·
|
Overflow
|
|
|
|
NV = no hay desbordamiento
|
|
|
|
|
|
|
OV = Sí lo hay
|
|
·
|
Direction
|
|
|
|
UP = hacia adelante
|
|
|
|
|
|
|
DN = hacia atrás
|
|
·
|
Interrupts
|
|
|
|
DI = desactivadas
|
|
|
|
|
|
|
EI = activadas
|
|
·
|
Sign
|
|
|
|
PL = positivo
|
|
|
|
|
|
|
NG = negativo
|
|
·
|
Zero
|
|
|
|
NZ = no es cero
|
|
·
|
|
|
|
|
ZR = sí lo es
|
|
Auxiliary Carry
|
|
|
NA = no hay acarreo auxiliar
|
||
|
·
|
|
|
|
|
AC = hay acarreo auxiliar
|
|
Parity
|
|
|
|
PO = paridad non
|
|
|
|
|
|
|
|
PE = paridad par
|
|
·
|
Carry
|
|
|
|
NC = no hay acarreo
|
|
|
|
|
|
|
CY = sí lo hay
|
CONJUNTO DE INSTRUCCIONES (Microprocesadores 8086/8088)
Se pueden clasificar en los
siguientes grupos:
Instrucciones de Transferencia de
Datos.
Estas
instrucciones mueven datos de una parte a otra del sistema; desde y hacia la
me-moria principal, de y a los registros de datos, puertos de E/S y registros de
segmentación.
Las instrucciones de transferencia de
datos son las siguientes:
|
·
|
MOV
|
|
transfiere
|
|
·
|
XCHG
|
|
intercambia
|
|
·
|
IN
|
|
entrada
|
|
·
|
OUT
|
|
salida
|
|
·
|
XLAT
|
|
traduce usando una tabla
|
|
·
|
LEA
|
|
carga la dirección efectiva
|
|
·
|
LDS
|
|
carga el segmento de datos
|
|
·
|
LES
|
|
carga el segmento extra
|
|
·
|
LAHF
|
|
carga los indicadores en AH
|
|
·
|
SAHF
|
|
guarda AH en los indicadores
|
|
·
|
PUSH
|
FUENTE
|
(sp) ¬ fuente
|
|
·
|
POP
|
DESTINO
|
destino ¬ (sp)
|
Control de Bucles (instrucciones simples)
Éstas
posibilitan el grupo de control más elemental de nuestros programas. Un bucle
es un bloque de código que se ejecuta varias veces. Hay 4 tipos de bucles básicos:
o Bucles sin fin
o
Bucles por conteo o Bucles hasta
o Bucles mientras
Las instrucciones de control de
bucles son las siguientes:
|
·
|
INC
|
incrementar
|
|
|
|
|
·
|
|
|
|
||
|
DEC
|
decrementar
|
|
|||
|
·
|
|
|
|||
|
LOOP
|
realizar
|
un bucle
|
|||
|
·
|
|
|
|||
|
LOOPZ ,LOOPE
|
realizar
|
un bucle si es cero
|
|||
·
LOOPNZ,LOOPNErealizar
un bucle si no es cero
· JCXZ salta
si CX es cero
Instrucciones de Prueba,
Comparación y Saltos.
Este
grupo es una continuación del anterior, incluye las siguientes instrucciones:
|
·
|
TEST
|
verifica
|
|
|
|
|
·
|
|
|
|
||
|
CMP
|
compara
|
|
|||
|
·
|
|
|
|||
|
JMP
|
salta
|
|
|||
|
·
|
|
|
|||
|
JE, JZ
|
salta
|
si es igual a cero
|
|||
|
· JNE, JNZ
|
|
||||
|
salta
|
si no igual a cero
|
||||
|
·
|
|
|
|||
|
JS
|
salta
|
si signo negativo
|
|||
|
·
|
|
|
|||
|
JNS
|
salta
|
si signo no negativo
|
|||
|
· JP, JPE
|
|
||||
|
salta
|
si paridad par
|
||||
|
· JNP, JOP
|
|
||||
|
salta
|
si paridad impar
|
||||
|
·
|
|
|
|||
|
JO
|
salta
|
si hay capacidad excedida
|
|||
|
·
|
|
|
|||
|
JNO
|
salta
|
si no hay capacidad excedida
|
|||
|
· JB, JNAE
|
|
||||
|
salta
|
si por abajo (no encima o igual)
|
||||
|
· JNB, JAE
|
|
||||
|
salta
|
si no está por
abajo (encima o igual)
|
||||
|
· JBE, JNA
|
|
||||
|
salta
|
si por abajo o igual (no encima)
|
||||
|
· JNBE, JA
|
|
||||
|
salta
|
si no por abajo o igual (encima)
|
||||
|
· JL, JNGE
|
|
||||
|
salta
|
si menor que (no mayor o igual)
|
||||
|
· JNL, JGE
|
|
||||
|
salta
|
si no menor que (mayor o igual)
|
||||
|
· JLE, JNG
|
|
||||
|
salta
|
si menor que o igual (no mayor)
|
||||
|
·
|
|
|
|||
|
JNLE, JG
|
salta
|
si no menor que o igual (mayor)
|
|||
Instrucciones de Llamado y Retorno
de Subrutinas.
Para
que los programas resulten eficientes y legibles tanto en lenguaje ensamblador
co-mo en lenguaje de alto nivel, resultan indispensables las subrutinas:
|
·
|
CALL
|
llamada
|
a subrutina
|
|
|
·
|
|
|
||
|
RET
|
retorno
|
al programa o subrutina que llamó
|
||
Instrucciones Aritméticas.
Estas instrucciones son las que
realiza directamente el 8086/8088
a.
Grupo de adición:
|
·
|
ADD
|
suma
|
|
|
|
|
|
·
|
|
|
|
|
|
|
|
ADC
|
suma
|
con acarreo
|
||||
|
·
|
|
|
|
|||
|
AAA
|
ajuste ASCII para la
|
suma
|
|
|||
|
·
|
|
|
||||
|
DAA
|
ajuste decimal
para la
|
suma
|
||||
b.
Grupo de sustracción:
|
·
|
SUB
|
resta
|
|
|
|
|
|
·
|
|
|
|
|
|
|
|
SBB
|
resta
|
con acarreo negativo
|
||||
|
·
|
|
|
|
|||
|
AAS
|
ajuste ASCII para la
|
resta
|
|
|||
|
·
|
|
|
||||
|
DAS
|
ajuste decimal
para la
|
resta
|
||||
c.
Grupo de multiplicación:
|
·
|
MUL
|
multiplicación
|
|
|
|
·
|
|
|
|
|
|
IMUL
|
multiplicación
|
entera
|
||
|
·
|
|
|
||
|
AAM
|
ajuste ASCII para la
|
multiplicación
|
||
d.
Grupo de división:
|
·
|
DIV
|
división
|
|
|
|
·
|
|
|
|
|
|
IDIV
|
división
|
entera
|
||
|
·
|
|
|
||
|
AAD
|
ajuste ASCII para la
|
división
|
||
e.
Conversiones:
|
·
|
CBW
|
pasar
|
octeto a palabra
|
|
|
·
|
|
|
|
|
|
CWD
|
pasar
|
palabra a doble palabra
|
||
|
·
|
|
|
||
|
NEG
|
negación
|
|
||
f.
Tratamiento de cadenas:
Permiten el movimiento, comparación o
búsqueda rápida en bloques de datos:
|
·
|
MOVC
|
transferir
|
|
carácter de una cadena
|
|||
|
·
|
|
|
|
|
|
|
|
|
MOVW
|
transferir
|
|
palabra de una cadena
|
||||
|
·
|
CMPC
|
comparar carácter de una cadena
|
|||||
|
·
|
|
|
|
|
|
||
|
CMPW
|
comparar
|
palabra de una cadena
|
|||||
|
·
|
|
|
|
|
|||
|
SCAC
|
buscar
|
carácter de una cadena
|
|||||
|
·
|
|
|
|
|
|||
|
SCAW
|
buscar
|
palabra de una cadena
|
|||||
|
·
|
|
|
|
||||
|
LODC
|
cargar
|
carácter de una cadena
|
|||||
|
·
|
|
|
|
||||
|
LODW
|
cargar
|
palabra de una cadena
|
|||||
|
·
|
|
|
|||||
|
STOC
|
guardar
|
carácter de una cadena
|
|||||
|
·
|
|
|
|||||
|
STOW
|
guardar
|
palabra de una cadena
|
|||||
Instrucciones Lógicas.
Son operaciones bit a bit que trabajan
sobre octetos o palabras completas:
|
·
|
NOT
|
negación
|
|
||
|
·
|
|
|
|
||
|
AND
|
producto
|
lógico
|
|||
|
·
|
|
|
|||
|
OR
|
suma
|
lógica
|
|||
|
·
|
|
|
|||
|
XOR
|
suma
|
lógica exclusiva
|
|||
Instrucciones de Desplazamiento,
Rotación y Adeudos.
Básicamente permiten multiplicar y dividir por potencias de 2
|
· SHL, SAL
|
desplazar
|
a la izquierda (desplazamient o aritmético)
|
|||||
|
·
|
|
|
|
|
|
|
|
|
SHR
|
desplazar
|
a la derecha
|
|||||
|
·
|
|
|
|
|
|
||
|
SAR
|
desplazamiento
|
aritmético a la derecha
|
|||||
|
·
|
|
|
|
|
|||
|
ROL
|
rotación
|
a la izquierda
|
|||||
|
·
|
|
|
|
|
|||
|
ROR
|
rotación
|
a la derecha
|
|||||
|
·
|
|
|
|
|
|||
|
RCL
|
rotación
|
con acarreo a la izquierda
|
|||||
|
·
|
|
|
|
|
|||
|
RCR
|
rotación
|
con acarreo a la derecha
|
|||||
|
·
|
|
|
|
||||
|
CLC
|
borrar
|
acarreo
|
|||||
|
·
|
|
|
|||||
|
STC
|
poner
|
acarreo a 1
|
|||||
Instrucciones de Pila.
Una de las
funciones de la pila del sistema es la de salvaguardar (conservar) datos (la
otra es la de salvaguardar las direcciones de retorno de las llamadas a
subrutinas):
|
·
|
PUSH
|
introducir
|
|
|
|
·
|
|
|
||
|
POP
|
extraer
|
|
||
|
·
|
|
|
||
|
PUSHF
|
introducir
|
indicadores
|
||
|
·
|
|
|
||
|
POPF
|
extraer
|
indicadores
|
||
Instrucciones de Control del
microprocesador.
Hay varias instrucciones para el
control de la CPU, ya sea a ella sola, o en conjunción con otros procesadores:
|
·
|
NOP
|
no
operación
|
|||
|
·
|
|
|
|
|
|
|
HLT
|
parada
|
|
|
||
|
·
|
|
|
|
||
|
WAIT
|
espera
|
|
|
||
|
·
|
|
|
|||
|
LOCK
|
bloquea
|
|
|||
|
·
|
|
|
|||
|
ESC
|
escape
|
|
|||
Instrucciones de Interrupción.
|
·
|
STI
|
poner
|
|
a 1 el indicador de interrupción
|
||
|
·
|
|
|
|
|
||
|
CLI
|
borrar
|
el indicador de interrupción
|
||||
|
·
|
|
|
|
|||
|
INT
|
interrupción
|
|
||||
|
·
|
|
|
|
|||
|
INTO
|
interrupción
|
por capacidad excedida (desbordamiento)
|
||||
|
·
|
|
|
||||
|
IRET
|
retorno
|
de interrupción
|
||||
Iteraciones.
Con los saltos condicionales y no condicionales se pueden crear
estructuras de iteración bastante complejas, aunque existen instrucciones
específicas para ello tal como loop.
Esta instrucción es muy útil cuando se va a efectuar cierto bloque
de instruccio-nes un número finito de veces. He aquí un ejemplo:
CUENTA: DW, 100
.
..
MOV CX, CUENTA
ITERA:
.
.
LOOP ITERA
El bloque de instrucciones que se encuentra entre la etiqueta ITERA y la
instruc-ción loop será ejecutado
hasta que el registro CX sea igual a 0. Cada vez que
se eje-cuta la instrucción loop, el registro CX es decrementado
en 1 hasta llegar a 0. Esta ins-trucción tiene la limitante de que debe
encontrarse en el rango de +128 a –127 (máxi-mo número de bytes entre ITERA y loop)
Iteraciones
condicionales
Existen otras dos variantes de la instrucción loop. Las
instrucciones loope y loopz decrementan CX e iteran si CX = 0 y ZF = 1, mientras que loopne y looppnz
iteran si CX ¹ 0 y ZF ¹ 0. Un punto
importante es que al decrementarse CX las bande-ras NO RESULTAN
AFECTADAS. Por lo tanto, le corresponde a usted afectarlas dentro del bloque
de iteración.
FORMATO DE LAS INSTRUCCIONES
Cada instrucción en lenguaje
ensamblador del 8088 está compuesta de 4
cam-
pos:
etiqueta operación operando comentario
El campo comentario se utiliza para
propósitos de documentación y es opcional.
Campo
etiqueta: Una etiqueta debe comenzar
con un carácter alfabético y puede contener hasta 31 caracteres, incluyendo:
·
Letras de la A a la Z
·
Números del 0 al 9
·
Los símbolos especiales: - $ . @ %
No se puede
utilizar un nombre que coincida con una palabra reservada o directiva del
ensamblador. Si el nombre incluye un punto, entonces el pun-to debe ser el
primer carácter.
Campo operación: Contiene el nemotécnico de la instrucción, que es de 2 a 6 caracteres.
Campo operando: Contiene la posición o posiciones
donde están los datos que van a ser ma-nipulados por la instrucción.
Campo
comentario: Se utiliza para documentar el código
fuente del ensamblador. Debe sepa-rarse del último campo por al menos un
espacio e iniciar con
.
Cuando inicia un
comentario en una línea ésta deberá tener en la
pri-mera columna el carácter
.
MODOS DE DIRECCIONAMIENTO Y GENERACIÓN DEL CÓDIGO OBJETO
Generación de
la dirección de la instrucción.
Todos los registros
internos del 8086/8088 son de 16 bits.
El bus de dirección es de 20 bits, por lo que se usa más de un
registro interno para generar la dirección de
20
bits.
Los 2 registros usados para la dirección de la
instrucción son el IP y el CS. Se combinan en una forma especial para generar la dirección de 20 bits.
dirección de 20 bits = 1610 * CS + IP
Por ejemplo: Si los registros CS e IP contienen los valores:
CS = 1000H
IP = 0414 H
Campo DATA. Si el registro de destino es de 1 byte, el dato debe
estar en el segundo by-
te
de la instrucción. Si el destino es de una palabra, el segundo byte de la
instrucción son los 8 bits menos significativos (lsb) del dato, el tercer byte
de la instrucción son los 8 bits más
significativos (MSB) del dato. La siguiente
tabla, muestra los nemotécnicos 2 o 3
bytes
|
NEMOTÉCNICO
|
CÓDIGO OBJETO
|
|
|
MOV
|
AX, 568
|
Instrucción de
3 bytes
|
|
|
|
B8
|
|
|
|
68
|
|
|
|
05
|
|
MOV
|
AL, 56
|
instrucción de 2 bytes
|
|
|
|
B0
|
|
|
|
56
|
Bit D, MOD y R/M
En este ejemplo, moveremos datos desde memoria o moveremos un registro hacia o desde otro registro. Usaremos una instrucción como:
MOV AX, BX
Esta instrucción
es de 2 bytes porque no nos
referimos a memoria. Los bytes aparecerán como lo muestra la Figura E:
|
|
1000 10 DW
|
|
MOD REG R/M
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
1er BYTE
|
|
|
|
2do BYT E
|
|
|
|
|
|
|
|
|
||||
FIGURA E.
El primer byte
contiene los 2 bits menos significativos
como DW. El bit W es para word=1 o para byte=0. La D es para indicar
si el dato será almacenado
en el operando especifi-cado por los campos MOD y R/M (D = 0) o si va a ser
almacenado en el registro especifi-cado por el campo REG (D = 1)
La Figura F muestra las
asignaciones para MOD y R/M. Note en la descripción de MOD=11, el campo R/M es codificado
con un formato de registro. Este formato se mostró en la Figura D.
El ensamblador puede usar archivos fuente que contengan caracteres ASCII estándar. Considere que no todos
los procesadores de texto escriben archivos en disco usando solamente los
caracteres ASCII estándar. Antes de
ensamblar un programa verifique que esté en código ASCII.
Puede ver caracteres extraños en el programa. Muchos procesadores
de texto agregan información de formateo adicional en el archivo. El
ensamblador los trata como errores. Utilice la versión no documento de su
procesador de texto. También se requie-re una línea en blanco después de la
instrucción END
Para ensamblar el programa:
A>MASM PROGRAMA;
MICROSOFT ® MACRO ASSEMBLER VERSION 5.10
COPYRIGHT © MICROSOFT CORP 1981, 1988. ALL RIGHTS RESERVED
49822 + 219323 BYTES SYMBOL SPACE FREE
0 WARNING ERRORS
0 SEVERE ERRORS
A>
El ensamblador crea un archivo intermedio *.OBJ grama e información adicional usada por otro programa
dor>.
Encadenar al archivo *.OBJ
el
cual contiene nuestro pro-llamado LINKER <encadena-
A>LINK ARCHIVO;
Microsoft ® Overlay Linker Version 3.64
copyright © microsoft corp 1983-1988. All rights reserved
LINK : warning L4021: No Stack Segment
Hemos creado nuestro archivo sión *.COM. El archivo EXE2BIN.EXE BIN.
* .EXE. Ahora sí
necesitamos crear nuestra ver-del DOS convierte un
archivo EXE a un archivo
A>EXE2BIN ARCHIVO ARCHIVO.COM
A>
Etiquetas. Pueden tener hasta 31 caracteres y pueden contener letras, números y cuales-quiera de los siguientes símbolos:
¿
interrogación
.punto
@
arroba
_ subrayado
$ dólar
Las etiquetas no deben iniciar con un número decimal y el punto se utiliza sola-mente como el primer carácter.
Una de las
principales diferencias entre el DEBUG y el ensamblador reside en las etiquetas. Recuerde que con DEBUG debemos hacer
el cálculo nosotros. El en-samblador refiere a etiquetas y él calcula el
desplazamiento.
Cuando ponemos : después de una etiqueta, decimos que la etiqueta es cercana (NEAR). El término NEAR tiene que ver
con los segmentos.
Procedimientos en ensamblador
El ensamblador asigna direcciones a las instrucciones. Cada vez que
hacemos un cambio al programa, debemos ensamblar nuevamente dicho programa.
Considére-se el siguiente programa:
Comentarios
Publicar un comentario