Skip to content

Commit

Permalink
Merge branch 'main' into patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
khalidbelk authored Jun 16, 2024
2 parents bd7bf1d + 42bd36f commit a8e1e4d
Show file tree
Hide file tree
Showing 25 changed files with 2,558 additions and 14 deletions.
516 changes: 516 additions & 0 deletions code/x86-AT&T/uppercaser/uppercaser-linux.s

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions code/x86-intel/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ For more common instructions, check out the [Stanford CS107 list](https://web.st

| Instruction | Arguments | Explanation |
| --- | --- | --- |
| **mov** | src, dst | dst = src |
| **add** | src, dst | dst += src |
| **sub** | src, dst | dst -= src |
| **mov** | dst, src | dst = src |
| **add** | dst, src | dst += src |
| **sub** | dst, src | dst -= src |
| **cmp** | a, b | b-a set flags |
| **jmp** | label | jump to label |
| **je** | label | jump if equal (ZF=1) |
Expand Down Expand Up @@ -166,6 +166,7 @@ _Here are some resources I ended up using while writing the programs in this sec
- https://0xax.github.io/asm_1/
- https://rderik.com/blog/let-s-write-some-assembly-code-in-macos-for-intel-x86-64/


#### Command line params
- https://www.dreamincode.net/forums/topic/285550-nasm-linux-getting-command-line-parameters/
- https://stackoverflow.com/questions/53555298/how-to-get-arguments-from-the-command-lineassembly-nasm-ubuntu-32bit
Expand Down
7 changes: 4 additions & 3 deletions es/README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# Some Assembly Required

### Una introducción accesible para assembly.
### Una introducción accesible al assembly.

<p align="center">
<img width="375" src="https://cloud-1b2fvx8fc-hack-club-bot.vercel.app/0cover.png">
</p>
<br />

Desde siempre, he querido intentar escribir assembly, aunque sea solo para entender por qué el [creador de Rollercoaster Tycoon escribiría el 99% del juego](https://en.wikipedia.org/wiki/RollerCoaster_Tycoon_(video_game)#:~:text=Sawyer%20wrote%2099%25%20of%20the,%2C%20rendering%2C%20and%20paint%20programs.) en él. Para ser justos, incluso después de todo esto, todavía no entiendo por qué hizo eso.

Desde siempre, he querido intentar escribir assembly, aunque sea solo para entender por qué el [creador de Rollercoaster Tycoon escribiría el 99% del juego](https://en.wikipedia.org/wiki/RollerCoaster_Tycoon_(video_game)#:~:text=Sawyer%20wrote%2099%25%20of%20the,%2C%20rendering%2C%20and%20paint%20programs.) en él. Honestamente, incluso después de todo esto, todavía no entiendo por qué hizo eso.

Al embarcarme en esta búsqueda, rápidamente encontré muchos recursos dispersos y difíciles de entender. Fue necesario compilar un montón de materiales diferentes para llegar a un alto nivel de comprensión de lo que está sucediendo en mi computadora.

Expand All @@ -24,7 +25,7 @@ Finalizar esta guía toma tan solo **30 minutos**, pero también puedes llegar a
<p align="center">
<em>
<b>
<a href="/es/guía/tabla-de-contenido.md">
<a href="/es/guia/tabla-de-contenido.md">
¿Qué hay adentro? →
</a>
</b>
Expand Down
85 changes: 85 additions & 0 deletions es/guia/cpu/comunicando.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Comunicando con la CPU

Estamos acostumbrados a comunicarnos con la CPU en un lenguaje de alto nivel como JavaScript o C, pero el código que escribirías en estos lenguajes no representa directamente lo que le estás diciendo a la CPU que haga.

Es como si decidieras viajar a Grecia. Escribir en un lenguaje de alto nivel sería como comprar un paquete de viaje que lo gestionara todo por ti, como la reserva de los billetes de avión, los hoteles, la gestión de la comida o el alquiler del coche. Si quisieras gestionar esas cosas manualmente, tendrías que comprar cada cosa por separado y organizarla tú mismo.

Del mismo modo, con tu ordenador, si quieres controlar cada aspecto de lo que le pides que haga, tendrás que escribirle las instrucciones en un formato llamado lenguaje ensamblador (assembly).

El lenguaje ensamblador es el nivel más bajo de abstracción en informática, en el que el código que escribes sigue siendo legible para el ser humano. Puede que no estés de acuerdo con la parte legible por humanos cuando lo veas por primera vez, ¡pero te prometo que es mejor que lo que ve el ordenador!

¿Qué entendemos por abstracción? Bueno, una abstracción es una capa por encima de otra cosa que hace que esa cosa sea más fácil de hacer.

<p align="center">
<br />
<img height="300" src="https://cloud-lrwvwyim3-hack-club-bot.vercel.app/0wheel.png">
</p>
<br />

Por ejemplo, el volante. Un volante simplifica la conducción: sólo tienes que girar a la izquierda y a la derecha, y la cantidad que giras se corresponde con lo que giran tus neumáticos. Pero, ¿qué ocurre debajo? El volante es una capa de abstracción sobre las barras, las palancas y cualquier otra cosa que ocurra dentro del coche, que simplifica el acto de girar. O algo así. Está claro que no sé nada de coches.

En nuestro caso, el ensamblaje es el volante, y las barras, palancas y demás cosas ocultas son nuestro código máquina.

El código máquina es sólo un montón de números que el ordenador puede leer. De hecho, resulta que **todo son sólo números** por debajo. Los ordenadores sólo entienden números, así que todo lo que hacemos tiene que traducirse a números.

Así, el código máquina no es más que un montón de números que la CPU lee para averiguar qué instrucciones debe ejecutar y sobre qué datos. Es el código legible por el ordenador.

Como a los humanos nos gusta leer texto, el ensamblador es un lenguaje basado en texto, formado por siglas que representan instrucciones para el ordenador. Por desgracia, al ser texto, no son directamente legibles por la CPU. Así que ese archivo de texto se traduce, a través de algo llamado **ensamblador**, en números que el ordenador puede leer.

Es como si fueras estadounidense y le dieras a tu amigo islandés una receta de tarta. Los estadounidenses escriben las recetas en medidas imperiales (por ejemplo, tazas, cucharadas, etc.) y los islandeses, en medidas métricas (gramos, litros, etc.).

<p align="center">
<br />
<img src="https://cloud-r72u23edw-hack-club-bot.vercel.app/0recipe-resized.png">
</p>
<br />

Línea por línea, traducirías la receta hasta que tuvieras una nueva receta para tu amigo. Tomarías la primera medida, 2 tazas de harina (**lenguaje assembly**), la convertirías a gramos (**el ensamblador**), y luego escribirías la receta convertida para utilizar 136 gramos de harina (**código máquina**). Mírate, ¡tú eres el ensamblador!

Podrías saltarte todas estas travesuras del ensamblador escribiendo el código máquina directamente, pero el código máquina se parece a algo así:

```
73 137 252 73 137 245 65 85
65 84 232 52 0 0 0 232
```

Por otra parte, Assembly (lenguage ensamblador), se parece a esto:

```asm
mov r12, r13
add r12, 4
```

Sé que esto no parece muy amigable, especialmente comparado con los lenguajes de programación de alto nivel que tenemos hoy en día. Sin embargo, ¡te prometo que es mucho más amigable que escribir un montón de números!

Todos los lenguajes de programación tienen algún nivel de abstracción por encima del código máquina. Pero, al final, todo el código escrito por humanos tiene que convertirse en números para que tu CPU pueda leerlo.

<br />

---

<a href="cpu.md">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg">
<img align="left" width="70" src="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg" />
</picture>
</a>

<p align="right">
<em>
<b>
<a href="instrucciones.md">
¿Cómo funciona? →
</a>
</b>
</em>
</p>

---

<p align="center">
<a href="https://hackclub.com/">
<img width="35" src="https://cloud-l0g1cgz4b-hack-club-bot.vercel.app/0h.png"><br/>
Hecho con amor por Hack Club
</a>
</p>
99 changes: 99 additions & 0 deletions es/guia/cpu/convirtiendo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Convirtiendo una Instrucción a Código Máquina

<p align="center">
<br />
<img width="375" src="https://cloud-ksjv20zq7-hack-club-bot.vercel.app/0communicate.png">
<br />
</p>

<br />

Puede que te estés preguntando qué aspecto puede tener esto. Si es así, ¡estás de suerte! Vamos a convertir una instrucción en código máquina.

¿Recuerdas nuestros registros? Hablaremos de ellos [más adelante](/es/guia/programar/registros.md), pero para este ejemplo, sólo necesitamos recordar que son lugares donde puedes almacenar cosas temporalmente.


```asm
add r12, 4 ; Añade el número 4 al número guardado en el registro 12
```

Primero, la CPU va y obtiene la instrucción. En código máquina, esto podría terminar pareciéndose a esto (veremos lo que es [binario](/es/mates/sistema-de-numeros#binario-base-2) más tarde):

```
00000001 00001100 00000100
```

Lo que, en [base 10](#sistema-de-numeros) (¡como normalmente hablamos de números!), es:

```
1 12 4
```

Cuando el decodificador lee su primer valor, sabe que está buscando un número para asignarlo a un opcode.

| Número | Instrucción |
| ------ | ----------- |
| 1 | `add` |
| 2 | `sub` |
| ... | ... |

Ahora, digamos que el número `1` corresponde al opcode `add`. Cuando ve el `1`, sabe que está leyendo una instrucción `add`.

El decodificador sabe que el primer argumento de la instrucción `add` es ambos:

- el destino de guardado
- y la posición del primer número a sumar

El decodificador ve entonces que el siguiente dato tiene el valor `12`, por lo cual sabe que su destino es el registro 12 (`r12`). Entonces puede coger el número almacenado en `r12` para la parte matemática.

El decodificador sabe que a continuación viene el argumento para el número a sumar, que es `4`.

Luego todo esto se ejecuta. La CPU envía el número `4` y el número almacenado en el registro 12 (`r12`) a la ALU, que envía la suma de estos dos números de nuevo a la CPU. La CPU toma esta suma de la ALU y la guarda en el registro 12 (`r12`). ¡Lo conseguimos!

<br />

---

<br />

> #### Nota:
>
> Hoy en día, en lugar de un ciclo en el que cada flujo de instrucciones termina antes de que empiece el siguiente, las CPU implementan algo llamado **pipelining**.
>
> Imaginemos un almacén en el que estamos empaquetando cajas. La CPU es el almacén, y cada estación (la adición de artículos, el empaquetado y la carga en furgonetas) es un paso en el procesamiento de instrucciones (los paquetes).
>
> En el método de ciclo más simple descrito anteriormente, un paquete estaría completamente empaquetado y enviado antes de trabajar en el siguiente.
>
> Como alternativa, el pipelining utilizaría una cadena de montaje en la que un paquete pasaría por una única estación. Una vez que termina y pasa a la siguiente estación, ¡llega un nuevo paquete a esta estación! Antes de que se envíe nuestro primer paquete, ya se han empezado a llenar y empaquetar otros.
>
> Lo que esto significa para nosotros en términos de CPU es que las CPU modernas pueden buscar, descodificar y ejecutar simultáneamente diferentes instrucciones al mismo tiempo. Esto reduce drásticamente el tiempo de ejecución, lo que permite a la CPU funcionar mucho más rápido. ¡Bravo para nosotros!
<br />

---

<a href="instrucciones.md">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg">
<img align="left" width="70" src="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg" />
</picture>
</a>

<p align="right">
<em>
<b>
<a href="mundo-fisico.md">
Trasladando esto al mundo físico →
</a>
</b>
</em>
</p>

---

<p align="center">
<a href="https://hackclub.com/">
<img width="35" src="https://cloud-l0g1cgz4b-hack-club-bot.vercel.app/0h.png"><br/>
Hecho con amor por Hack Club
</a>
</p>
47 changes: 47 additions & 0 deletions es/guia/cpu/cpu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# La CPU

<p align="center">
<br />
<img height="300" src="https://cloud-iprjhyjdt-hack-club-bot.vercel.app/0processor.png">
</p>
<br />

¿Has oído hablar de las empresas Intel o AMD? Son dos empresas muy conocidas que fabrican las CPU que van en nuestros ordenadores. Todos los ordenadores que utilizamos contienen algo llamado unidad central de procesamiento, también conocida como CPU o procesador, que actúa como el cerebro del ordenador.

Los ordenadores contienen otras unidades de procesamiento (como la tarjeta gráfica) que se encargan de procesar otras cosas más específicas, pero la CPU es el motor general de todas las tareas informáticas. Dicho esto, la CPU puede hacer sorprendentemente poco. Puede:

1. Leer valores
1. Establecer valores
1. Realizar cálculos matemáticos sencillos, como sumas, restas y comparaciones.

Le das los números y se pone a trabajar para procesar los datos como tú quieras. Eso es todo. Todo lo que hace tu ordenador consiste en eso. ¿No es increíble?

<br />

---

<a href="es/guia/programar/introduccion.md">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg">
<img align="left" width="70" src="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg" />
</picture>
</a>

<p align="right">
<em>
<b>
<a href="comunicando.md">
Comuniquémonos con la CPU →
</a>
</b>
</em>
</p>

---

<p align="center">
<a href="https://hackclub.com/">
<img width="35" src="https://cloud-l0g1cgz4b-hack-club-bot.vercel.app/0h.png"><br/>
Hecho con amor por Hack Club
</a>
</p>
Loading

0 comments on commit a8e1e4d

Please sign in to comment.