Vous êtes sur la page 1sur 25

Tutorial EMU8086

Lenguaje ensamblador para


procesadores 8086

Que es lenguaje assembly?


Es un lenguaje de bajo nivel que
representa en forma directa el cdigo
de mquina, con incorporaciones
propias de lenguaje de programacin
que permite usar cdigos
nemotcnicos para reemplazar los
cdigos binarios de las instrucciones.

Organizacin INTEL 8086

Sigue el modelo clsico de von neuman

Al interior de la CPU

Registros dela CPU


El procesador tiene 8 registros de 16 bits, de
uso general. Se dividen en fragmentos de 8 bits.
AX El acumulador, dividido en AH/AL
BX registro base de direccin (BH/BL)
CX registro contador (CH/CL)
DX Registro de datos (DL/DH)
SI source index Origen de edatos
DI destination index
BP puntero de base: inicio de stack
SP stack pointer: tope de stack

Uso de registros bsicos


Sea AX=B4A5, entonces AH=B4 y AL=A5
Los registros son locales a la CPU y por lo
tanto de rpido acceso.
Sus contenidos se pueden expresar en
decimal, binario o hexadecimal, con
sufijo b para binario y h para
hexadecimal. Si un dato hexadecimal
empieza con A-F, se antecede con un 0.
Ejemplo: AL=11101001b=0E9h=233

Registros de segmento
Intel usa 4 registros de segmento
CS: Segmento de cdigo, apunta al
segmento del programa actual.
DS: Segmento de datos, donde estn
las variables del porgrama.
SS: segmento de stack, donde est el
stack
ES: segmento extra, normalmente
usado para extender el rea de
datos.

Uso de registros de
segmento
Los registros de segmento trabajan en
conjunto con los registros de uso general
para acceder las direcciones de memoria,
es decir, en conjunto definen la direccin
efectiva de un acceso a memoria.
Por ejemplo, si se desea acceder al a
direccin 12345h de memoria, se puede
asignar DS=1230h y SI=0045h
La direccin efectiva se calcula segn
Dir efectiva DS*10h+SI=12345h

Asociaciones por defecto


Los registros BX, SI y DI trabajan con
DS.
BP y SP trabajan con SS

Puntero de instrucciones
IP es el instruction pointer, que en otras
arquitecturas se conoce como contador de
programa. Trabaja en conjunto con el
segmento de cdigo CS, para definir la
direccin de la prxima instruccin a
ejecutar, inicindose el programa desde
una direccin de origen conocida,
normalmente:
Org 100h
La direccin efectiva es : CS*10h+IP

Rango de direcciones
En una organizacin de 16 bits, las
direcciones disponibles son
216=65.536 bytes o 64Kbytes.
La multiplicacin por 10h (16) del
registro de segmento permite
alcanzar hasta 220=1.048.576 o
1Mbyte.
A inicios de la dcada de 1980 esa
capacidad de memoria RAM era
considerada infinita.

Registro de estado (FLAGS)


El registro de estado se modifica
automticamente despus de las
operaciones aritmticas, para
determinar el tipo del resultado y
para sealar condiciones para
transferencia de control de programa
hacia otras direcciones.

Flags del registro

O: overflow
Direccin: datos desde o hacia memoria
Interrupt: Habilitacin de interrupciones
Trace: paso a paso por instrucciones
Sign: bit de signo
Zero: resultado 0
Aux Carry: carry de 8 bits
Parity: bit de paridad
Carry: carry de 16 bits.

Modos de acceso a memoria


Para acceder a la memoria de datos,
se usan los registros BX, SI, DI y BP,
ms constantes de 8 y 16 bits como
desplazamiento, siempre relativos a
[SI]
[BX + SI]
[BX + SI + d8]
DS
[DI]
[BX + DI]
[BP + SI]
[BP + DI]

[SI + d8]
[DI + d8]
[BP + d8]
[BX + d8]

d16 (variable offset


only)
[BX]
[BX + SI + d16]
[BX + DI + d16]
[BP + SI + d16]
[BP + DI + d16]

[BX + DI + d8]
[BP + SI + d8]
[BP + DI + d8]

[SI + d16]
[DI + d16]
[BP + d16]
[BX + d16]

Ejemplos de direcciones
efectivas
Sea DS=100, BX=30, SI=70
La direccin efectiva de
[BX+SI]+25 es:
100*16+30+70+25=1725
Ntese que son datos decimales.
Sea DS=0F400h, DI=00A1h
[DI]+0E1h=F4000+A1+E1=F4812
El desplazamiento puede ser positivo o
negativo.

Regla general de
direcciones
BX SI
BP DI

desp

Toda direccin obtenida es un offset respecto al


registro de segmento de datos DS. Esta misma regla
es vlida para todos los registros de segmento.

Tipos de datos
El lenguaje assembler acepta tipos
de datos asociados a los tipos
nativos de la mquina.
Cuando son direcciones son
punteros.
Byte ptr [BX] puntero a 8 bits
Word ptr [BX], puntero a 16 bits.
b reemplaza a byte ptr
w reemplaza a word ptr.

Instruccin MOV
Copia el segundo operando (origen) en el primero (destino)
MOV REG, memory
MOV memory, REG
MOV REG, REG
MOV memory, immediate
MOV REG, immediate
REG:AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI,
BP, SP.
memory: [BX], [BX+SI+7], variable, etc...
immediate: 5, -24, 3Fh, 10001101b, etc...

MOV y registros de
segmento
MOV SREG, memory
MOV memory, SREG
MOV REG, SREG
MOV SREG, REG
SREG: DS, ES, SS, and only as second
operand: CS.
REG:AX, BX, CX, DX, AH, AL, BL, BH, CH, CL,
DH, DL, DI, SI, BP, SP.
memory: [BX], [BX+SI+7], variable, etc...
La instruccin MOV no modifica CS

Ejemplo con MOV


ORG 100h
; this directive required for a simple 1
segment .com program.
MOV AX, 0B800h
; set AX to hexadecimal value of
B800h.
MOV DS, AX
; copy value of AX to DS.
MOV CL, 'A'
; set CL to ASCII code of 'A', it is 41h.
MOV CH, 1101_1111b ; set CH to binary value.
MOV BX, 15Eh
; set BX to 15Eh.
MOV [BX], CX
; copy contents of CX to memory at
B800:015E
RET
; returns to operating system.
; sirve para incorporar un comentario

Explicacin ejemplo
Este programa escribe el caracter A, con
fondo rojo en la direccin de memoria
B815E, que corresponde al buffer de
memoria de video.
En la direccin B851E queda la letra A:
41(ASCII)
En la direccin B851F, queda el atributo de
video en este caso color.
Ntese que la representacin es big
endian.

Uso de variables
El ensamblador permite definir
directamente variables en memoria.
El nombre se asocia a una direccin,
el tipo puede ser byte o word y el
contenido se puede defoinir segn el
tipo asociado. Si no se define el
contenido, la variable slo ocupa el
espacio de memoria.
Nombre DB valor --- DB: define Byte
Nombre DW valor --- DW define Word

Ejemplo de definicin de var


iables

ORG 100h
MOV AL, VAR1
MOV BX, VAR2
RET
VAR1 DB 7
VAR2 DW 1234H

Ingreso manual del program


a
El programa se puede escribir directamente usando definicin de
variables a partir de la direccin de origen.
Copiando el contenido binario del programa
org 100
db 0a0h
db 08h
db 01h
db 8bh
db 1eh
db 09h
db 01h
db 0C3h
db 07h
db 34h
db 12h

Arreglos
Los arreglos son cadenas de variables, a
partir de una direccin de origen.
Una string es un arreglo de bytes donde
cada elemento est representado por su
cdigo ASCII
Saludo1 db 48h,65h, 6Ch, 6Fh, 00h
Saludo2 db Hello,0
Saludo1 y saludo2 son idnticos.
Saludo1[0]=48, Saludo1[1]=65,
.,Saludo1[5]=0