PDF de programación - Repertorio instrucciones x86-16bits

Imágen de pdf Repertorio instrucciones x86-16bits

Repertorio instrucciones x86-16bitsgráfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf8175

Comentarios de: Repertorio instrucciones x86-16bits (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad