Actualizado el 12 de Mayo del 2021 (Publicado el 12 de Enero del 2020)
1.703 visualizaciones desde el 12 de Enero del 2020
857,2 KB
126 paginas
Creado hace 13a (05/09/2011)
Programación
en ensamblador
(x86-64)
Miquel Albert Orenga
Gerard Enrique Manonellas
PID_00178132
CC-BY-SA • PID_00178132
Programación en ensamblador (x86-64)
Los textos e imágenes publicados en esta obra están sujetos –excepto que se indique lo contrario– a una licencia de
Reconocimiento-Compartir igual (BY-SA) v.3.0 España de Creative Commons. Se puede modificar la obra, reproducirla, distribuirla
o comunicarla públicamente siempre que se cite el autor y la fuente (FUOC. Fundació per a la Universitat Oberta de Catalunya), y
siempre que la obra derivada quede sujeta a la misma licencia que el material original. La licencia completa se puede consultar en:
http://creativecommons.org/licenses/by-sa/3.0/es/legalcode.ca
CC-BY-SA • PID_00178132
Índice
Programación en ensamblador (x86-64)
Introducción...............................................................................................
Objetivos.......................................................................................................
1. Arquitectura del computador........................................................
1.1. Modos de operación ...................................................................
1.1.1. Modo extendido de 64 bits ...........................................
1.1.2. Modo heredado de 16 y 32 bits ....................................
1.1.3.
El modo de gestión de sistema ......................................
El modo de 64 bits .....................................................................
1.2.1. Organización de la memoria .........................................
1.2.2.
Registros .........................................................................
1.2.
2. Lenguajes de programación............................................................
Entorno de trabajo ......................................................................
2.1.
3. El lenguaje de ensamblador para la arquitectura x86-64.......
Estructura de un programa en ensamblador ..............................
3.1.
3.2. Directivas .....................................................................................
3.2.1. Definición de constantes ...............................................
3.2.2. Definición de variables ..................................................
3.2.3. Definición de otros elementos ......................................
Formato de las instrucciones ......................................................
3.3.1.
Etiquetas .........................................................................
Juego de instrucciones y modos de direccionamiento ...............
3.4.1.
Tipos de operandos de las instrucciones x86-64 ...........
3.4.2. Modos de direccionamiento ..........................................
3.4.3.
Tipos de instrucciones ...................................................
3.3.
3.4.
4.
4.2.
Introducción al lenguaje C..............................................................
4.1.
Estructura de un programa en C ................................................
4.1.1. Generación de un programa ejecutable ........................
Elementos de un programa en C ................................................
4.2.1. Directivas .......................................................................
4.2.2. Variables .........................................................................
4.2.3. Operadores .....................................................................
4.2.4. Control de flujo .............................................................
4.2.5. Vectores ..........................................................................
4.2.6. Apuntadores ...................................................................
Funciones .......................................................................
4.2.7.
4.2.8.
Funciones de E/S ...........................................................
7
9
11
11
13
14
15
15
16
18
22
23
25
25
26
26
27
31
33
34
35
36
39
43
46
46
47
48
48
49
50
51
54
56
57
58
CC-BY-SA • PID_00178132
Programación en ensamblador (x86-64)
5. Conceptos de programación en ensamblador y C.....................
5.1. Acceso a datos .............................................................................
Estructuras de datos .......................................................
5.1.1.
5.1.2. Gestión de la pila ..........................................................
5.2. Operaciones aritméticas ..............................................................
5.3. Control de flujo ..........................................................................
Estructura if.....................................................................
5.3.1.
Estructura if-else..............................................................
5.3.2.
Estructura while...............................................................
5.3.3.
Estructura do-while..........................................................
5.3.4.
5.3.5.
Estructura for...................................................................
Subrutinas y paso de parámetros ................................................
5.4.1. Definición de subrutinas en ensamblador ....................
Llamada y retorno de subrutina ....................................
5.4.2.
Paso de parámetros a la subrutina y retorno de
5.4.3.
resultados .......................................................................
5.4.4.
Llamadas a subrutinas y paso de parámetros desde C ...
Entrada/salida ..............................................................................
5.5.1.
E/S programada ..............................................................
5.6. Controlar la consola ...................................................................
Funciones del sistema operativo (system calls) ...........................
5.7.
Lectura de una cadena de caracteres desde el teclado ...
5.7.1.
5.7.2.
Escritura de una cadena de caracteres por pantalla .......
Retorno al sistema operativo (exit) ................................
5.7.3.
5.4.
5.5.
6. Anexo: manual básico del juego de instrucciones.....................
6.1. ADC: suma aritmética con bit de transporte ..............................
6.2. ADD: suma aritmética .................................................................
6.3. AND: Y lógica ..............................................................................
6.4. CALL: llamada a subrutina .........................................................
6.5. CMP: comparación aritmética ....................................................
6.6. DEC: decrementa el operando ....................................................
6.7. DIV: división entera sin signo ....................................................
IDIV: división entera con signo ..................................................
6.8.
IMUL: multiplicación entera con signo ......................................
6.9.
6.9.1.
IMUL fuente: un operando explícito ............................
IMUL destino, fuente: dos operandos explícitos ...........
6.9.2.
6.10. IN: lectura de un puerto de entrada/salida .................................
6.11. INC: incrementa el operando .....................................................
6.12. INT: llamada a una interrupción software ..................................
6.13. IRET: retorno de interrupción .....................................................
6.14. Jxx: salto condicional .................................................................
6.15. JMP: salto incondicional .............................................................
6.16. LOOP: bucle hasta RCX=0 ..........................................................
6.17. MOV: transferir un dato .............................................................
6.18. MUL: multiplicación entera sin signo ........................................
61
61
63
64
66
67
67
68
69
70
70
71
71
72
73
78
83
83
85
86
87
88
90
91
92
93
94
95
96
97
97
98
100
100
101
102
102
103
104
105
106
107
107
108
CC-BY-SA • PID_00178132
Programación en ensamblador (x86-64)
6.19. NEG: negación aritmética en complemento a 2 .........................
6.20. NOT: negación lógica (negación en complemento a 1) ..............
6.21. OUT: escritura en un puerto de entrada/salida ...........................
6.22. OR: o lógica .................................................................................
6.23. POP: extraer el valor de la cima de la pila ..................................
6.24. PUSH: introducir un valor en la pila ..........................................
6.25. RET: retorno de subrutina ...........................................................
6.26. ROL: rotación a la izquierda .......................................................
6.27. ROR: rotación a la derecha .........................................................
6.28. SAL: desplazamiento aritmético (o lógico) a la izquierda ...........
6.29. SAR: desplazamiento aritmético a la derecha .............................
6.30. SBB: resta con transporte (borrow) ..............................................
6.31. SHL: desplazamiento lógico a la izquierda .................................
6.32. SHR: desplazamiento lógico a la derecha ...................................
6.33. SUB: resta sin transporte .............................................................
6.34. TEST: comparación lógica ...........................................................
6.35. XCHG: intercambio de operandos .............................................
6.36. XOR: o exclusiva .........................................................................
109
110
111
112
113
114
115
116
117
118
119
120
121
121
122
123
124
125
CC-BY-SA • PID_00178132
Introducción
7
Programación en ensamblador (x86-64)
En este módulo nos centraremos en la programación de bajo nivel con el fin
de conocer las especificaciones más relevantes de una arquitectura real con-
creta. En nuestro caso se trata de la arquitectura x86-64 (también denominada
AMD64 o Intel 64).
El lengu
Comentarios de: Programación en ensamblador (x86-64) (2)