diff options
| author | Juan Marín Noguera <juan.marinn@um.es> | 2020-02-20 13:15:34 +0100 |
|---|---|---|
| committer | Juan Marín Noguera <juan.marinn@um.es> | 2020-02-20 13:15:34 +0100 |
| commit | 29eb708670963c0ca5bd315c83a3cec8dafef1a7 (patch) | |
| tree | 1a53fce36c4ef876bd73b98fff88e79cc4377803 /fc/n5.lyx | |
Commit inicial, primer cuatrimestre.
Diffstat (limited to 'fc/n5.lyx')
| -rw-r--r-- | fc/n5.lyx | 1515 |
1 files changed, 1515 insertions, 0 deletions
diff --git a/fc/n5.lyx b/fc/n5.lyx new file mode 100644 index 0000000..66b2ee2 --- /dev/null +++ b/fc/n5.lyx @@ -0,0 +1,1515 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass book +\use_default_options true +\maintain_unincluded_children false +\language spanish +\language_package default +\inputencoding auto +\fontencoding global +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style swiss +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +Una +\series bold +instrucción +\series default + es un conjunto de símbolos que representan una operación a realizar por + la CPU, y un +\series bold +programa +\series default + es un conjunto ordenado de instrucciones que debe ejecutar el computador + sobre unos datos para procesarlos y obtener un resultado. + Las instrucciones se almacenan en memoria principal y se ejecutan en secuencia, + salvo por instrucciones de salto. + Tipos de instrucciones: +\end_layout + +\begin_layout Itemize + +\series bold +De movimiento de datos +\series default + entre registros de la CPU y direcciones de memoria. +\end_layout + +\begin_layout Itemize + +\series bold +Aritmético-lógicas: +\series default + Suma, resta, multiplicación, división, AND, OR, desplazamientos, ... + y operaciones de punto flotante. +\end_layout + +\begin_layout Itemize + +\series bold +Instrucciones de salto: +\series default + Condicionales, incondicionales y de manejo de subrutinas. +\end_layout + +\begin_layout Standard +Las instrucciones se organizan en campos de bits, que indican, en un determinado + formato, la operación a ejecutar, los operandos de entrada y el lugar donde + dejar el resultado. + Distintos tipos de instrucción utilizan distintos formatos, pues necesitan + codificar información distinta. +\end_layout + +\begin_layout Standard +La CPU está formada por un +\series bold +camino de datos +\series default + ( +\series bold +CD +\series default +), encargado del procesamiento, y una +\series bold +unidad de control +\series default + ( +\series bold +UC +\series default +), que decodifica las instrucciones y +\begin_inset Quotes cld +\end_inset + +controla +\begin_inset Quotes crd +\end_inset + + al camino de datos. + En todo momento, la UC mantiene un +\series bold +contador de programa +\series default + ( +\series bold +PC +\series default +, +\emph on +program counter +\emph default + o +\series bold +IP +\series default +, +\emph on +instruction pointer +\emph default +) que contiene la dirección de la siguiente instrucción a ejecutar, y un + +\series bold +registro de instrucción +\series default + ( +\series bold +RI +\series default +), que contiene la instrucción a ejecutar. + A mayor número de instrucciones mayor complejidad de la UC y más número + de bits necesarios en el campo de código. + Dos tendencias: +\end_layout + +\begin_layout Itemize + +\series bold +RISC +\series default + ( +\series bold +\emph on +Reduced Instruction Set Computers +\series default +\emph default +): pocas instrucciones, sencillas y que se ejecutan en pocos ciclos. +\end_layout + +\begin_layout Itemize + +\series bold +CISC +\series default + ( +\series bold +\emph on +Complex Instruction Set Computers +\series default +\emph default +): muchas instrucciones, complejas y que requieren muchos ciclos de reloj. +\end_layout + +\begin_layout Section +Jerarquía de traducción +\end_layout + +\begin_layout Standard +Las instrucciones de la CPU, llamadas +\series bold +instrucciones máquina +\series default +, se almacenan en binario. + Programarlas directamente en +\series bold +lenguaje +\series default + o +\series bold +código máquina +\series default + es muy difícil y propenso a errores, por lo que los +\series bold +lenguajes de programación +\series default + representan las instrucciones de forma simbólica. + Existen principalmente dos tipos: +\end_layout + +\begin_layout Itemize + +\series bold +Lenguaje ensamblador: +\series default + Instrucciones representadas simbólicamente, en ASCII, que se corresponden + directamente con instrucciones máquina y datos binarios. +\end_layout + +\begin_layout Itemize + +\series bold +Lenguajes de alto nivel: +\series default + Permiten expresar los programas de forma más cercana a la forma de pensar + del programador, con variables, tipos de datos, funciones/procedimientos, + condiciones, bucles, etc. + Existen multitud de paradigmas (imperativo, orientado a objetos, funcional...) + y de lenguajes (C, C++, Java, Haskell, ...). + El lenguaje C, aun siendo de alto nivel, es más cercano a la máquina, y + es el lenguaje nativo de UNIX/Linux. +\end_layout + +\begin_layout Standard +El programa +\series bold +compilador +\series default + traduce el código en un lenguaje de alto nivel a ensamblador, y el +\series bold +ensamblador +\series default + convierte este código a un +\series bold +fichero objeto +\series default +, que contiene: +\end_layout + +\begin_layout Itemize + +\series bold +Segmento de código ( +\family typewriter +.text +\family default +), +\series default + con instrucciones máquina. +\end_layout + +\begin_layout Itemize + +\series bold +Segmento de datos ( +\family typewriter +.data +\family default +), +\series default + con enteros, reales en punto flotante, cadenas de caracteres, etc. +\end_layout + +\begin_layout Itemize + +\series bold +Información de reubicación: +\series default + Para accesos a memoria, saltos, etc. + Necesaria a la hora de unir los distintos ficheros objeto. +\end_layout + +\begin_layout Standard +Una +\series bold +biblioteca +\series default + (en los apuntes pone +\series bold +librería +\series default + pero es una mala traducción) es un conjunto de módulos de código relacionados + que pueden ser usados en distintos programas. + Por ejemplo, en C existe una biblioteca estándar con funciones de E/S, + funciones matemáticas, etc., pero también existen bibliotecas para cálculo + matricial, gráficos en 3D, acceso a redes, etc. + Hay dos tipos: +\end_layout + +\begin_layout Itemize + +\series bold +Estáticas: +\series default + El código se incluye dentro del fichero ejecutable final. +\end_layout + +\begin_layout Itemize + +\series bold +Dinámicas: +\series default + El código no se incluye en el ejecutable, sino que este almacena la información + necesaria para cargar dicho código cuando va a ejecutarse. + Estas pueden ser usadas por varios ejecutables al mismo tiempo usando el + mismo espacio en memoria, y tampoco se desperdicia espacio en disco al + no tener que copiarse en cada ejecutable que las use, pero al cambiar el + ejecutable de máquina, este puede no funcionar por no tener una biblioteca + necesaria. +\end_layout + +\begin_layout Standard +El +\series bold +enlazador +\series default + o +\series bold +\emph on +linker +\series default +\emph default + une los distintos ficheros objeto generados junto con las funciones de + bibliotecas estáticas utilizadas, para generar un +\series bold +fichero ejecutable +\series default + final. + Entonces el +\series bold +cargador +\series default + o +\series bold +\emph on +loader +\series default +\emph default +, una parte del SO, lee este fichero del disco, lo ubica en memoria, realiza + las transformaciones necesarias y le pasa el control. +\end_layout + +\begin_layout Section +Ensamblador de x86-64 +\end_layout + +\begin_layout Standard +Los archivos de código ensamblador están formados por segmentos como el + segmento de datos, indicado por +\family typewriter +.data +\family default +, y el segmento de código, indicado por +\family typewriter +.text +\family default +. + En cualquier punto se puede usar una +\series bold +etiqueta +\series default + (identificador seguido de +\family typewriter +: +\family default +) para representar una dirección de memoria y referirnos a ella en otra + parte del código. +\end_layout + +\begin_layout Standard +El segmento de datos contiene directivas como +\family typewriter +.long +\begin_inset Formula $n$ +\end_inset + + +\family default +, que indica un número de 32 bits, o +\family typewriter +.string " +\begin_inset Formula $\dots$ +\end_inset + +" +\family default + que genera una secuencia de caracteres acabada en un byte 0. + El segmento de código contiene instrucciones en ensamblador. + Sus operandos pueden ser: +\end_layout + +\begin_layout Itemize + +\series bold +Registros: +\series default + Son de acceso muy rápido, al estar en la propia CPU, y contienen valores + intermedios de los cálculos. + En x86-64, son de 64 bits, y son los siguientes: +\end_layout + +\begin_deeper +\begin_layout Itemize +De uso general: +\family typewriter +RAX +\family default +, +\family typewriter +RBX +\family default +, +\family typewriter +RCX +\family default +, +\family typewriter +RDX +\family default +, +\family typewriter +R8 +\family default +– +\family typewriter +R15 +\family default +. +\end_layout + +\begin_layout Itemize +Índices: +\family typewriter +RSI +\family default +, +\family typewriter +RDI +\family default +, para acceder a posiciones de una tabla. +\end_layout + +\begin_layout Itemize +Para la pila: +\family typewriter +RSP +\family default + (puntero de pila), +\family typewriter +RBP +\family default + (puntero base de pila). +\end_layout + +\begin_layout Itemize +Puntero de instrucción: +\family typewriter +RIP +\family default +. +\end_layout + +\begin_layout Itemize +Registro de estado: +\family typewriter +RFLAGS +\family default +, contiene información sobre el estado del procesador y el resultado de + la ejecución de instrucciones, y afecta a los saltos condicionales. +\end_layout + +\begin_layout Itemize +También se puede trabajar con menos de 64 bits. + Así, +\family typewriter +EAX +\family default + son los 32 bits inferiores de +\family typewriter +RAX +\family default +, +\family typewriter +AX +\family default + los 16 bits inferiores de +\family typewriter +EAX +\family default +, +\family typewriter +AL +\family default + los 8 bits inferiores y +\family typewriter +AH +\family default + los 8 bits superiores de +\family typewriter +AX +\family default +. +\end_layout + +\begin_layout Itemize +En ensamblador, se representan con +\family typewriter +% +\emph on +nombre_en_minúsculas +\family default +\emph default +. +\end_layout + +\end_deeper +\begin_layout Itemize + +\series bold +Memoria: +\series default + Hay hasta +\begin_inset Formula $2^{64}$ +\end_inset + + celdas de memoria direccionables de 1 byte. + Realmente los programas se mueven en un espacio virtual de direcciones + que el hardware transforma a direcciones físicas. + En x86-64 se puede trabajar muchas veces directamente en memoria, sin pasar + por registros, aunque el acceso es más lento. + En ensamblador, para hacer re +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +- +\end_layout + +\end_inset + +fe +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +- +\end_layout + +\end_inset + +ren +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +- +\end_layout + +\end_inset + +cia a una dirección de memoria, se usa +\family typewriter +\emph on +dirección +\emph default +( +\emph on +%reg1 +\emph default +, +\emph on +%reg2 +\emph default +, +\emph on +potencia_de_2 +\emph default +) +\family default + para acceder a la celda +\begin_inset Formula $dirección+\%reg1+\%reg2\cdot potencia\_de\_2$ +\end_inset + +, donde la potencia de 2 debe ser pequeña y todos los campos son opcionales. + Abreviaturas: +\family typewriter +( +\emph on +%reg1 +\emph default +) +\family default +, +\family typewriter +\emph on +dirección +\family default +\emph default +\SpecialChar endofsentence + +\end_layout + +\begin_layout Itemize + +\series bold +Constantes: +\series default + Números enteros directamente en el código, que en ensamblador se escriben + +\family typewriter +$ +\begin_inset Formula $n$ +\end_inset + + +\family default +. + Se les suele llamar +\series bold +inmediatos +\series default +. +\end_layout + +\begin_layout Standard +A continuación vemos el +\series bold +repertorio de instrucciones +\series default + o ISA ( +\emph on +Instruction Set Architecture +\emph default +) de la arquitectura Intel x86-64, CISC, presente en los procesadores de + los PCs de 64 bits. + Los objetivos de un ISA son permitir que el diseño del procesador y del + compilador sean sencillos, maximizar el rendimiento y minimizar el coste. + En el caso de Intel, otro objetivo fue mantener la compatibilidad con procesado +res anteriores, lo que llevó a soluciones menos elegantes y eficientes pero + ayudó a mantener la cuota de mercado. +\end_layout + +\begin_layout Standard +Algunos tipos de instrucciones: +\end_layout + +\begin_layout Enumerate + +\series bold +Aritmético-lógicas: +\series default + +\family typewriter +add +\family default +, +\family typewriter +sub +\family default +, +\family typewriter +imul +\family default +, +\family typewriter +and +\family default +, +\family typewriter +or +\family default +, +\family typewriter +xor +\family default +, ... + +\family typewriter +\emph on +(instr.) +\emph default + +\emph on +src +\emph default +, +\emph on +dst +\family default +\emph default +. + +\begin_inset Formula $dst=dst\circ src$ +\end_inset + +. + +\end_layout + +\begin_deeper +\begin_layout Enumerate + +\series bold +Incrementos y decrementos: +\series default + +\family typewriter +inc +\family default +, +\family typewriter +dec +\family default +. + +\family typewriter +\emph on +(instr.) +\emph default + +\emph on +dst +\family default +\emph default +. + +\begin_inset Formula $dst=dst\pm1$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate + +\series bold +Desplazamiento de bits: +\series default + +\family typewriter +shr +\family default + (despl. + lógico a la der.), +\family typewriter +shl +\family default + (despl. + lógico a la izq.), +\family typewriter +sar +\family default + (despl. + aritmético a la der.), +\family typewriter +sal +\family default + (despl. + aritmético a la izq.) ... + +\family typewriter +\emph on +(instr.) +\emph default + +\emph on +n +\emph default +, +\emph on +dst +\family default +\emph default +. +\end_layout + +\end_deeper +\begin_layout Enumerate + +\series bold +De movimiento de datos: +\series default + +\family typewriter +mov +\emph on +src +\emph default +, +\emph on +dst +\family default +\emph default +. + +\begin_inset Formula $dst\leftarrow src$ +\end_inset + +. + +\end_layout + +\begin_layout Enumerate + +\series bold +Saltos incondicionales: +\series default + +\family typewriter +jmp +\emph on +pos +\family default +\emph default +. + +\begin_inset Formula $\text{\texttt{RIP}}\leftarrow pos$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate + +\series bold +Saltos condicionales: +\series default + +\family typewriter +je +\family default + ( +\begin_inset Formula $=$ +\end_inset + +), +\family typewriter +jne +\family default + ( +\begin_inset Formula $\neq$ +\end_inset + +), +\family typewriter +jg +\family default + ( +\begin_inset Formula $>$ +\end_inset + +), +\family typewriter +jge +\family default + ( +\begin_inset Formula $\geq$ +\end_inset + +), +\family typewriter +jl +\family default + ( +\begin_inset Formula $<$ +\end_inset + +), +\family typewriter +jle +\family default + ( +\begin_inset Formula $\leq$ +\end_inset + +), +\family typewriter +ja +\family default + ( +\begin_inset Formula $u>$ +\end_inset + +), +\family typewriter +jae +\family default + ( +\begin_inset Formula $u\geq$ +\end_inset + +), +\family typewriter +jb +\family default + ( +\begin_inset Formula $u<$ +\end_inset + +), +\family typewriter +jbe +\family default + ( +\begin_inset Formula $u\leq$ +\end_inset + +)... + donde +\begin_inset Formula $u$ +\end_inset + + en la notación signfica +\begin_inset Quotes cld +\end_inset + +sin signo +\begin_inset Quotes crd +\end_inset + +. + +\family typewriter +\emph on +(instr.) +\emph default + +\emph on +pos +\family default +\emph default +. + Si la instrucción anterior es +\family typewriter +cmp +\emph on +a +\emph default +, +\emph on +b +\family default +\emph default +, entonces esta hace +\begin_inset Formula $\text{\texttt{RIP}}\leftarrow pos$ +\end_inset + + si y sólo si +\begin_inset Formula $bRa$ +\end_inset + + (al revés de lo lógico). +\end_layout + +\begin_layout Standard +La +\series bold +pila +\series default + es una zona de memoria RAM gestionada como una estructura LIFO ( +\emph on +Last In First Out +\emph default +) con dos operaciones posibles: +\end_layout + +\begin_layout Itemize + +\series bold +Apilar: +\series default + +\family typewriter +push +\emph on +src +\family default +\emph default +, guarda el contenido de un registro sobre la cima de la pila. + Equivale a +\family typewriter +sub $8,%rsp +\family default + + +\family typewriter +mov +\emph on +src +\emph default +,(%rsp) +\family default +. +\end_layout + +\begin_layout Itemize + +\series bold +Desapilar: +\series default + +\family typewriter +pop +\emph on +dst +\family default +\emph default +, extrae lo que hay en la cima de la pila a un registro. + Equivale a +\family typewriter +mov (%rsp), +\emph on +dst +\family default +\emph default + + +\family typewriter +add $8,%rsp +\family default +. +\end_layout + +\begin_layout Standard +Una +\series bold +subrutina +\series default + es una secuencia de instrucciones que recibe (o no) unos parámetros, realiza + alguna acción y devuelve (o no) un resultado al código que +\begin_inset Quotes cld +\end_inset + +llamó +\begin_inset Quotes crd +\end_inset + + a la subrutina. + Para dar soporte a subrutinas se utiliza la pila, que se divide en +\series bold +marcos de pila +\series default + o +\series bold +\emph on +stack frames +\series default +\emph default +, formados por: +\end_layout + +\begin_layout Itemize + +\family typewriter +8(%rbp) +\family default +: Dirección de retorno. +\end_layout + +\begin_layout Itemize + +\family typewriter +(%rbp) +\family default +: +\family typewriter +%rbp +\family default + del marco de pila anterior. +\end_layout + +\begin_layout Itemize + +\family typewriter +- +\begin_inset Formula $\dots$ +\end_inset + +(%rbp) +\family default +: Variables locales, valores de registros guardados (usados por la subrutina + anterior). +\end_layout + +\begin_layout Itemize + +\family typewriter ++ +\begin_inset Formula $\dots$ +\end_inset + +(%rsp) +\family default +: Argumentos de salida para otras subrutinas (hasta 6 se pasan por registros). +\end_layout + +\begin_layout Standard +Manejo implícito: +\end_layout + +\begin_layout Itemize + +\family typewriter +call +\emph on +sub +\family default +\emph default +: Llama a una subrutina. + Equivale a +\family typewriter +push %rip +\family default + + +\family typewriter +jmp +\emph on +sub +\family default +\emph default +. +\end_layout + +\begin_layout Itemize + +\family typewriter +ret +\family default +: Vuelve de una subrutina. + Equivale a +\family typewriter +pop %rip +\family default +. +\end_layout + +\begin_layout Itemize + +\family typewriter +leave +\family default +: Desapila todo el marco de pila salvo la dirección de retorno y restablece + +\family typewriter +%rbp +\family default +. + Equivale a +\family typewriter +mov %rbp, %rsp +\family default + + +\family typewriter +pop %rbp +\family default +. +\end_layout + +\begin_layout Standard +Los mnemónicos vistos de instrucciones que admiten parámetros de distintos + tamaños (todos salvo saltos y manejo implícito de subrutinas) realmente + son versiones generales de otros que son iguales pero se le añade una letra + detrás al nombre de la instrucción: +\family typewriter +b +\family default + (byte) 8 bits, +\family typewriter +w +\family default + (word) 16 bits, +\family typewriter +l +\family default + (long) 32 bits y +\family typewriter +q +\family default + (quad) 64 bits. + Otros caso es el de, por ejemplo, +\family typewriter +movslq +\family default + ( +\emph on +Move Signed Long to Quad +\emph default +, mover entero con signo de 32 bits a 64). +\end_layout + +\begin_layout Section +Codificación de las instrucciones +\end_layout + +\begin_layout Standard +Las instrucciones de x86-64 (CISC) son de longitud variable, mientras que + las de MIPS 32 (RISC) son todas de 32 bits. + En x86-64, el código de operación es el primer byte, en el que a veces + se codifica el registro involucrado. +\end_layout + +\begin_layout Standard +En un fichero objeto, el código se encuentra sin reubicar, de forma que + los campos de las instrucciones correspondientes a las direcciones de memoria + están vacíos o contienen direcciones relativas. + Tras el enlazado y la carga, el programa se dice que se +\series bold +reubica +\series default +, es decir, los campos de direcciones de memoria son modificados de acuerdo + a la posición de la memoria (virtual) en la que se carga el programa. + La memoria virtual es administrada por la +\series bold +unidad de manejo de memoria +\series default + ( +\series bold +MMU +\series default +). +\end_layout + +\begin_layout Section +Herramientas de GNU +\end_layout + +\begin_layout Standard +El comando +\family typewriter +gcc +\family default + es el compilador GNU de C, el más utilizado en Linux. + El comando +\family typewriter +gcc main.c -o main +\family default + compila el archivo +\family typewriter +main.c +\family default + y genera el ejecutable +\family typewriter +main +\family default +. + Para generar sólo el código en ensamblador, usamos +\family typewriter +gcc main.c -fno-asynchronous-unwind-tables -S -o main.s +\family default +, que genera el archivo +\family typewriter +main.s +\family default + en ensamblador, donde +\family typewriter +-S +\family default + indica salida en ensamblador y +\family typewriter +-fno-asynchronous-unwind-tables +\family default + sirve para generar un código bastante más limpio que es más útil para su + estudio. +\end_layout + +\begin_layout Standard +La opción +\family typewriter +-c +\family default + indica salida como fichero objeto (sin enlazarlo). + Si hacemos +\family typewriter +gcc main.c -c -o main.o +\family default + y luego +\family typewriter +objdump -d main.o +\family default +, nos aparece una versión desensamblada del fichero objeto en el que podemos + ver cómo este se organiza. + A continuación podemos enlazar el fichero objeto con +\family typewriter +gcc main.o -o main +\family default +. + Entonces podemos usar +\family typewriter +ldd main +\family default + para ver la lista de bibliotecas dinámicas que necesita el programa y la + dirección virtual del programa a la que estas son mapeadas. + En particular, un programa sencillo necesita +\family typewriter +libc +\family default +, la biblioteca estándar de C, y +\family typewriter +linux-vdso +\family default + y +\family typewriter +linux-x86-64 +\family default +, que se corresponden con las llamadas al sistema de Linux. + La opción +\family typewriter +-static +\family default + de +\family typewriter +gcc +\family default + ( +\family typewriter +gcc -static main.o -o main +\family default +) enlaza solo con bibliotecas estáticas (lo que aumenta considerablemente + el tamaño). +\end_layout + +\begin_layout Standard +La opción +\family typewriter +-g +\family default + añade al ejecutable la información necesaria para depurar el programa (es + decir, cargarlo en memoria, reubicado, y ejecutarlo de manera controlada). + Entonces podemos usar +\family typewriter +gdb +\family default +, el depurador de GNU, llamándolo con +\family typewriter +gdb main +\family default +. + Este tiene su propio intérprete, en el cual: +\end_layout + +\begin_layout Itemize + +\family typewriter +l +\family default + lista el código original. +\end_layout + +\begin_layout Itemize + +\family typewriter +disassemble +\emph on + +\begin_inset Formula $sub$ +\end_inset + + +\family default +\emph default + lista el desensamblado de la subrutina +\begin_inset Formula $sub$ +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\family typewriter +x/ +\begin_inset Formula $n$ +\end_inset + +bx +\begin_inset Formula $tag$ +\end_inset + + +\family default + muestra los +\begin_inset Formula $n$ +\end_inset + + primeros bytes a partir de la etiqueta +\begin_inset Formula $tag$ +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\family typewriter +x/ +\begin_inset Formula $n$ +\end_inset + +w +\begin_inset Formula $tag$ +\end_inset + + +\family default + hace lo mismo pero con los +\begin_inset Formula $n$ +\end_inset + + primeros +\emph on +words +\emph default + (grupos de 4 bytes). +\end_layout + +\begin_layout Itemize + +\family typewriter +b +\begin_inset Formula $n$ +\end_inset + + +\family default + introduce un punto de interrupción ( +\emph on +breakpoint +\emph default +) en la línea +\begin_inset Formula $n$ +\end_inset + + del programa. +\end_layout + +\begin_layout Itemize + +\family typewriter +r +\family default + ejecuta el programa. +\end_layout + +\begin_layout Itemize + +\family typewriter +p +\begin_inset Formula $var$ +\end_inset + + +\family default + muestra el valor de una variable. +\end_layout + +\begin_layout Itemize + +\family typewriter +c +\family default + continúa la ejecución del programa por donde se dejó. +\end_layout + +\end_body +\end_document |
