Este libro de texto proporciona una suave introducción a la programación en lenguaje ensamblador. Lo que hace que esta introducción sea "suave" es que supone que el lector ya se siente cómodo con la codificación C o C++. Utilizamos este conocimiento asumido para tender un puente hacia la ISA (Arquitectura de conjunto de instrucciones) de bajo nivel.
Recalcamos un punto muy claro:
¡El lenguaje ensamblador no es algo que deba temer!Como se mencionó, si ya está familiarizado con C (o con lenguajes descendientes de C como C++), este libro comienza con lo que ya sabe.
Los capítulos posteriores profundizan en las esquinas y recovecos del ARM V8 ISA y son adecuados para aquellos que deseen dominar el rico conjunto de instrucciones de los procesadores ARM de 64 bits.
Sí, absolutamente.
La programación en lenguaje ensamblador depende bastante de la arquitectura de hardware subyacente. El entorno operativo anfitrión juega un papel enorme a la hora de determinar cómo se construyen los programas en lenguaje ensamblador. Una "convención de llamada" se refiere a cómo se llaman las funciones y cómo se pasan los parámetros.
Originalmente, este libro enseñaba sólo las convenciones de ARM LINUX. Sin embargo, con el tiempo, desarrollamos un conjunto de macros que hacen que sea mucho más fácil escribir código para usarlo en MacOS o LINUX.
Este enlace conducirá a una copia actual de ellos, así como a la documentación. También se incluyen macros que facilitan un poco la programación.
Este capítulo proporciona información adicional sobre la programación en lenguaje ensamblador de Apple Silicon.
Notará que utilizamos el tiempo de ejecución C directamente en lugar de realizar llamadas al sistema operativo. Entonces, por ejemplo, si queremos llamar write()
, llamamos write
desde el lenguaje ensamblador.
Esta versión de la write
de llamadas al sistema es una función contenedora integrada en el tiempo de ejecución C (CRT) que maneja los detalles de nivel inferior de la realización de una llamada al sistema. Consulte aquí sobre lo que realmente sucede dentro de estas funciones contenedoras.
El beneficio de utilizar los contenedores CRT es que existen diferencias entre las distribuciones y arquitecturas que quedan enmascaradas mediante el uso de contenedores CRT. Por lo tanto, cuando utiliza los contenedores en lugar del método directo de realizar llamadas al sistema, su código será más portátil.
Por más encomiables que sean los diseños de ARM, las convenciones de nomenclatura de ARM para sus propiedades intelectuales son horribles. En este libro, AARCH64 y ARM V8 se consideran sinónimos de la arquitectura de conjunto de instrucciones (ISA) ARM de 64 bits.
Es muy difícil encontrar documentación en el sitio de ARM porque tienen tantas versiones , tantos nombres para lo mismo y tanta documentación en general. Realmente puede resultar exasperante.
Dentro del texto proporcionaremos enlaces pertinentes según corresponda.
Aquí hay un enlace a "una" página principal del conjunto de instrucciones.
Obtener las herramientas para el desarrollo del lenguaje ensamblador es bastante sencillo; quizás ya las tenga. Usando apt
desde la terminal de Linux, diga:
sudo apt update
sudo apt install build-essential gdb
En Macintosh escriba:
xcode-select --install
en una terminal y siga las instrucciones. Tenga en cuenta que gdb
se reemplaza por lldb
con diferencias suficientes para hacerte llorar.
Entonces necesitarás tu editor favorito. Nosotros mismos usamos vi
para ediciones rápidas y Visual Studio Code para cualquier trabajo pesado.
Usamos gcc
, el "compilador" de C. También se podría utilizar g++
. En Mac, también se puede utilizar clang
.
¿Qué sentido tiene eso... usar el "compilador" para "compilar" el lenguaje ensamblador?
Bueno, para responder a eso hay que entender que la palabra "compilador" se refiere sólo a un paso en una secuencia de construcción. Lo que llamamos "compilador" es en realidad un paraguas que incluye:
Un preprocesador que actúa sobre cualquier #
comando del preprocesador como #include
. Estos comandos no forman parte de C ni de C++. Más bien son comandos para el preprocesador.
Tenga en cuenta que gcc
invocará el preprocesador C si su archivo en lenguaje ensamblador termina en .S
- S mayúscula. Puede o no invocarse si su archivo termina en minúscula s o cualquier otra extensión de archivo dependiendo de su sistema.
El compilador real , cuyo trabajo es convertir lenguajes de alto nivel como C y C++ en lenguaje ensamblador.
El ensamblador, que convierte el lenguaje ensamblador en código de máquina que aún no está listo para su ejecución.
Y finalmente, el vinculador, que combina potencialmente muchos archivos de código de máquina intermedios (llamados archivos objeto), potencialmente muchos archivos de biblioteca (.dlls vinculados estáticamente en Windows y archivos .a en Linux). El enlazador es el último paso de esta cadena.
Aquí te dejamos un vídeo que explica este proceso.
Usamos gcc y g++ directamente porque, al ser paraguas, automatizan los pasos anteriores y se vinculan automáticamente con el CRT.
Supongamos que ha implementado main()
en un archivo C (main.c) y desea utilizar un archivo en lenguaje ensamblador que haya escrito (asm.S). Se puede hacer de varias maneras.
gcc main.c asm.S
Eso es todo lo que necesitas para una construcción mínima. El programa resultante se escribirá en a.out
. Todos los archivos intermedios que se generen serán eliminados.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
Usados de esta manera, los archivos .o
se dejan en el disco. Usando el método anterior, los archivos .o
se eliminan sin que usted los vea.
Supongamos main()
está implementado en lenguaje ensamblador y main.s
es autónomo, entonces simplemente:
gcc main.S
A menudo, querrás habilitar el depurador gdb
o lldb
. Haz esto:
gcc -g main.S
Sin la opción de línea de comando -g
, es posible que su depurador no funcione correctamente.
Para repetir, si desea que gcc
ejecute su código a través del preprocesador C (para entregar #include
por ejemplo), nombre sus archivos de código fuente en lenguaje ensamblador con una S mayúscula. Entonces, en Linux:
gcc main.s
No pasará por el preprocesador C pero
gcc main.S
voluntad.
Para aclarar el punto de que el "compilador" es un paraguas, usar gcc para "compilar" un programa hace que se llame a lo siguiente en Ubuntu que se ejecuta en ARM:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
es el preprocesador de C; es una herramienta general que también pueden utilizar otros lenguajes (C++, por ejemplo).
cc1
es el compilador real.
as
que el ensamblador.
ld
es el enlazador.
Puede ver por qué utilizamos de forma predeterminada el comando paraguas en este libro.
Comenzamos proporcionando lo que llamamos "puente" de C y C++ al lenguaje ensamblador. Usamos el conocimiento que ya tienes para aprender nuevos conocimientos. ¡Qué genial es eso!
Capítulo | Reducción | |
---|---|---|
0 | Inicio rápido | Enlace |
1 | Hola Mundo | Enlace |
2 | Si declaraciones | Enlace |
3 | Bucles | |
3a | Mientras bucles | Enlace |
3b | Para bucles | Enlace |
3c | Implementando Continuar | Enlace |
3d | Implementación de pausa | Enlace |
4 | Interludios | |
4a | Registros | Enlace |
4b | Cargar y almacenar | Enlace |
4c | Más información sobre ldr | Enlace |
4d | Registrar tallas | Enlace |
4e | hexadecimal | Enlace |
5 | switch | Enlace |
6 | Funciones | |
6a | Llamar y regresar | Enlace |
6b | Pasar parámetros | Enlace |
6c | Ejemplo de llamada a algunas funciones comunes de tiempo de ejecución de C | Enlace |
7 | FizzBuzz: un programa completo | Enlace |
8 | estructuras | |
8a | Alineación | Enlace |
8b | Definiendo | Enlace |
8c | Usando | Enlace |
8d | Qué es esto" | Enlace |
9 | const | Enlace |
Las operaciones de coma flotante utilizan sus propias instrucciones y su propio conjunto de registros. Por tanto, las operaciones de punto flotante se tratan en su propia sección:
Capítulo | Reducción | |
---|---|---|
0 | Descripción general del capítulo | Enlace |
1 | ¿Qué son los números de coma flotante? | Enlace |
2 | Registros | Enlace |
3 | Truncamiento y redondeo | Enlace |
4 | Literales | Enlace |
5 | fmov | Enlace |
6 | Flotadores de media precisión | Enlace |
7 | NEON SIMD aún no escrito | Enlace |
¿Qué sería de un libro sobre lenguaje ensamblador sin ataques de bits?
Capítulo | Reducción | |
---|---|---|
1 | Campos de bits | |
1a | Sin campos de bits | Enlace |
1b | Con campos de bits | Enlace |
1c | Revisión de instrucciones recién descritas | Enlace |
2 | Endianidad | Enlace |
En esta sección, presentamos material diverso, incluida nuestra "conferencia mundialmente famosa" sobre depuración. Esta conferencia ha sido invitada en varios colegios y universidades. Está destinado a audiencias que trabajan con lenguajes como C, C++ y lenguaje ensamblador, pero algunas de las lecciones contenidas en él son aplicables a todos los lenguajes.
Capítulo | Reducción | |
---|---|---|
1 | Silicio de manzana | Enlace |
2 | Convergencia Apple/Linux | Enlace |
3 | Funciones variadas | Enlace |
4 | Debajo del capó: llamadas al sistema | Enlace |
5 | Determinación de longitudes literales de cadenas para funciones C | Enlace |
6 | Llamar al lenguaje ensamblador desde Python | Enlace |
7 | Operaciones atómicas | Enlace |
8 | Tablas de salto | Enlace |
9 | argv | CÓDIGO ASM |
10 | cerraduras giratorias | Enlace |
- | Conferencia de depuración | PPTX |
Como se indicó anteriormente, el conjunto de macros se puede encontrar aquí.
Aquí hay algunas especificaciones del proyecto para ofrecer un desafío a su creciente dominio. Aquí hay descripciones muy breves presentadas en orden alfabético.
Quizás antes de abordarlos, consulte primero el programa FIZZBUZZ completamente descrito.
Entonces prueba esto como tu primer proyecto. Con algunas líneas en blanco y comentarios, pesa 35 líneas.
El proyecto DIRENT demuestra cómo se puede utilizar una struct
compleja en lenguaje ensamblador.
El proyecto PI demuestra instrucciones de punto flotante. El programa "lanzará dardos a un objetivo", calculando una aproximación del PI mediante el seguimiento de cuántos dardos "alcanzan el objetivo" frente al número total de dardos "lanzados".
El proyecto SINE hace hincapié en las funciones y matemáticas de punto flotante.
El proyecto SNOW utiliza tecnología de la década de 1970 para animar un sistema de partículas simple. Este proyecto demuestra un proceso de diseño razonable para dividir problemas complejos en partes más simples.
Los WALKIES presentan una pequeña y linda animación que muestra un bucle con alguna desreferenciación del puntero.
La carrera de Perry Kivolowitz en Ciencias de la Computación abarca poco menos de cinco décadas. Lanzó más de 5 empresas, la mayoría relacionadas con hardware, procesamiento de imágenes y efectos visuales (para cine y televisión). Perry recibió el reconocimiento Emmy por su trabajo en The Gathering, el episodio piloto de Babylon 5. Posteriormente recibió un premio Emmy por Ingeniería junto con sus colegas de SilhouetteFX, LLC. SilhouetteFX se utiliza en casi todas las películas importantes para rotoscopia, pintura, seguimiento, reconstrucción de 2D a 3D, composición y más.
En 1996, Perry recibió un Premio de la Academia por logros científicos y técnicos por su invención de Shape Driven Warping and Morphing. Esta es la técnica responsable de muchos de los famosos efectos de Forrest Gump, Titanic y Stargate.
Veinte y tres marcan el decimonoveno año de Perry enseñando Ciencias de la Computación a nivel universitario, diez años en la UW Madison y ahora 8+ en Carthage College.
El lenguaje ensamblador es una pasión para Perry, ya que trabajó en las siguientes ISA (en orden cronológico):
Univac 1100
Corporación de equipos digitales PDP-11
Corporación de equipos digitales VAX-11
motorola 68000
ARM que comienza con AARCH64
Este trabajo está dedicado a mi esposa Sara y a mis hijos Ian y Evan.
Perry ha creado una biblioteca de alrededor de 200 proyectos de programación adecuados para las clases de CS 1, CS 2, estructuras de datos, redes, sistemas operativos y organización de computadoras. Si un editor de libros de texto de informática (u otro contenido relacionado con informática) estaría interesado en comprar la biblioteca, comuníquese con nosotros.
Además, consulte Get Off My L@wn, una novela de zombis para programadores.
Has leído bien... el programador de élite Doug Handsman se retira al norte de Wisconsin, natal de su esposa Ruth Ann. Y entonces, bueno, ocurre el apocalipsis. Gorrón.
Con una calificación de 4,3 sobre 5 y más de 70 reseñas, es una lectura divertida y cuesta casi nada.