Actualizado el 21 de Marzo del 2018 (Publicado el 3 de Enero del 2018)
764 visualizaciones desde el 3 de Enero del 2018
365,7 KB
73 paginas
Creado hace 8a (08/10/2015)
Repertorio de instrucciones x86-16bits
Índice
1. Generalidades
2.
3.
4.
5. Otras instrucciones
Instrucciones de transferencia
Instrucciones de proceso
Instrucciones de bifurcación
1/145
Repertorio de instrucciones x86-16bits
1. Generalidades
(cid:127) No se pueden realizar operaciones donde ambos
operandos residan en memoria
(cid:127) Las instrucciones de transferencia NO ACCEDEN al
registro de estado
(cid:127) Las instrucciones de proceso ESCRIBEN el registro
de estado
(cid:127) Las instrucciones de salto LEEN el registro de estado
2/145
1
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
1. Generalidades
(cid:127) Existen 2 tipos de sintaxis
INTEL
ATT
(cid:127) Nosotros usaremos la sintaxis INTEL
El primer operando es el DESTINO
El segundo operando es el FUENTE
(cid:127) En las operaciones de proceso, el operando DESTINO
pierde su valor inicial siendo reemplazado por el
resultado
3/145
Repertorio de instrucciones x86-16bits
2. Instrucciones de transferencia
2.
Instrucciones de transferencia
Índice
1. Movimiento de datos
2. Extensión de signo
3. Transfiriendo punteros
4. Transferencias con la pila
5. Entrada/salida
4/145
2
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
MOV {reg/mem},{reg/mem/inmediato}
(cid:127) Trasfiere un byte o una palabra desde el operando
fuente al destino
op. destino ←←←← op. fuente
(cid:127) El operando fuente no se destruye
(cid:127) Ambos operandos deben ser del mismo tamaño
5/145
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
(cid:127) Ejemplo:
MOV AX,FFFF
MOV BX,1234
; AX = FFFF h
; BX = 1234 h
MOV AX,BX
; AX = 1234 h
; BX = 1234 h
6/145
3
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
(cid:127) Restricciones:
No se pueden mover datos entre dos elementos de
memoria; hay que utilizar un registro intermedio
MOV AX, mem1
MOV mem2, AX
No se puede mover un inmediato a un registro de
segmento; hay que usar un registro intermedio
MOV AX, 1234h
MOV DS, AX
; AX = 1234h
; DS = 1234h
El registro de segmento CS no puede ser destino
7/145
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
XCHG {reg/mem},{reg/mem}
(cid:127)
Intercambia el contenido de los operandos
(cid:127) Es útil para evitar el uso de una variable temporal
(cid:127) Ejemplo:
MOV AX,FFFF
MOV BX,0
; AX = FFFF h
; BX = 0000 h
XCHG AX,BX
; AX = 0000 h
; BX = FFFF h
8/145
4
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
XLAT memoria
(cid:127) Memoria es un desplazamiento sobre DS. El puntero
a memoria será:
DS:memoria
prefijo: XLAT memoria
(cid:127) Ahora el segmento viene dado por el prefijo.
El puntero a memoria será:
prefijo:memoria
9/145
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
(cid:127) La instrucción XLAT carga en AL el valor de una tabla
de memoria
(cid:127) Es útil para traducir entre sistemas de codificación
(cid:127) La tabla debe ser de bytes y no puede tener más de
256 bytes; el primero tiene desplazamiento 0
(cid:127) La base de la tabla se coloca en BX y el puntero en AL
AL ←←←← [BX+AL]
10/145
5
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
(cid:127) Ejemplo:
TABLA
.DATA
DB 1,2,3,4,5,6,7
;declaración
.CODE
MOV BX,OFFSET TABLA
MOV AL,4
XLAT TABLA
;carga BX
;5º valor
;AL = 5
(cid:127) Esto es equivalente a:
MOV AL,TABLA[4]
11/145
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
(cid:127) Ejemplo:
Esta tabla permite traducir
códigos ASCII a EBCDIC
El código ASCII sirve de
índice
Por ejemplo, el índice 32
apunta al “2” en EBCDIC
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
dirección
TABLA[0]
TABLA[1]
valor
XX
XX
TABLA[30]
TABLA[31]
TABLA[32]
TABLA[33]
TABLA[34]
TABLA[35]
F0
F1
F2
F3
F4
F5
12/145
6
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
LAHF
(cid:127) Carga los 8 bits más bajos del registro de estado
(banderas de estado) en AH
AH ←←←← banderas de estado (bits 0, 2, 4, 6, 7)
SAHF
(cid:127) Recupera las banderas de estado desde AH
banderas de estado ←←←← AH
13/145
Repertorio de instrucciones x86-16bits
2.1. Movimiento de datos
(cid:127) Las instrucciones de transferencia de las banderas de
estado se suelen usar para mover el estado entre
coprocesadores
(cid:127) Para manejar el conjunto completo del registro de
estado se deben usar instrucciones de transferencia
con la pila
PUSHF
POPF
14/145
7
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.2. Extensión de signo
(cid:127) Antes de poder mover datos de diferente tamaño es
necesario extender adecuadamente el signo
(cid:127) El procedimiento es distinto si el número es
considerado con signo o sin él, pero es el
programador el que debe tenerlo en cuenta ya que la
máquina no advierte la diferencia
Cuando el valor tiene signo se usa CBW o CWD
Cuando el valor es sin signo se rellena con ceros
15/145
Repertorio de instrucciones x86-16bits
2.2. Extensión de signo
CBW
(cid:127) Convertir byte en palabra
(cid:127) Copia el bit 7 del registro AL en todo el registro AH
CWD
(cid:127) Convertir palabra en doble palabra
(cid:127) Copia el bit 15 del registro AX en el registro DX
Doble palabra DX:AX
16/145
8
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.2. Extensión de signo
(cid:127) Ejemplo con signo:
mem8
mem16
.DATA
DB –5
DW –5
.CODE
MOV AL, mem8
CBW
MOV AX, mem16
CWD
;declaración
;declaración
;carga AL = FBh
;AX = FFFBh (-5)
;carga AX = FFFBh
;DX = FFFFh
;DX:AX = (-5)
17/145
Repertorio de instrucciones x86-16bits
2.2. Extensión de signo
(cid:127) Ejemplo sin signo:
.DATA
DB 251
DW 65531
mem8
mem16
;declaración (FBh)
;declaración (FFFBh)
.CODE
MOV AL, mem8
XOR AH, AH
;carga AL = FBh(251)
;AX = 00FBh (251)
MOV AX, mem16
XOR DX, DX
;carga AX = FFFBh
;DX:AX = 0000 FFFBh
18/145
9
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
(cid:127)
Instrucciones para cargar punteros en registros
(cid:127) Los punteros pueden ser
Near dentro de un segmento; no exceden los 64KB
• LEA
Far entre segmentos; exceden los límites del
segmento y se requiere una base y un desplazamiento
(cid:127) LES
(cid:127) LDS
19/145
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
LEA {reg},{mem}
(cid:127) Carga un puntero near en un registro; el puntero es la
dirección efectiva de la posición de memoria
especificada en el operando fuente
El operando destino puede ser cualquier registro de
propósito general
No están permitidos los registros de segmento
El operando fuente es una posición de memoria
especificada por cualquier modo de direccionamiento
20/145
10
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
(cid:127) Ejemplo:
(cid:127) Transfiere el desplazamiento del operando fuente al
registro destino
LEA AX, 1234[SI]
;si SI = 1000h
;AX = 1234 + 1000
;AX = 2234h
21/145
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
(cid:127) Advertencias respecto a LEA:
LEA DX,cadena
MOV DX,OFFSET cadena
(cid:127) Dan el mismo resultado pero es más rápida la
segunda ya que la posición de cadena en el área de
datos es conocida en tiempo de ensamblado
(cid:127) Usaremos LEA cuando queramos transferir un
desplazamiento no conocido en tiempo de diseño:
LEA DX,cadena[SI]
MOV DX,OFFSET cadena[SI]
;no funciona
22/145
11
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
LES {reg},{mem}
(cid:127) Copia un puntero far (32 bits) guardado en el
operando fuente al registro especificado en el
operando destino y al registro ES
ES salva la base
Registro destino salva el desplazamiento (no se
aceptan los registros de segmento)
(cid:127) El operando fuente es una posición de memoria de
tamaño doble palabra (32 bits)
23/145
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
(cid:127) Los punteros en memoria se salvan por este orden
Palabra de menor peso desplazamiento
Palabra de mayor peso base
(cid:127) Ejemplo:
PTR 1234:5678
LES DI,PTR
;DI = 5678h
;ES = 1234h
dirección
valor
PTR[0]
PTR[1]
PTR[2]
PTR[3]
78
56
34
12
24/145
12
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
LDS {reg},{mem}
(cid:127) Copia un puntero far (32 bits) guardado en el
operando fuente al registro especificado en el
operando destino y al registro DS
DS salva la base
Registro destino salva el desplazamiento (no se
aceptan los registros de segmento)
(cid:127) El operando fuente es una posición de memoria de
tamaño doble palabra (32 bits)
25/145
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punteros
(cid:127) Ejemplo:
dirección
valor
PTR 1234:5678
LDS SI,PTR
;SI = 5678h
;DS = 1234h
PTR[0]
PTR[1]
PTR[2]
PTR[3]
78
56
34
12
26/145
13
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
z
e
p
ó
L
o
c
R
i
l
f
e
a
a
R
©
Repertorio de instrucciones x86-16bits
2.3. Transfiriendo punte
Comentarios de: Repertorio instrucciones x86-16bits (0)
No hay comentarios