Ir al contenido principal

Lenguaje Ensamblador Del Microprocesador 8086


La información que se presenta en esta página fue tomada del siguiente documento: https://www.ittux.edu.mx/sites/default/files/MICROCOMPUTADORAS_AL_DETALLE.pdf
agradeciendo que hayan compartido el conocimiento y reiterando que la información le pertenece a: LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS.
Registros
El “CPU” tiene 14 registros internos cada uno de 16 bits para uso general.
·         Acumulador: AX
o   Parte alta: AH
o   Parte baja: AL
·         Registro Base: BX
o   Parte alta: BH
o   Parte baja: BL
·         Registro contador: CX
o   Parte alta: CH
o   Parte baja: CL
·         Registro de datos: DX
o   Parte alta: DH
o   Parte baja: DL
Nombres de los 14 registros:
AX: Acumulador
Se usa para almacenar resultados lecturas o escrituras desde o hacia los puertos.
BX: Registro base
Sirve como apuntador base o índice.
CX: Registro contador
Se utiliza en operaciones de iteración, como un contador que automáticamente se incrementa o decrementa de acuerdo con el tipo de instrucción usada.
DX: Registro de datos
                Se usa como puente para el acceso de datos.
DS: Registro del segmento de datos
Es un registro de segmento cuya función es actuar como un indicador para saber donde se encuentran los datos. Ya sea una variable inicializada o no.
ES: Registro del segmento extra
Tiene el propósito general de permitir operaciones sobre cadenas, pero también puede ser una extensión de DS.
SS: Registro del segmento de pila
Tiene la tarea de manejar la posición de memoria donde se encuentra la pila (“Stack”) es una estructura que guarda datos de forma temporal tanto en un programa como en el pc.
En términos de operación interna la UCP usa este segmento para almacenar a los llamados de rutina.
CS: Registro del segmento de código
Es aquí donde se encuentra el código ejecutable de cada programa el cual esta ligado a los diferentes modelos de memoria.
BP: Registro de apuntadores base
                Se usa para manipular la pila sin afectar al registro de segmento SS.
SI: Registro índice fuente
                Representa la dirección donde se encuentra la cadena.
Di: Registro índice destino
                Donde será copiada la cadena.
SP: Registro del apuntador de pila
Apunta a un área especifica de memoria que sirve para almacenar datos bajo la estructura LIFO conocida como pila(“Stack”).
IP: Registro del apuntador de siguiente instrucción
                Apunta a la siguiente instrucción que será ejecutada en memoria.
F: Registro de banderas
                Contiene dos grupos:
o   Banderas apagadas
o   NV, UP, DI, PL, NZ, NA, PO, NC
o   Banderas
o   OV, DN, EL, NG, ZR, AC, PE, CY
A continuación, se describe cada bit:
·         Desbordamiento (Overflow):
o   NV: no hay desbordamiento
o   OV: si lo hay
·         Dirección (Direction):
o   UP: hacia a delante
o   DN: hacia atrás
·         Interrupción (Interrupts):
o   DI: desactivadas
o   EI activadas
·         Signo (Sign):
o   PL: positivo
o   NG: negativo
·         Cero (Zero):
o   NZ: no es cero
o   ZR: si lo es
·         Acarreo auxiliar (Auxiliar carry):
o   NA: no hay acarreo auxiliar
o   AC: hay acarreo auxiliar
·         Paridad (Parity):
o   PO: paridad non
o   PE: paridad par
·         Acarreo (Carry):
o   NC: no hay acarreo
o   CY: si lo hay
Banderas
PSW
Contiene 9 banderas, 3 banderas de control TF, DF, IF y 6 banderas de estatus CF, PF, AF, ZF, SF y OF.
Estas 6 ultimas banderas representan el resultado de una operación aritmética o lógica. Permiten al programa alterar el curso de ejecución basado en os valores lógicos que almacenan.
·         Bandera CF
o   Esta en = 1, cuando a ocurrido un “llevar” o “pedir préstamo” del resultado (8 o 16 bits).
·         Bandera OF
o   Sobre flujo = 1 indica que ha ocurrido un sobre flujo aritmético. Esto significa que el tamaño del resultado excede la capacidad de almacenamiento del destino y el digito significativo se perdió.
·         Bandera SF
o   Esta bandera se activa cuando el bit mas significativo del resultado es 1. Ya que los números binarios negativos son representados usando notación c2; SF refleja el signo del resultado: 0 indica +; 1 indica -.
·         Bandera PF
o   Cuando esta bandera esta activa, resultado de la operación tiene un numero par de unos, esta bandera se usa para verificar errores en la transmisión.
·         Bandera ZF
o   Esta bandera se activa cunando el resultado de la operación es cero.
·         Bandera DF
o   Bandera de dirección
·         Bandera IF
o   Bandera de interrupción
·         Bandera TF
o   Bandera de trampa

Instrucciones de transferencia de datos
Estas instrucciones mueven datos de una parte a otra del sistema; desde y hacia la memoria principal y a los registros de datos, puertos de E/S y registros de segmentación.
·         MOV: Transfiere
·         XCHG: Intercambia
·         IN: Entrada
·         OUT: Salida
·         XLAT: Traduce usando una tabla
·         LEA: Carga de dirección efectiva
·         LDS: Carga el segmento de datos
·         LES:  Carga del 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
Hay 4 tipos de bucles básicos:
·         Bucles sin fin
·         Bucles por conteo
·         Bucles hasta
·         Bucles mientras

·         INC: Incrementar
·         DEC: Decrementar
·         LOOP: Realizar un bucle
·         LOOPE, LOOPZ: Realizar un bucle si es cero.
·         LOOPNZ, LOOPNE: Realizar bucle si no es cero.
·         JCXZ: Salta si CX es cero.

Instrucciones de prueba, comparación y saltos
Este grupo es una continuación de lo 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.
·         CALL: Llamada a subrutina
·         RET: Retorno al programa o subrutina que llamo.
Instrucciones aritméticas
Procesador 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 una 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
·         REP: Repetir
·         CID: Poner a 0 el indicador de dirección
·         STD: Poner a 1 el indicador de dirección
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 (desplazamiento 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

J
Jump
N
Not
L
Less
G
Great
E
Equal
Z
Zero
A
Above
B
Below




1. Instrucciones usadas para comparar dos enteros sin signo:
a)       JA o JNBE. Salta si está arriba o salta si no está abajo o si no es igual (jump if above o jump if not below or equal) El salto se efectúa si la bandera ce CF = 0 o si la bandera de ZF = 0
b)      JAE o JNB. Salta si está arriba o es igual o salta si no está abajo (jump if above or equal o jump if not below) El salto se efectúa si CF = 0.
c)       JB o JNAE. Salta si está abajo o salta si no está arriba o si no es igual (jump if below or equal o jump if not above or equal) El salto se efectúa si CF = 1.
d)      JBE o JNA. Salta si está abajo o si es igual o salta si no está arriba (jump if below or equal jump if not above) El salto se efectúa si CF = 1.
e)      JE o JZ. Salta si es igual o salta si es cero (jump equal o jump if zero) El salto se efectúa si ZF = 1 (también se aplica a comparaciones de enteros con signo)
f)        JNE o JNZ. Salta si no es igual o salta si no es cero (jump if not equal o jump if not zero) El salto se efectúa si ZF = 0 (también se aplica a comparaciones de enteros con signo)

2. Instrucciones usadas para comparar dos enteros con signo:
a)       JG o JNLE. Salta si es más grande o salta si no es menor o igual (jump if greater o jump if not less or equal) El salto se efectúa si ZF = 0 o OF = SF.
b)      JGE o JNL. Salta si es más grande o igual o salta si no es menor que (jump if greater or equal o jump if not less) El salto se efectúa si SF = OF.
c)       JL o JNGE. Salta si es menor que o salta si no es mayor o igual (jump if less o jump if not greater or equal) El salto se efectúa si SF = OF.
d)      d. JLE o JNG. Salta si es menor o igual o salta si no es más grande (jump if less or equal o jump if not greater) El salto se efectúa si ZF = 1 o SF = OF.
3. Instrucciones usadas según el estado de banderas:
a)       JC Salta si hay acarreo (jump if carry) El salto se efectúa si CF = 1.
b)      JNC Salta si no hay acarreo (jump if not carry) El salto se efectúa si CF = 0.
c)       JNO Salta si no hay desbordamiento (jump if not overflow) El salto se efectúa si OF = 0.
d)      JNP o JPO Salta si no hay paridad o salta si la paridad en non. El salto se efectúa si PF = 0.
e)      JNS Salta si el signo está apagado (jump if not sign) El salto se efectúa si SF = 0.
f)        JO Salta si hay desbordamiento (jump if overflow) El salto se efectúa si OF = 1.
g)       JP o JPE Salta si hay paridad o salta si la paridad es par (jump if parity o jump if parity even) El salto se efectúa si PF = 1.
h)      JS Salta si el signo está prendido (jump if sign set) El salto se efectúa si SF = 1.
Notación mate
Con signo
Sin Signo
> 
JG
JNLE
JA
JNBE
< 
JL
JNGE
JB
JNAE
>=
JGE
JNL
JAE
JNB
<=
JLE
JNG
JBE
JNA
=
JE
JZ
¡=
JNE
JNZ



Direccionamientos
v  Inmediato:
Mueve un valor constante a un registro interno
MOV AX, 568
v  Registro:
Indica que el operando a ser usado este contenido en uno de los registros internos de propósito general de la UCP.
Registros generales pueden ser de 8/16 bits
MOV AX, BX; AX almacena una copia del valor de BX
MOV AL, BL; AL almacena una copia del valor de BL
v  Directo:
El operando esta en memoria. La dirección efectiva del operando se indica directamente en la instrucción. El otro operando tiene que ser un registro.
Supongamos que en el segmento DATA esta VECTOR DB “YO”
MOV AH, VECTOR
MOV BX, [100H]
v  Indirecto:
El operando está en memoria. La dirección efectiva viene dada por el contenido de un registro base (BX, BP) o un registro índice (SI, DI)
MOV AX, [SI]
MOV CL, [BX]
v  Relativo a la base:
El operando está en memoria la dirección efectiva viene dada por el contenido de un registro base (BX, BP) más un desplazamiento constante.
MOV AL, [BX+1]
MOV CL, VECTOR[BX]
v  Indexado directo:
El operando está en memoria la dirección efectiva viene dada por el contenido de un registro índice (SI, DI) más un desplazamiento constante.
MOV AL, VECTOR[SI]
MOV [SI+1], 32H
v  Indexado a la base:
EL operando está en memoria. la dirección efectiva es el resultado de la suma del contenido de un registro base un registro índice y un desplazamiento opcional.
MOV BX, OFFSET VECTOR
LEA BX, OFFSET VECTOR
MOV AH, [BX][SI+2]
Estructura de un programa
pila segment para stack 'stack'

DW 500 DUP (?)

pila ends
datos segment para public 'data'

datos ends
extra segment para public 'data'

extra ends
                assume cs:codigo, ds:datos, es:extra,ss:pila
codigo segment para public 'code'

                public main
main proc far
                push ds
                mov ax,0
                push ax
                mov ax,datos
                mov ds,ax
                mov ax,extra
                mov es,ax
               

main endp

codigo ends
                                end main

Programación modular Estructura de un procedimiento
<nombre> PROC <atributo_distancia>
PUBLIC LP
; LP PROC NEAR
LP PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX

;limpiar pantalla
MOV AX,0600H
MOV BH,7
MOV CX,0
MOV DX, 184FH
INT 10H

POP DX
POP CX
POP BX
POP AX

RET
LP ENDP
CODIGO ANDS
END

Interrupciones de uso común
Limpiar pantalla; renglones 0-24; columnas 0-79;
MOV AX,0600H
MOV BH,7
MOV CX,    ; esquina superior izquierda (CH = renglones; CL = columnas)
MOV DX,    ;esquina inferior derecha (DH = renglones; DL = columnas)
INT 10H
Mover el cursor
MOV AH,2
MOV BH,0
MOV DX,    ;DH = Renglón; DL = Columnas
INT 10H
Carácter ingresado desde el teclado; el valor queda guardado en AL
MOV AH,1
INT 21H
Imprimir un carácter
MOV AH,2
MOV DL,    ;Valor a imprimir
INT 21H
Cadena ingresada desde el teclado
MOV AH,0AH
LEA DX,     ;Dirección de inicio cadena memoria
INT 21H
;Ejem: CAD DB 61,?,61 DUP(61),24H
;Nota en CAD +2  Se encuentra el primer carácter
Fecha del reloj
MOV AH, 2AH
INT21H
;AL = numero del día de la semana (dom=1, lun=2)
;CX = numero de año
;DH = numero de mes
;DL = dia del mes
Cambiar la fecha del reloj
MOV AH, 2BH
MOV CX,    ;numero de año
MOV DH,   ;numero de mes
MOV DL,    ;dia del mes
INT 21H


Para la división




Para la multiplicación


Mas teoría de ensamblador:
https://issuu.com/eslibre.com/docs/programaci__n_en_ensamblador_para_p

Comentarios

Entradas populares de este blog

Hola mundo en ensamblador

En cada lenguaje tenemos un inicio, aquel programa que la mayoría de personas aprende cuando se inicia en un lenguaje de programación, el famosísimo y queridísimo “hola mundo” aquel programa que te hace ilusionarte y te anima a querer saber más, dado que ensamblador es un lenguaje de bajo nivel se complica mas el echo se imprimir una sola cadena, pero eso no es motivo para desilusionarse asique aquí les dejo el famosísimo “hola mundo” desarrollado en ensamblador. Ensamblador MediaFire Ensamblador Mega Ensamblador Outlook

Suma, Resta, Multiplicación Y División ensamblador

 Hay operaciones básicas las cuales son requeridas ante todo tipo de proyectos, e inclusive en la vida diaria hay ocasiones que requieren de un pensamiento matemático, puesto que la mayoría de los problemas que se presentan  pueden y son resueltos con matemáticas, en los siguientes videos se mostrara como aplicar las 4 operaciones básicas en el lenguaje ensamblador. Parte 1 Parte 2 Parte 3 Parte 4 Ensamblador MediaFire (P05) Ensamblador Mega (P05) Ensamblador Outlook (P05)

Capturar e imprimir una cadena en ensamblador

Todo programa necesita obtener datos desde el teclado e imprimirlos en pantalla, ya que cada usuario tiene diferentes necesidades y los valores pues no siempre son los mismo se tiene que adaptar el programa al usuario y después el usuario necesita tener una interfaz para interactuar con el programa, ¿será fácil? … no, ¿será bonito? … no, ¿me servirá en un futuro? … Probablemente no, ¿entonces porque estudiarlo?... pues porque es divertido ser un dios, además hacer algo que nadie hace, pues te hace ser más especial, asique aquí te dejo el video de como capturar e imprimir cadenas tal como lo hace un legendario. Ensamblador MediaFire (P01) Ensamblador Mega (P01) Ensamblador Outlook (P01)