You are on page 1of 102

PROGRAMACIÓN EN LENGUAJE

ENSAMBLADOR IA-32
Intel Architecture Software Developer’s Vol 1 y 2
Manual de NASM ( http://nasm.sourceforge.net)
 Carter P. Lenguaje ensamblador para PC (http://www.paulcarter.com)
septiembre de 2013 ENSAMBLADOR IA-32 2
Evolución histórica de los
microprocesadores Intel 80x86
septiembre de 2013 ENSAMBLADOR IA-32 3
Pentium IV: Entorno básico
 Memoria
 Registros propósito general
 Registros de segmento
 Registros FPU
 Registros MMX
 Registros XMM
 Registro EFLAGS
septiembre de 2013 ENSAMBLADOR IA-32 4
Memoria
septiembre de 2013 ENSAMBLADOR IA-32 5
Registros de propósito general
septiembre de 2013 ENSAMBLADOR IA-32 6
Registros de segmento
septiembre de 2013 ENSAMBLADOR IA-32 7
EFLAGS
septiembre de 2013 ENSAMBLADOR IA-32 8
REGISTRO DE SEÑALIZADORES
 Bit 0 CF Acarreo (1 indica acarreo)
 Bit 2 PF Paridad (1 indica paridad impar)
 Bit 4 AF Acarreo auxiliar
 Bit 6 ZF Cero (1 indica resultado nulo)
 Bit 7 SF Signo ( 1 indica resultado negativo)
 Bit 9 IF Habilitación de interrupciones
 Bit 10 DF Sentido de recorrido de las cadenas
 Bit 11 OF Overflow
septiembre de 2013 ENSAMBLADOR IA-32 9
Modos de direccionamiento
 Inmediato mov EAX,0x01234567
 Registro mov EAX,EBX
 Directo mov EAX,[Tabla]
 Indirecto mov EAX,[EBX+desp]
 Relativo mov EAX,[ESI+desp]
septiembre de 2013 ENSAMBLADOR IA-32 10
Modos de direccionamiento II
 Offset = Base + Índice* factor de
escala + Desplazamiento
mov EAX,[EBX+ESI*4+desp]
septiembre de 2013 ENSAMBLADOR IA-32 11
NASM: Estructura general de un
programa
segment .data
datos estáticos
segment .bss
variables
segment .text
global _start
_start:
instrucciones
septiembre de 2013 ENSAMBLADOR IA-32 12
NASM: directivas de datos I
L1 db 25
L2 db “Hola”,10
L3 dw 25,26
L4 dd 25
L5 dd 25.0
L7 dq 25
L8 dq 25.0
L9 dt 37
septiembre de 2013 ENSAMBLADOR IA-32 13
NASM:directivas de datos II
times nº de veces tipo valor
times 100 db 0
septiembre de 2013 ENSAMBLADOR IA-32 14
NASM: directivas de datos III
L1 resb 25
L2 resw 1
L3 resd 1
L4 resq 2
L5 rest 1
septiembre de 2013 ENSAMBLADOR IA-32 15
NASM: Directivas de datos IV
Definición de constantes : EQU
Etiqueta EQU valor
mensaje db “ Hola”
long equ $-mensaje
septiembre de 2013 ENSAMBLADOR IA-32 16
NASM : Operadores
 Lógicos :
 &(and)
 | (or)
 ^ (xor)
 ! (not)
 Aritméticos
 +,- ,*,/,//
 %,%%
 Desplazamiento
 << , >>
septiembre de 2013 ENSAMBLADOR IA-32 17
NASM: Tamaño de los datos
NASM no recuerda el tamaño de los
datos que se hayan definido
mov [var], 5 ERROR
mov dword [var],5
septiembre de 2013 ENSAMBLADOR IA-32 18
NASM: Entrada y salida
 Controlado a través de las llamadas al
kernel Linux
 El acceso a los servicios del sistema
se hace a través de la int 80h
 La lista completa de llamadas al
sistema
/usr/src/linux/include/asm/unisted.h
 Utiliza los registros generales para
pasar parámetros
septiembre de 2013 ENSAMBLADOR IA-32 19
NASM: Leer de teclado
Mov eax,3
Mov ebx,0
Mov ecx,buffer
Mov edx, 80
Int 80h
septiembre de 2013 ENSAMBLADOR IA-32 20
NASM: Escribir en pantalla
Mov eax,4
Mov ebx,1
Mov ecx, cadena
Mov edx, 50
Int 80h
septiembre de 2013 ENSAMBLADOR IA-32 21
NASM: salida del programa
Mov eax,1
Mov ebx,0
Int 80h
septiembre de 2013 ENSAMBLADOR IA-32 22
Ejemplo de programa
segment .data
mensaje db “hola “,10
long equ $-mensaje
segment .text
global _start
_start:
mov eax,4
mov ebx,1
mov ecx, mensaje
mov edx, long
int 80h
mov eax,1
mov ebx,0
int 80h
septiembre de 2013 ENSAMBLADOR IA-32 23
Fases en el desarrollo de un
programa
Edición
Compilación
Linkado
Ejecución
Depuración
Ejecución
Edición
Compilación
Linkado
septiembre de 2013 ENSAMBLADOR IA-32 24
Compilación bajo NASM
 nasm –f elf programa.asm –l
programa.txt
 Formato del objeto ELF, ELF32, ELF64
 Genera un programa objeto
 Directivas global y extern
septiembre de 2013 ENSAMBLADOR IA-32 25
Generando el ejecutable
 ld –o nombre nombre.o
 ./nombre
septiembre de 2013 ENSAMBLADOR IA-32 26
Corrigiendo errores
 Listar el fichero de listado
 Volver a editar
 Uso de depuradores
septiembre de 2013 ENSAMBLADOR IA-32 27
Depurador ald
 ald nombre_ejecutable
 run
 step
 examine –n nº bytes –s tamaño datos –o
formato salida dir inicio
 enter
 help
 break
 quit
septiembre de 2013 ENSAMBLADOR IA-32 28
Instrucciones de movimiento de datos
 MOV destino, fuente ;mov EAX,[Tabla]
 LEA destino , fuente ;lea EAX,[Tabla]
 CMOVcc destino,fuente
septiembre de 2013 ENSAMBLADOR IA-32 29
Instrucciones de movimiento condicional
septiembre de 2013 ENSAMBLADOR IA-32 30
Instrucciones de intercambio
 XCHG destino, fuente
 BSWAP
 XADD
 CMPXCHG /CMPXCHG8B
septiembre de 2013 ENSAMBLADOR IA-32 31
Instrucciones de uso de la pila
 PUSH fuente
 POP destino
 PUSHA /POPA
 PUSHAD/POPAD
septiembre de 2013 ENSAMBLADOR IA-32 32
Instrucciones de conversión de tipo
 CBW
 CWD /CWDE
 CDQ
 MOVSX /MOVZX destino, fuente
septiembre de 2013 ENSAMBLADOR IA-32 33
Instrucciones aritméticas (1)
 ADD/ADC destino, fuente
 SUB/SBB destino, fuente
 MUL/IMUL fuente
 DIV/IDIV fuente
septiembre de 2013 ENSAMBLADOR IA-32 34
Instrucciones aritméticas (2)
 INC/DEC operando
 CMP destino, fuente
 NEG operando
septiembre de 2013 ENSAMBLADOR IA-32 35
Instrucciones de ajuste decimal
 DAA/DAS
 AAA/AAS/AAM/AAD
septiembre de 2013 ENSAMBLADOR IA-32 36
Instrucciones lógicas
 AND destino, fuente
 OR destino, fuente
 XOR destino, fuente
 NOT operando
septiembre de 2013 ENSAMBLADOR IA-32 37
Instrucciones de desplazamiento y
rotación
 SAL/SAR/SHL/SHR destino, nº bits
 SHLD/SHRD destino,fuente , nº bits
 ROL/ROR/RCL/RCR destino, nº bits
septiembre de 2013 ENSAMBLADOR IA-32 38
Instrucciones de bit y byte
 BT/BTS/BTR/BTC operando, nº bit
 BSF/BSR destino,origen
 SETcc destino
 TEST destino, fuente
septiembre de 2013 ENSAMBLADOR IA-32 39
Instrucciones de transferencia
incondicional
 JUMP (short near far) etiqueta
 CALL/RET etiqueta
 INT/IRET
septiembre de 2013 ENSAMBLADOR IA-32 40
Instrucciones de salto condicional
septiembre de 2013 ENSAMBLADOR IA-32 41
Instrucciones de bucles
 LOOP etiqueta
 LOOPE/LOOPZ/LOOPNE/LOOPNZ etiq
 JECXZ etiqueta
septiembre de 2013 ENSAMBLADOR IA-32 42
Instrucciones sobre cadenas de
caracteres
 MOVS/MOVSB/MOVSW/MOVSD
 CMPS/CMPSB/CMPSW/CMPSD
 LODS/LODSB/LODSW/LODSD
 SCAS/SCASB/SCASW/SCASD
 STOS/STOSB/STOSW/STOSD
septiembre de 2013 ENSAMBLADOR IA-32 43
Prefijos de repetición
 REP
 REPE/REPZ
 REPNE/REPNZ
septiembre de 2013 ENSAMBLADOR IA-32 44
Instrucciones de entrada y salida
 IN registro, nº puerto
 OUT nº puerto, registro
 INS/OUTS
septiembre de 2013 ENSAMBLADOR IA-32 45
Instrucciones de EFLAGS
 STC/CLC/CMC
 STD/CLD
 STI/CLI
 LAHF/SAHF
 PUSHF/POPF
septiembre de 2013 ENSAMBLADOR IA-32 46
Instrucciones de miscelánea
 XLAT/XLATB
 CPUID
 NOP
septiembre de 2013 ENSAMBLADOR IA-32 47
El entorno de ejecución FPU-32
 Pila de registros
 Registro de estado
 Registro de control
 Registro de tag
 Registro puntero al ultimo operando
 Registro puntero a la última
instrucción
 Registro de código de operación
septiembre de 2013 ENSAMBLADOR IA-32 48
Pila de registros x87 FPU
septiembre de 2013 ENSAMBLADOR IA-32 49
Registro de control x87 FPU
septiembre de 2013 ENSAMBLADOR IA-32 50
Registro de estado x87 FPU
septiembre de 2013 ENSAMBLADOR IA-32 51
Registro de tag x87 FPU
septiembre de 2013 ENSAMBLADOR IA-32 52
Tipos de datos FPU
 Enteros de 16,32,64 bits en
complemento a dos
 Reales de 32,64,80 bits
 Signo
 Exponente 8, 11, 15 bits
 Mantisa de 23, 52, 64 bits
 BCD de 80 bits
septiembre de 2013 ENSAMBLADOR IA-32 53
Instrucciones de transferencia de
datos (1)
 FLD origen_real
 FST destino_real
 FXCH registro x87
 FCMOVcc registro x87
septiembre de 2013 ENSAMBLADOR IA-32 54
Instrucciones de transferencia de
datos (2)
 FILD entero
 FIST entero
 FISTP entero
 FBLD decimal
 FBSTP decimal
septiembre de 2013 ENSAMBLADOR IA-32 55
Instrucciones de carga de
constantes
 FLDZ +0.0
 FLD1 +1.0
 FLDPI π (pi)
 FLDL2T log
2
10
 FLDL2E log
2
e
 FLDLG2 log
10
2
 FLDLN2 log
e
2
septiembre de 2013 ENSAMBLADOR IA-32 56
Instrucciones aritméticas x87 (1)
 FADD/FADDP/FIADD
 FSUB/FSUBP/FISUB
 FSUBR/FSUBRP/FISUBR
septiembre de 2013 ENSAMBLADOR IA-32 57
Instrucciones aritméticas x87 (2)
 FMUL/FMULP/FIMUL
 FDIV/FDIVP/FIDIV
 FDIVR/FDIVRP/FIDIVR
septiembre de 2013 ENSAMBLADOR IA-32 58
Instrucciones aritméticas x87 (3)
 FABS
 FCHS
 FSQRT
 FPREM/FPREM1
 FRNDINT
 FXTRACT
septiembre de 2013 ENSAMBLADOR IA-32 59
Instrucciones de comparación x87
FCOM/FCOMP/FCOMPP
septiembre de 2013 ENSAMBLADOR IA-32 60
Instrucciones de comparación x87
FCOMI/FCOMIP
septiembre de 2013 ENSAMBLADOR IA-32 61
Otras instrucciones de comparación
x87
 FUCOM/FUCOMP
 FICOM/FICOMP
 FUCOMI/FUCOMIP
septiembre de 2013 ENSAMBLADOR IA-32 62
Instrucciones de clasificación:
FXAM
septiembre de 2013 ENSAMBLADOR IA-32 63
Otra instrucción de comparación:
FTST
septiembre de 2013 ENSAMBLADOR IA-32 64
Instrucciones trigonométricas
 FSIN
 FCOS
 FSINCOS
 FPTAN
 FPATAN
septiembre de 2013 ENSAMBLADOR IA-32 65
Instrucciones logarítmicas,
exponenciales y de escalado
 FYL2X : st0 =st1*log
2
(st0)
 FYL2XP1 : st0 = st1*log
2
(st0+1.0)
 F2XM1 : st0 = 2
st0
-1
 FSCALE st0 = st0 * 2
st1
septiembre de 2013 ENSAMBLADOR IA-32 66
Instrucciones de control x87
 FINIT/FNINIT : inicialización
 FLDCW/FSTCW : reg control
 FSTSW : reg. Estado
 FCLEX : bits excepción
septiembre de 2013 ENSAMBLADOR IA-32 67
Instrucciones carga y
almacenamiento del entorno
 FLDENV
 FSTENV/FNSTENV
 FSAVE/FNSAVE/FRSTOR
septiembre de 2013 ENSAMBLADOR IA-32 68
Otras instrucciones x87
 FWAIT/FNWAIT
 FNOP
 FFREE
 FINCSTP/FDECSTP
septiembre de 2013 ENSAMBLADOR IA-32 69
Tecnología MMX
 8 registros MMX de 64 bits
 4 nuevos tipos de datos MMX
 Instrucciones MMX
 Modo de operación S.I.M.D.
 Aplicaciones multimedia
septiembre de 2013 ENSAMBLADOR IA-32 70
Registros MMX
septiembre de 2013 ENSAMBLADOR IA-32 71
Tipos de datos MMX
septiembre de 2013 ENSAMBLADOR IA-32 72
Operaciones S.I.M.D.
 Pseudo vectorial
 Aritmética MMX
 Wraparound
 Saturación con signo
 Saturación sin signo
septiembre de 2013 ENSAMBLADOR IA-32 73
Instrucciones MMX
 Transferencia de datos
 Conversión de datos
 Aritméticas
 Comparación
 Lógicas
 Desplazamiento
 EMMS
septiembre de 2013 ENSAMBLADOR IA-32 74
Instrucciones de transferencia de
datos
 MOVD destino, origen
 Memoria
32
ó registro general
 Parte baja de registro MMX
 MOVQ destino, origen
 Memoria
64
y registro MMX
septiembre de 2013 ENSAMBLADOR IA-32 75
Instrucciones de conversión de
datos
 PACKSSDW/PACKUSDW
 PACKSSWB/PACKUSWB
 PUNPCKLBW/PUNPCKHBW
 PUNPCKLDQ/PUNPCKHDQ
 PUNPCKLDW/PUNPCKHDW
septiembre de 2013 ENSAMBLADOR IA-32 76
Instrucciones de empaquetamiento
de datos con signo y saturación (1)
septiembre de 2013 ENSAMBLADOR IA-32 77
Instrucciones de conversión de
datos con saturación y signo (2)
septiembre de 2013 ENSAMBLADOR IA-32 78
Instrucciones de conversión de
datos (3)
septiembre de 2013 ENSAMBLADOR IA-32 79
Instrucciones de conversión de
datos (4)
septiembre de 2013 ENSAMBLADOR IA-32 80
Instrucciones de conversión de
datos (5)
septiembre de 2013 ENSAMBLADOR IA-32 81
Instrucciones de conversión de
datos (6)
septiembre de 2013 ENSAMBLADOR IA-32 82
Instrucciones aritméticas (1)
 PADDB/PADDW/PADDD
 PADDSB/PADDSW
 PADDUSB/PADDUSW
septiembre de 2013 ENSAMBLADOR IA-32 83
Instrucciones aritméticas (2)
 PSUBB/PSUBW/PSUBD
 PSUBSB/PSUBSW
 PSUBUSB/PSUBUSW
septiembre de 2013 ENSAMBLADOR IA-32 84
Instrucciones aritméticas (3)
 PMULLW
 PMULHW/PMULHUW
 PMADDWD
septiembre de 2013 ENSAMBLADOR IA-32 85
PMULLW
septiembre de 2013 ENSAMBLADOR IA-32 86
PMULHW/PMULHUW
septiembre de 2013 ENSAMBLADOR IA-32 87
PMADDWD
septiembre de 2013 ENSAMBLADOR IA-32 88
Instrucciones de comparación (1)
septiembre de 2013 ENSAMBLADOR IA-32 89
Instrucciones de comparación (2)
septiembre de 2013 ENSAMBLADOR IA-32 90
Instrucciones de comparación (3)
septiembre de 2013 ENSAMBLADOR IA-32 91
Instrucciones lógicas
 PAND destino,fuente
 PANDN destino, fuente
 Destino = destino and ( not fuente)
 POR destino, fuente
 PXOR destino,fuente
septiembre de 2013 ENSAMBLADOR IA-32 92
Instrucciones de desplazamiento y
rotación
 PSLLW/PSLLD/PSLLQ
 PSLRW/PSLRD/PSLRQ
 PSRAW/PSRAD
septiembre de 2013 ENSAMBLADOR IA-32 93
Instrucciones MMX
 EMMS
septiembre de 2013 ENSAMBLADOR IA-32 94
Recursos del programador
septiembre de 2013 ENSAMBLADOR IA-32 95
STREAMING SIMD EXTENSIONS
(SSE)
 8 registros XMM de 128 bits
 Registro de control y de estado MXCSR
 Tipo de datos real de 32 bits empaquetado
(128 bits total)
 Instrucciones sobre reales empaquetados
septiembre de 2013 ENSAMBLADOR IA-32 96
Registro MXCSR
septiembre de 2013 ENSAMBLADOR IA-32 97
Operaciones con reales
empaquetados
septiembre de 2013 ENSAMBLADOR IA-32 98
Operaciones entre un escalar y un
real empaquetado
septiembre de 2013 ENSAMBLADOR IA-32 99
Instrucciones SSE
 Transferencia de datos
 Aritméticas
 Lógicas
 De comparación
 De conversión
 Desempaquetamiento
septiembre de 2013 ENSAMBLADOR IA-32 100
Instrucciones SSE de transferencia
de datos
 MOVAPS xmm
i
, xmm
j
/mem 128
 MOVUPS xmm
i
, xmm
j
/mem 128
 MOVSS xmm
i
, xmm
j
/mem 32
 MOVLPS xmm, mem 64 ó viceversa
 MOVHPS xmm, mem 64 ó viceversa
 MOVLHPS xmm
i
, xmm
j
 MOVHLPS xmm
i
, xmm
j
 MOVSS r32, xmm
j
septiembre de 2013 ENSAMBLADOR IA-32 101
Instrucciones SSE aritméticas
 ADDPS xmmi, xmmj (mem128)
 ADDSS xmmi, xmmj (mem32)
 SUBPS xmmi, xmmj (mem128)
 SUBSS xmmi, xmmj (mem32)
 MULPS xmmi, xmmj (mem128)
 MULSS xmmi, xmmj (mem32)
 DIVPS xmmi, xmmj (mem128)
 DIVSS xmmi, xmmj (mem32)
septiembre de 2013 ENSAMBLADOR IA-32 102
Instrucciones SSE Aritméticas (2)
 RCPPS xmmi, xmmj (mem128)
 RCPPS xmmi, xmmj (mem32)
 SQRTPS xmmi, xmmj (mem128)
 SQRTSS xmmi, xmmj (mem32)
 RSQRTPS xmmi, xmmj (mem128)
 RSQRTSS xmmi, xmmj (mem32)
 MAXPS xmmi, xmmj (mem128)
 MAXSS xmmi, xmmj (mem32)
 MINXPS xmmi, xmmj (mem128)
 MINXSS xmmi, xmmj (mem32)