├── GreenCardLEGv8.pdf
├── practico 1
├── ej01.pdf
├── ej02.pdf
├── ej03.pdf
├── ej04.pdf
├── ej05.pdf
├── ej06.pdf
├── ej07.pdf
├── ej08.pdf
├── ej09.pdf
├── ej10.pdf
└── notas.pdf
├── practico 2
├── ej01.pdf
├── ej02.pdf
├── ej03.pdf
├── ej04.pdf
├── ej05.pdf
└── notas.pdf
├── practico 3
├── ej01.pdf
├── ej02.pdf
├── ej03.pdf
├── ej04.pdf
├── ej05.pdf
├── ej06.pdf
├── ej07.pdf
├── ej08.pdf
├── ej09.pdf
├── ej10.pdf
├── ej11.pdf
├── ej12.pdf
└── ej13.pdf
├── practico 4
├── ej01.pdf
├── ej02.pdf
├── ej03.pdf
├── ej04.pdf
├── ej05.pdf
├── ej06.pdf
├── ej07.pdf
├── ej08.pdf
└── notas.pdf
├── practico 5
├── ej01.pdf
├── ej02.pdf
├── ej03.pdf
├── ej04.pdf
├── ej05.pdf
├── ej06.pdf
├── ej07.pdf
├── ej08.pdf
├── ej09.pdf
├── ej10.pdf
├── ej11.pdf
├── ej12.pdf
├── ej13.pdf
└── notas.pdf
├── lab
├── ejercicio1
│ ├── bin
│ │ └── gpiom
│ ├── descripcion.txt
│ ├── memmap
│ ├── Dockerfile
│ ├── Makefile
│ ├── app.s
│ ├── README.md
│ ├── start.s
│ └── funciones.s
├── ejercicio2
│ ├── bin
│ │ └── gpiom
│ ├── memmap
│ ├── Dockerfile
│ ├── descripcion.txt
│ ├── Makefile
│ ├── README.md
│ ├── start.s
│ ├── app.s
│ └── funciones.s
└── README.md
├── practico 6
├── assets
│ └── ESR.png
├── ej10.md
├── ej09.md
├── ej02.md
├── ej03.md
├── ej04.md
├── ej05.md
├── ej11.md
├── ej01.md
├── ej06.md
├── ej07.md
└── ej08.md
├── howToDebugAArch64GDB-dashboard.pdf
├── practico 9
├── ej01.md
├── ej05.md
├── ej02.md
├── ej10.md
├── ej09.md
├── ej07.md
├── ej04.md
├── ej06.md
├── ej11.md
├── ej03.md
├── ej08.md
└── assets
│ └── ej08.1.svg
├── practico 7
├── ej01.md
├── ej02.md
├── ej03.md
├── ej08.md
├── ej09.md
├── ej06.md
├── ej05.md
├── ej04.md
└── ej07.md
└── practico 8
├── ej09.md
├── ej03.md
├── ej01.md
├── ej04.md
├── ej02.md
├── ej06.md
├── ej10.md
├── ej05.md
├── ej08.md
└── ej07.md
/GreenCardLEGv8.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/GreenCardLEGv8.pdf
--------------------------------------------------------------------------------
/practico 1/ej01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej01.pdf
--------------------------------------------------------------------------------
/practico 1/ej02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej02.pdf
--------------------------------------------------------------------------------
/practico 1/ej03.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej03.pdf
--------------------------------------------------------------------------------
/practico 1/ej04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej04.pdf
--------------------------------------------------------------------------------
/practico 1/ej05.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej05.pdf
--------------------------------------------------------------------------------
/practico 1/ej06.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej06.pdf
--------------------------------------------------------------------------------
/practico 1/ej07.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej07.pdf
--------------------------------------------------------------------------------
/practico 1/ej08.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej08.pdf
--------------------------------------------------------------------------------
/practico 1/ej09.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej09.pdf
--------------------------------------------------------------------------------
/practico 1/ej10.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/ej10.pdf
--------------------------------------------------------------------------------
/practico 1/notas.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 1/notas.pdf
--------------------------------------------------------------------------------
/practico 2/ej01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 2/ej01.pdf
--------------------------------------------------------------------------------
/practico 2/ej02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 2/ej02.pdf
--------------------------------------------------------------------------------
/practico 2/ej03.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 2/ej03.pdf
--------------------------------------------------------------------------------
/practico 2/ej04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 2/ej04.pdf
--------------------------------------------------------------------------------
/practico 2/ej05.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 2/ej05.pdf
--------------------------------------------------------------------------------
/practico 2/notas.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 2/notas.pdf
--------------------------------------------------------------------------------
/practico 3/ej01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej01.pdf
--------------------------------------------------------------------------------
/practico 3/ej02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej02.pdf
--------------------------------------------------------------------------------
/practico 3/ej03.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej03.pdf
--------------------------------------------------------------------------------
/practico 3/ej04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej04.pdf
--------------------------------------------------------------------------------
/practico 3/ej05.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej05.pdf
--------------------------------------------------------------------------------
/practico 3/ej06.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej06.pdf
--------------------------------------------------------------------------------
/practico 3/ej07.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej07.pdf
--------------------------------------------------------------------------------
/practico 3/ej08.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej08.pdf
--------------------------------------------------------------------------------
/practico 3/ej09.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej09.pdf
--------------------------------------------------------------------------------
/practico 3/ej10.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej10.pdf
--------------------------------------------------------------------------------
/practico 3/ej11.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej11.pdf
--------------------------------------------------------------------------------
/practico 3/ej12.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej12.pdf
--------------------------------------------------------------------------------
/practico 3/ej13.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 3/ej13.pdf
--------------------------------------------------------------------------------
/practico 4/ej01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej01.pdf
--------------------------------------------------------------------------------
/practico 4/ej02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej02.pdf
--------------------------------------------------------------------------------
/practico 4/ej03.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej03.pdf
--------------------------------------------------------------------------------
/practico 4/ej04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej04.pdf
--------------------------------------------------------------------------------
/practico 4/ej05.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej05.pdf
--------------------------------------------------------------------------------
/practico 4/ej06.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej06.pdf
--------------------------------------------------------------------------------
/practico 4/ej07.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej07.pdf
--------------------------------------------------------------------------------
/practico 4/ej08.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/ej08.pdf
--------------------------------------------------------------------------------
/practico 4/notas.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 4/notas.pdf
--------------------------------------------------------------------------------
/practico 5/ej01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej01.pdf
--------------------------------------------------------------------------------
/practico 5/ej02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej02.pdf
--------------------------------------------------------------------------------
/practico 5/ej03.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej03.pdf
--------------------------------------------------------------------------------
/practico 5/ej04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej04.pdf
--------------------------------------------------------------------------------
/practico 5/ej05.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej05.pdf
--------------------------------------------------------------------------------
/practico 5/ej06.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej06.pdf
--------------------------------------------------------------------------------
/practico 5/ej07.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej07.pdf
--------------------------------------------------------------------------------
/practico 5/ej08.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej08.pdf
--------------------------------------------------------------------------------
/practico 5/ej09.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej09.pdf
--------------------------------------------------------------------------------
/practico 5/ej10.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej10.pdf
--------------------------------------------------------------------------------
/practico 5/ej11.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej11.pdf
--------------------------------------------------------------------------------
/practico 5/ej12.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej12.pdf
--------------------------------------------------------------------------------
/practico 5/ej13.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/ej13.pdf
--------------------------------------------------------------------------------
/practico 5/notas.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 5/notas.pdf
--------------------------------------------------------------------------------
/lab/ejercicio1/bin/gpiom:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/lab/ejercicio1/bin/gpiom
--------------------------------------------------------------------------------
/lab/ejercicio2/bin/gpiom:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/lab/ejercicio2/bin/gpiom
--------------------------------------------------------------------------------
/practico 6/assets/ESR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/practico 6/assets/ESR.png
--------------------------------------------------------------------------------
/howToDebugAArch64GDB-dashboard.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nachogonzaliaunc/21-OrganizacionDelComputador/HEAD/howToDebugAArch64GDB-dashboard.pdf
--------------------------------------------------------------------------------
/practico 9/ej01.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 1
2 | Marcar con una barra invertida e indicar el número de bits que representa cada una de las líneas del *data path*.
3 |
4 | 
--------------------------------------------------------------------------------
/practico 6/ej10.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 10
2 | Suponga que el registro X9 contiene un número entero representado en complemento a dos. Dar una secuencia mínima de operaciones a realizar para devolver en X10 un 1 si y sólo si el contenido de X9 es negativo.
3 |
4 | ```
5 | LSR X10, X9, #63
6 | ```
--------------------------------------------------------------------------------
/practico 9/ej05.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 5
2 | Agregando una compuerta en diagrama del data path & control, cambiar la implementación de la instrucción CBZ a CBNZ.
3 | ```
4 | Me basta con negar la salida de la ALU "ALU result"
5 | ```
6 | 
--------------------------------------------------------------------------------
/practico 6/ej09.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 9
2 | Suponga que el registro X9 contiene el Exception Syndrome Register (ESR). Dé una secuencia mínima de instrucciones LEGv8 para poner en X10 el número que codifica la clase de excepción Exception Class (EC).
3 |
4 | 
5 |
6 | ```
7 | LSR X10, X9, #26
8 | ```
--------------------------------------------------------------------------------
/lab/ejercicio1/descripcion.txt:
--------------------------------------------------------------------------------
1 | Integrantes Grupo:
2 |
3 | - Gonzalia Alvaro Tomas, 43150094
4 | - Gonzalia Ignacio Agustin, 41680508
5 | - Usaj Santiago, 41321444
6 |
7 | Descripcion del Ejercicio:
8 |
9 | El codigo realiza un dibujo de un cohete y la luna. Al presionar la tecla "W", la luna cambia de forma y tamaño. Cuando presionamos la tecla "A", el dibujo vuelve al original.
--------------------------------------------------------------------------------
/lab/ejercicio1/memmap:
--------------------------------------------------------------------------------
1 |
2 | SECTIONS
3 | {
4 | . = 0x80000;
5 | .text : { KEEP(*(.text.boot)) *(.text*) }
6 | .bss : { *(.bss*) }
7 | .bss (NOLOAD) : {
8 | . = ALIGN(16);
9 | __bss_start = .;
10 | *(.bss .bss.*)
11 | *(COMMON)
12 | __bss_end = .;
13 | }
14 | _end = .;
15 | }
16 | __bss_size = (__bss_end - __bss_start)>>3;
17 |
--------------------------------------------------------------------------------
/lab/ejercicio2/memmap:
--------------------------------------------------------------------------------
1 |
2 | SECTIONS
3 | {
4 | . = 0x80000;
5 | .text : { KEEP(*(.text.boot)) *(.text*) }
6 | .bss : { *(.bss*) }
7 | .bss (NOLOAD) : {
8 | . = ALIGN(16);
9 | __bss_start = .;
10 | *(.bss .bss.*)
11 | *(COMMON)
12 | __bss_end = .;
13 | }
14 | _end = .;
15 | }
16 | __bss_size = (__bss_end - __bss_start)>>3;
17 |
--------------------------------------------------------------------------------
/lab/ejercicio1/Dockerfile:
--------------------------------------------------------------------------------
1 | # Este Dockerfile define un container con gcc y qemu para poder correr
2 | FROM debian:buster-slim as build-env
3 | WORKDIR /root/
4 |
5 | RUN apt-get update && apt-get -y install \
6 | git \
7 | gcc-aarch64-linux-gnu \
8 | build-essential \
9 | python \
10 | pkg-config \
11 | zlib1g-dev \
12 | libglib2.0-dev \
13 | libpixman-1-dev \
14 | qemu-system-arm
15 |
16 | WORKDIR /local
17 | ENTRYPOINT ["/bin/bash"]
18 |
--------------------------------------------------------------------------------
/lab/ejercicio2/Dockerfile:
--------------------------------------------------------------------------------
1 | # Este Dockerfile define un container con gcc y qemu para poder correr
2 | FROM debian:buster-slim as build-env
3 | WORKDIR /root/
4 |
5 | RUN apt-get update && apt-get -y install \
6 | git \
7 | gcc-aarch64-linux-gnu \
8 | build-essential \
9 | python \
10 | pkg-config \
11 | zlib1g-dev \
12 | libglib2.0-dev \
13 | libpixman-1-dev \
14 | qemu-system-arm
15 |
16 | WORKDIR /local
17 | ENTRYPOINT ["/bin/bash"]
18 |
--------------------------------------------------------------------------------
/lab/ejercicio2/descripcion.txt:
--------------------------------------------------------------------------------
1 | Integrantes Grupo:
2 |
3 | - Gonzalia Alvaro Tomas, 43150094
4 | - Gonzalia Ignacio Agustin, 41680508
5 | - Usaj Santiago, 41321444
6 |
7 | Descripcion del Ejercicio:
8 |
9 | Es un "juego" donde la nave debe alunisar. Esta se controla con las teclas "WASD". Al llegar a la luna comenzara una animacion, luego de una pequeña pantalla de carga, donde se mostrara a la nave alunisar y desplegar la bandera argentina. Una vez terminada la animacion, se puede reiniciar el juego apretando "SPACE".
--------------------------------------------------------------------------------
/practico 7/ej01.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 1
2 | Para estos dos programas con entrada y salida en X0, decir que función realizan:
3 | ```
4 | SUBIS X0, X0, #0
5 | B.LT else
6 | B done
7 | else: SUB X0, XZR, X0
8 | done:
9 |
10 | // El algorítmo calcula el valor absoluto de X0.
11 | ```
12 |
13 |
14 | ```
15 | MOV X9, X0
16 | MOV X0, XZR
17 | loop: ADD X0, X0, X9
18 | SUBI X9, X9, #1
19 | CBNZ X9, loop
20 | done:
21 |
22 | // El algorítmo calcula la sumatoria de X9 hasta 0.
23 | ```
--------------------------------------------------------------------------------
/practico 8/ej09.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 9
2 | Suponiendo que el PC está en la primera palabra de memoria 0x00000000 y se desea saltar a la última instrucción de los primeros 4 GiB o sea a 0xFFFFFFFC, cuántas instrucciones B son necesarias? (no se puede usar BR).
3 | ```
4 | Recordemos, por lo visto en el ejercicio anterior, la maxima cantidad de lugares
5 | que puedo saltar con un branch es 0x07FFFFFC, entonces dividamos 0xFFFFFFFC/0x07FFFFFC
6 |
7 | 0xFFFFFFFC = 4294967292
8 | 0x07FFFFFC = 134217724
9 |
10 | 0xFFFFFFFC / 0x07FFFFFC = 32.00000092387202 (resuelto con calculadora)
11 |
12 | Entonces se necesitan 33 instrucciones B
13 | ```
--------------------------------------------------------------------------------
/practico 9/ej02.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 2
2 | Considerando la siguiente distribución de instrucciones en un programa:
3 |
4 | | R-type | I-type | LDUR | STUR | CBZ | B |
5 | |:------:|:------:|:----:|:----:|:---:|:--:|
6 | | 24% | 28% | 25% | 10% | 11% | 2% |
7 |
8 | 2.1) Qué porcentaje de todas las instrucciones utiliza data memory?
9 | ```
10 | LDUR y STUR, el 35%
11 | ```
12 |
13 | 2.2) Qué porcentaje de todas las instrucciones utiliza instruction memory?
14 | ```
15 | Todos, 100%
16 | ```
17 |
18 | 2.3) Qué porcentaje de todas las instrucciones utiliza el sign extend?
19 | ```
20 | I-type, LDUR, STUR, CBZ y B ya que admiten inmediatos, en total el 76%
21 | ```
--------------------------------------------------------------------------------
/practico 6/ej02.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 2
2 | Dadas las siguientes sentencias en assembler LEGv8:
3 | ```
4 | a) ADD X0, X1, X2
5 | b) ADDI X0, X0, #1
6 | ADD X0, X1, X2
7 | ```
8 | #### 2.1) Escribir la secuencia mínima de código “C” asumiendo que los registros X0, X1 y X2 contienen las variables f, g y h respectivamente.
9 |
10 | #### 2.2) Dar el valor de cada variable en cada instrucción assembler si f, g y h se inicializan con valores de 1, 2, 3, en base 10, respectivamente.
11 |
12 | ```c
13 | // ADD X0, X1, X2
14 |
15 | f = g + h; // f = 2 + 3 = 5
16 | ```
17 | ```c
18 | // ADDI X0, X0, #1
19 | // ADD X0, X1, X2
20 |
21 | f++; // f = f + 1 = 2
22 | f = g + h; // f = 2 + 3 = 5
23 | ```
--------------------------------------------------------------------------------
/practico 6/ej03.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 3
2 | Dadas las siguientes sentencias en “C”:
3 | ```
4 | a) f = -g - f;
5 | b) f = g + (-f - 5);
6 | ```
7 |
8 | #### 3.1) Escribir la secuencia mínima de código assembler LEGv8 asumiendo que f y g se asignan en los registros X0 y X1 respectivamente.
9 |
10 | #### 3.2) Dar el valor de cada variable en cada instrucción assembler si f y g se inicializan con valores de 4 y 5, en base 10, respectivamente.
11 |
12 | ```
13 | a) f = -g - f;
14 |
15 | ADD X0, X1, X0 // f = 5 + 4 = 9
16 | SUB X0, XZR, X0 // f = -(5 + 4) = -5 - 4 = -9
17 | ```
18 | ```
19 | b) f = g + (-f - 5);
20 |
21 | ADDI X0, X0, #5 // f = 4 + 5 = 9
22 | SUB X0, X1, X0 // f = 5 - 9 = -4
23 | ```
--------------------------------------------------------------------------------
/practico 6/ej04.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 4
2 | Dadas las siguientes sentencias en assembler LEGv8:
3 | ```
4 | a) SUB X1, XZR, X1
5 | ADD X0, X1, X2
6 |
7 | b) ADDI X2, X0, #1
8 | SUB X0, X1, X2
9 | ```
10 |
11 | #### 4.1) Escribir la secuencia mínima de código “C” asumiendo que los registros X0, X1, y X2 contienen las variables f, g, y h respectivamente.
12 |
13 | #### 4.2) Dar el valor de cada variable en cada instrucción assembler si f, g, y h se inicializan con valores de 1, 2 y 3, en base 10 respectivamente.
14 |
15 | ```c
16 | // SUB X1, XZR, X1
17 | // ADD X0, X1, X2
18 |
19 | g = -g; // g = -2
20 | f = -g + h; // f = 1
21 | ```
22 | ```c
23 | // ADDI X2, X0, #1
24 | // SUB X0, X1, X2
25 |
26 | h = f + 1; // h = 2
27 | f = g - h; // f = 0
28 | ```
--------------------------------------------------------------------------------
/practico 7/ej02.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 2
2 | Dado el siguiente programa LEGv8, dar el valor final de X10, dado que inicialmente
3 | { X10 = 0x0000000000000001 }.
4 | ```
5 | SUBIS XZR, X9, #0
6 | B.GE else
7 | B done
8 | else: ORRI X10, XZR, #2
9 | done:
10 | ```
11 | El algorítmo devuelve el resultado de la operación 0 or 2 (bit a bit) si y sólo si X9 es mayor a 0.
12 |
13 | #### 2.1) Dado que inicialmente { X9=0x0000000000101000 }.
14 | ```
15 | En éste caso, X9 > 0, entonces X10 = #2
16 | ```
17 |
18 |
19 | #### 2.2) Dado que inicialmente { X9=0x8000000000001000 }.
20 | ```
21 | En éste caso, X9 < 0 (pues X9 = 1000....0000,
22 | donde el primer bit me marca el signo),
23 | luego, X10 no cambia su valor al terminar de ejecutarse
24 | el codigo.
25 | ```
--------------------------------------------------------------------------------
/practico 6/ej05.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 5
2 | Dadas las siguientes sentencias en “C”:
3 | ```
4 | a) f = -g - A[4];
5 | b) B[8] = A[i - j];
6 | ```
7 |
8 | Escribir la secuencia mínima de código assembler LEGv8 asumiendo que f, g, i y j se asignan en los registros X0, X1, X2 y X3 respectivamente, y que la dirección base de los arreglos A y B se almacenan en los registros X6 y X7 respectivamente.
9 |
10 | ```
11 | // f = -g - A[4];
12 |
13 | SUB X0, XZR, X1 // f = -g
14 | LDUR X3, [X6, #32] // j = a[4]
15 | SUB X0, X0, X3 // f = -g - a[4]
16 | ```
17 | ```
18 | // B[8] = A[i - j];
19 |
20 | SUB X0, X2, X3 // f = i - j
21 | LSL X0, X0, #3 // f = (i - j) * 8
22 | ADD X0, X6, X0 // f = A + [(i - j) * 8]
23 | LDUR X0, [X0, #0] // f = A[i - j]
24 | STUR X0, [X7, #64] // B[8] = A[i - j]
25 | ```
--------------------------------------------------------------------------------
/practico 6/ej11.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 11
2 | Utilizar MOVZ, MOVK para cargar los registros:
3 | ```
4 | X0 = 0x1234000000000000
5 | X1 = 0xBBB0000000000AAA
6 | X2 = 0xA0A0B1B10000C2C2
7 | X3 = 0x0123456789ABCDEF
8 | ```
9 |
10 | ```
11 | MOVZ X0, 0x1234, LSL 48 // X0 = 0x1234000000000000
12 |
13 | MOVZ X1, 0xBBB0, LSL 48 // X1 = 0xBBB0000000000000
14 | MOVK X1, 0x0AAA, LSL 00 // X1 = 0xBBB0000000000AAA
15 |
16 | MOVZ X2, 0xA0A0, LSL 48 // X2 = 0xA0A0000000000000
17 | MOVK X2, 0xB1B1, LSL 32 // X2 = 0xA0A0B1B100000000
18 | MOVK X2, 0xC2C2, LSL 00 // X2 = 0xA0A0B1B10000C2C2
19 |
20 | MOVZ X3, 0x0123, LSL 48 // X3 = 0x0123000000000000
21 | MOVZ X3, 0x4567, LSL 32 // X3 = 0x0123456700000000
22 | MOVZ X3, 0x89AB, LSL 16 // X3 = 0x0123456789AB0000
23 | MOVZ X3, 0xCDEF, LSL 00 // X3 = 0x0123456789ABCDEF
24 | ```
--------------------------------------------------------------------------------
/practico 7/ej03.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 3
2 | Dado el siguiente programa “C” y la asignación
3 | i <--> X0
4 | j <--> X1
5 | k <--> X2
6 | N <--> X9,
7 | escribir el programa LEGv8 que lo implementa.
8 | Notar que como se usa el operador || la evaluación es por cortocircuito.
9 | Opcional: hacerlo con el operador | que no está cortocircuitado.
10 | ```c
11 | long i,j,k;
12 | if (i==N || j==N) {
13 | ++k;
14 | } else {
15 | ++i; ++j;
16 | }
17 | ```
18 |
19 | ```
20 | subs xzr, x0, x9 // flags = i - N
21 | b.eq addk // si i = N salto a addk
22 | subs xzr, x1, x9 // flags = j - N
23 | b.eq addk // si j = N salto a addk
24 | addi x0, x0, #1 // i++
25 | addi x1, x1, #1 // j++
26 | done // salto a done
27 | addk: addi x2, x2, #1 // k++
28 | done:
29 | ```
--------------------------------------------------------------------------------
/practico 9/ej10.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 10
2 | Supongamos que podemos construir una CPU con un ciclo de reloj variable, que se puede adaptar a la latencia de cada instrucción. Cuál sería la aceleración de esta nueva CPU sobre la anterior ([Ejercicio 8](./ej08.md)) si el mix de instrucciones de un programa es el siguiente:
3 |
4 | | R-type / I-type | LDUR | STUR | CBZ | B |
5 | |:---------------:|:----:|:----:|:---:|:--:|
6 | | 52% | 25% | 10% | 11% | 2% |
7 |
8 | * Como no tenemos implementado B, sumar el porcentaje a CBZ.
9 |
10 | ```
11 | Tiempo promedio por instrucción = 0.52*775ps + 0.25*955ps + 0.1*955ps + (0.11+0.02)*780ps
12 | = 838.65ps
13 |
14 | Aceleración de la nueva CPU = periodo original / nuevo periodo
15 | = 955ps / 838.65ps
16 | ≈ 1.139
17 | ```
--------------------------------------------------------------------------------
/practico 8/ej03.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 3
2 | Dar el tipo de instrucción, la instrucción en assembler y la representación binaria de los siguientes campos de LEGv8:
3 |
4 | #### 3.1) op=0x658, Rm=13, Rn=15, Rd=17, shamt=0
5 | ```
6 | op = 0x658 => sub
7 |
8 | La instrucción en assembler es:
9 | sub X17, X15, X13
10 |
11 | Y su representación binaria es: 11001011000011010000000111110001b
12 | opcode: 11001011000
13 | Rm: 01101
14 | shamt: 000000
15 | Rn: 01111
16 | Rd: 10001
17 | ```
18 |
19 | #### 3.2) op=0x7c2, Rn=12, Rt=3, const=0x4
20 | ```
21 | op = 0x7c2 => ldur
22 |
23 | La instrucción en assembler es:
24 | ldur x3, [x12, #4]
25 |
26 | Y su representación binaria es: 11111000010000000100000110000011b
27 | opcode: 11111000010
28 | dt_adress: 000000100
29 | op: 00
30 | Rn: 01100
31 | Rt: 00011
32 | ```
--------------------------------------------------------------------------------
/practico 8/ej01.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 1
2 | Extender los siguientes números de 26 bits en complemento a dos a 64 bits. Si el número es negativo verificar que la extensión a 64 bits codifica el mismo número original de 26 bits.
3 |
4 | #### 1.1) 00 0000 0000 0000 0000 0000 0001
5 | ```
6 | Completo el numero:
7 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
8 |
9 | Como es positivo, no debo calcular su complemento a 2.
10 | ```
11 |
12 | #### 1.2) 10 0000 0000 0000 0000 0000 0000
13 | ```
14 | Completo el numero: 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110 0000 0000 0000 0000 0000 0000
15 | Niego bit a bit: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1111 1111 1111 1111 1111 1111
16 | Sumo 1: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 0000 0000 0000 0000 0000 0000
17 |
18 | Este ultimo numero codifica el mismo numero original de 26 bits.
19 | ```
--------------------------------------------------------------------------------
/practico 6/ej01.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 1
2 | Dadas las siguientes sentencias en C:
3 | ```
4 | a) f = g + h + i + j;
5 | b) f = g + (h + 5);
6 | c) f = (g + h) + (g + h)
7 | ```
8 |
9 | #### 1.1) Escribir la secuencia **mínima** de código assembler LEGv8 asumiendo que f, g, h, i y j se asignan en los registros X0, X1, X2, X3 y X4 respectivamente.
10 |
11 | #### 1.2) Dar el valor de cada variable en cada instrucción assembler si f, g, h, i y j se inicializan con valores de 1, 2, 3, 4, 5, en base 10, respecticamente.
12 |
13 | ```
14 | a) f = g + h + i + j;
15 |
16 | ADD X0, X1, X2 // f = 2 + 3 = 5
17 | ADD X0, X0, X3 // f = 5 + 4 = 9
18 | ADD X0, X0, X4 // f = 9 + 5 = 14
19 | ```
20 | ```
21 | b) f = g + (h + 5);
22 |
23 | ADDI X0, X2, #5 // f = 3 + 5 = 8
24 | ADD X0, X1, X0 // f = 2 + 8 = 10
25 | ```
26 | ```
27 | c) f = (g + h) + (g + h)
28 |
29 | ADD X0, X1, X2 // f = 2 + 3 = 5
30 | ADD X0, X0, X0 // f = 5 + 5 = 10
31 | ```
--------------------------------------------------------------------------------
/practico 9/ej09.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 9
2 | Para la tabla de latencias del [Ejercicio 8](./ej08.md), indicar el porcentaje de aumento de la velocidad de procesamiento si quitamos de las instrucciones de carga y almacenamiento la posibilidad de desplazamiento por el operando inmediato, es decir todas las instrucciones de carga son de la forma LDUR X0, [X1].
3 | ```
4 | Si modificamos LDUR y STUR para que no haya desplazamiento, ninguna de ellas
5 | usaría la ALU. Si quitamos la ALU del camino crítico de STUR tenemos:
6 | Camino Crítico = Reg.Read + I-Mem + Register File + D-Mem + Mux + Reg.Setup
7 | = 30 + 250 + 50 + 25 + 150 + 250
8 | = 755ps
9 |
10 | Con esta modificación, la instrucción con mayor latencia será CBZ, con 780ps.
11 |
12 | Calculamos el porcentaje de aumento de la velocidad como:
13 | (periodo original / nuevo periodo) * 100% = (955ps / 780ps)*100%
14 | = 122%
15 | ```
--------------------------------------------------------------------------------
/practico 9/ej07.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 7
2 | Agregar a la implementación de la ISA la instrucción de **salto incondicional** B, a partir de una nueva señal que sale de *Control*, *denominada UncondBranch*.
3 |
4 | 
5 |
6 | - Sign-extend: debe reconocer el opcode de la instrucción B, tomar el campo de inmediato (los 25 bits menos significativos) y extender el signo (replicar 36 veces el bit 25).
7 | - Control: debe decodificar el opcode de B y generar la señal de control “Uncondbranch”, que tomará valor ‘1’ en caso de ejecutar la instrucción B y ‘0’ en cualquier otro caso.
8 |
9 | | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 | UncondBranch |
10 | |:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|:------------:|
11 | | x | x | x | 0 | 0 | 0 | 0 | x | x | 1 |
--------------------------------------------------------------------------------
/practico 9/ej04.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 4
2 | Cuando se fabrican los chips de silicio, defectos en los materiales y errores en la fabricación pueden generar circuitos defectuosos. Un defecto común es que un cable de señal se rompa y siempre registre un ‘0’ lógico. Esto se conoce comúnmente como *“stuck-at-0 fault”*.
3 |
4 | | Instr. | Reg2Loc | ALUSrc | MemtoReg |
5 | |:-------|:-------:|:------:|:--------:|
6 | | **Tipo R** | 0 | 0 | 0 |
7 | | **LDUR** | x | `1` | `1` |
8 | | **STUR** | `1` | `1` | x |
9 | | **CBZ** | `1` | 0 | x |
10 |
11 | 4.1) ¿Qué instrucciones operarían de forma incorrecta si el cable MemToReg está atascado en ‘0’?
12 | ```
13 | LDUR
14 | ```
15 |
16 | 4.2) ¿Qué instrucciones operarían de forma incorrecta si el cable ALUSrc está atascado en ‘0’?
17 | ```
18 | LDUR y STUR
19 | ```
20 |
21 | 4.3) ¿Qué instrucciones operarían de forma incorrecta si el cable Reg2Loc está atascado en ‘0’?
22 | ```
23 | STUR y CBZ
24 | ```
--------------------------------------------------------------------------------
/practico 8/ej04.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 4
2 | Transformar de binario a hexadecimal. Qué instrucciones LEGv8 representan en memoria?
3 |
4 | #### 4.1) 1000 1011 0000 0000 0000 0000 0000 0000
5 | ```
6 | Los primeros 11 bits son: 10001011000b = 0x458 => add (tipo R)
7 | Entonces:
8 | opcode: 10001011000
9 | Rm: 00000 => x0
10 | shamt: 000000
11 | Rn: 00000 => x0
12 | Rd: 00000 => x0
13 |
14 | Finalmente, la instrucción es
15 | add x0, x0, x0
16 | ```
17 |
18 | #### 4.2) 1101 0010 1011 1111 1111 1111 1110 0010
19 | ```
20 | Los primeros 11 bits son: 11010010101b = 0x695 => movz (tipo IM)
21 |
22 | El opcode tiene solo 9 bits, descartamos los dos menos significativos, entonces:
23 | opcode: 110100101
24 | LSL: 01 => lsl 16
25 | MOV_immediate: 1111111111111111 => 0xffff
26 | Rd: 00010 => x2
27 |
28 | Finalmente, la instrucción es
29 | movz x2, 0xffff, lsl 16
30 | ```
--------------------------------------------------------------------------------
/practico 6/ej06.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 6
2 | Dadas las siguientes sentencias en assembler LEGv8:
3 | ```
4 | a) LSL X2, X4, #1
5 | ADD X0, X2, X4
6 | ADD X0, X0, X4
7 | ```
8 | ```
9 | b) LSL X9, X3, #3
10 | ADD X9, X6, X9
11 | LSL X10, X4, #3
12 | ADD X10, X7, X10
13 | LDUR X12, [X9, #0]
14 | ADDI X11, X9, #8
15 | LDUR X9, [X11, #0]
16 | ADD X9, X9, X12
17 | STUR X9, [X10, #0]
18 | ```
19 | Escribir la secuencia mínima de código “C” asumiendo que los registros X0, X1, X2, X3 y X4 contienen las variables f, g, h, i y j respectivamente, y los registros X6, X7 contienen las direcciones base de los arreglos A y B.
20 |
21 | ```c
22 | h = j * 2;
23 | f = h + j; // f = 2j + j = 3j
24 | f += j; // f = 3j + j = 4j
25 |
26 | Sería lo mismo hacer:
27 | LSL X0, X4, #2
28 | ```
29 | ```c
30 | x9 = i * 8;
31 | x9 = &A + (i * 8);
32 | x10 = j * 8;
33 | x10 = &B + (j * 8);
34 | x12 = A[i];
35 | x11 = &A + (i * 8) + 8;
36 | x9 = A[i + 1];
37 | x9 = A[i + 1] + A[i];
38 | B[j] = A[i + 1] + A[i];
39 | ```
--------------------------------------------------------------------------------
/practico 8/ej02.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 2
2 | Tenemos las siguientes instrucciones en assembler LEGv8:
3 | ```
4 | ADDI X9, X9, #0
5 | STUR X10, [X11,#32]
6 | ```
7 |
8 | #### 2.1) Qué formato (R, I, D, B, CB, IM) de instrucciones son?
9 | ```
10 | ADDI X9, X9, #0 es formato I
11 | STUR X10, [X11,#32] es fotmato D
12 | ```
13 |
14 | #### 2.2) Ensamblar a código de máquina LEGv8, mostrando sus representaciones en binario y luego en hexadecimal.
15 | ```
16 | addi x9, x9, #0:
17 | opcode: 1001000100
18 | ALU i: 000000000000
19 | Rn: 01001
20 | Rd: 01001
21 |
22 | luego, addi x9, x9, #0 se codifica como
23 | 10010001000000000000000100101001b o
24 | 0x91000129
25 |
26 |
27 |
28 | stur x10, [x11,#32]
29 | opcode: 11111000000
30 | DT_adress(#32): 000100000
31 | op: 00
32 | Rn(x11): 01011
33 | Rt(x10): 01010
34 |
35 | luego, stur x10, [x11,#32] se codifica como
36 | 11111000000000100000000101101010b o
37 | 0xF802016A
38 | ```
--------------------------------------------------------------------------------
/practico 7/ej08.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 8
2 | Mostrar cómo se implementarían las siguientes pseudoinstrucciones con la mínima cantidad de instrucciones LEGv8, pudiendo usar el registro X9 para almacenar valores temporales.
3 |
4 | |Nemónico| Operación | Semántica |Instrucción| Solución |
5 | |--------|-------------------------------------|--------------------|-----------|------------------------------|
6 | | CMP |comparación |FLAGS = R[Rn]-R[Rm] | cmp a, b | subs xzr, a, b |
7 | | CMPI |comparación con operando inmediato |FLAGS = R[Rn]-ALUImm| cmpi a, #n| subis xzr, a, #n |
8 | | MOV |copia de valores entre registros |R[Rd] = R[Rn] | mov a, b | add a, b, xzr |
9 | | NOP |no-operación, el skip de LEGv8 | | nop | add xzr, xzr, xzr |
10 | | NOT |operador lógico de negación bit a bit|R[Rd] = ~R[Rn] | not a |sub a, xzr, a subi a, a, #1|
--------------------------------------------------------------------------------
/lab/ejercicio1/Makefile:
--------------------------------------------------------------------------------
1 | ARMGNU ?= aarch64-linux-gnu
2 |
3 | AOPS = -g --warn --fatal-warnings
4 | ASM_SRCS = $(wildcard *.s)
5 | ASM_OBJS = $(ASM_SRCS:%.s=%.o)
6 |
7 | .PHONY: clean
8 |
9 | all: kernel8.img
10 |
11 | %.o: %.s
12 | $(ARMGNU)-as $(AOPS) $< -o $@
13 |
14 | clean:
15 | rm -f *.o memory_map.txt kernel8.list kernel8.img kernel8.elf
16 |
17 | kernel8.img: memmap $(ASM_OBJS)
18 | $(ARMGNU)-ld $(ASM_OBJS) -T memmap -o kernel8.elf -M > memory_map.txt
19 | $(ARMGNU)-objdump -D kernel8.elf > kernel8.list
20 | $(ARMGNU)-objcopy kernel8.elf -O binary kernel8.img
21 |
22 | runQEMU: kernel8.img
23 | qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio -qtest unix:/tmp/qtest.sock,server,nowait
24 |
25 | runGPIOM: bin/gpiom
26 | ./bin/gpiom
27 |
28 | runGDB:
29 | gdb-multiarch -ex "set architecture aarch64" -ex "target remote localhost:1234" --ex "dashboard registers -style list 'x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 sp pc cpsr'"
30 |
--------------------------------------------------------------------------------
/lab/ejercicio2/Makefile:
--------------------------------------------------------------------------------
1 | ARMGNU ?= aarch64-linux-gnu
2 |
3 | AOPS = -g --warn --fatal-warnings
4 | ASM_SRCS = $(wildcard *.s)
5 | ASM_OBJS = $(ASM_SRCS:%.s=%.o)
6 |
7 | .PHONY: clean
8 |
9 | all: kernel8.img
10 |
11 | %.o: %.s
12 | $(ARMGNU)-as $(AOPS) $< -o $@
13 |
14 | clean:
15 | rm -f *.o memory_map.txt kernel8.list kernel8.img kernel8.elf
16 |
17 | kernel8.img: memmap $(ASM_OBJS)
18 | $(ARMGNU)-ld $(ASM_OBJS) -T memmap -o kernel8.elf -M > memory_map.txt
19 | $(ARMGNU)-objdump -D kernel8.elf > kernel8.list
20 | $(ARMGNU)-objcopy kernel8.elf -O binary kernel8.img
21 |
22 | runQEMU: kernel8.img
23 | qemu-system-aarch64 -M raspi3b -kernel kernel8.img -serial stdio -qtest unix:/tmp/qtest.sock,server,nowait
24 |
25 | runGPIOM: bin/gpiom
26 | ./bin/gpiom
27 |
28 | runGDB:
29 | gdb-multiarch -ex "set architecture aarch64" -ex "target remote localhost:1234" --ex "dashboard registers -style list 'x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 sp pc cpsr'"
30 |
--------------------------------------------------------------------------------
/practico 6/ej07.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 7
2 | Dadas las siguientes sentencias en assembler LEGv8:
3 | ```
4 | ADDI X9, X6, #8
5 | ADD X10, X6, XZR
6 | STUR X10, [X9, #0]
7 | LDUR X9, [X9, #0]
8 | ADD X0, X9, X10
9 | ```
10 |
11 | #### 7.1) Asumiendo que los registros X0, X6 contienen las variables f y A (dirección base del arreglo), escribir la secuencia mínima de código “C” que representa.
12 | ```c
13 | x9 = &A[1];
14 | x10 = &A[0];
15 | A[1] = &A[0];
16 | x9 = A[1];
17 | f = a[1] + &A[0];
18 |
19 | // como A[1] = &A[0], la secuencia minima en C es lo último,
20 | // reemplazando queda:
21 | f = &A[0] + &A[0];
22 | ```
23 |
24 | #### 7.2) Asumiendo que los registros X0, X6 contienen los valores 0xA, 0x100, y que la memoria contiene los valores de la tabla, encuentre el valor del registro X0 al finalizar el código assembler.
25 |
26 | | Dirección | Valor |
27 | |-----------|-------|
28 | | 0x100 | 0x64 |
29 | | 0x108 | 0xC8 |
30 | | 0x110 | 0x12C |
31 |
32 | ```
33 | f = 2 * &A[0]
34 | = 0x100 + 0x100
35 | = 0x200
36 | ```
--------------------------------------------------------------------------------
/practico 8/ej06.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 6
2 | Decidir cuáles de las siguientes instrucciones en assembler se pueden codificar en código de máquina LEGv8. Explique qué falla en las que no puedan ser ensambladas.
3 | ```
4 | 1. LSL XZR, XZR, 0 // SI. aunque la instrucción no hace nada
5 | 2. ADDI X1, X2, -1 // NO. ALU_immediate debe ser un número no signado
6 | 3. ADDI X1, X2, 4096 // NO. ALU_immediate debe poder expresarse en 12 bits, #4096 necesita 13
7 | 4. EOR X32, X31, X30 // NO. no existe registro x32
8 | 5. ORRI X24, X24, 0x1FFF // NO. ALU_immediate debe poder expresarse en 12 bits, 0x1fff necesita 13
9 | 6. STUR X9, [XZR,#-129] // SI. stur permite direcciones de memoria signadas
10 | 7. LDURB XZR, [XZR,#-1] // SI. mismo caso, ldurb permite direcciones signadas
11 | 8. LSR X16, X17, #68 // NO. shamt debe poder representarse con 6 bits. #68 necesita 7
12 | 9. MOVZ X0, 0x1010, LSL #12 // NO. el inmediato de LSL debe ser 0, 16, 32 o 48
13 | 10. MOVZ XZR, 0xFFFF, LSL #48 // SI.
14 | ```
--------------------------------------------------------------------------------
/practico 7/ej09.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 9
2 | Suponiendo que el microprocesador LEGv8 está configurado en modo LE little-endian, decir que valores toman los registros X0 a X7 al terminar este programa.
3 | ```
4 | MOVZ X9, 0xCDEF, LSL 0 // x9 = 0x0000 0000 0000 CDEF
5 | MOVK X9, 0x89AB, LSL 16 // x9 = 0x0000 0000 89AB CDEF
6 | MOVK X9, 0x4567, LSL 32 // x9 = 0x0000 4567 89AB CDEF
7 | MOVK X9, 0x0123, LSL 48 // x9 = 0x0123 4567 89AB CDEF
8 | STUR X9, [XZR, #0]
9 | LDURB X0, [XZR, #0]
10 | ⋮
11 | LDURB X7, [XZR, #7]
12 | ```
13 | ```c
14 | // Al finalizar el programa, los registros toman los siguientes valores:
15 | x0 = 0xEF
16 | x1 = 0xCD
17 | x2 = 0xAB
18 | x3 = 0x89
19 | x4 = 0x67
20 | x5 = 0x45
21 | x6 = 0x23
22 | x7 = 0x01
23 | ```
24 |
25 | *Opcional: ¿Qué valores toman los registros X0 a X7 si el microprocesador LEGv8 está configurado en modo BE big-endian?*
26 | ```c
27 | // Si el micro está configurado en modo BE,
28 | // los registros toman los siguientes valores:
29 | x0 = 0x01
30 | x1 = 0x23
31 | x2 = 0x45
32 | x3 = 0x67
33 | x4 = 0x89
34 | x5 = 0xAB
35 | x6 = 0xCD
36 | x7 = 0xEF
37 | ```
--------------------------------------------------------------------------------
/practico 6/ej08.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 8
2 | Dado el contenido de los siguientes registros:
3 |
4 | a) X9 = 0x55555555, y X10 = 0x12345678
5 |
6 | b) X9 = 0x00000000AAAAAAAA, y X10 = 0x1234567812345678
7 |
8 | #### 8.1) ¿Cuál es el valor del registro X11 luego de la ejecución del siguiente código assembler en LEGv8?
9 | ```
10 | LSL X11, X9, #4
11 | ORR X11, X11, X10
12 | ```
13 | ```
14 | a)
15 | X11 = 0x0000000055555550
16 | X11 = 0x557755778
17 |
18 | b)
19 | X11 = 0x0000000AAAAAAAA0
20 | X11 = 0x1234567ABABEFEF8
21 | ```
22 |
23 | #### 8.2) ¿Cuál es el valor del registro X11 luego de la ejecución del siguiente código assembler en LEGv8?
24 | ```
25 | LSL X11, X10, #4
26 | ANDI X11, X11, #0xFFF
27 | ```
28 | ```
29 | a)
30 | X11 = 0x0000000123456780
31 | X11 = 0x780
32 |
33 | b)
34 | X11 = 0x2345678123456780
35 | X11 = 0x780
36 | ```
37 |
38 | #### 8.3) ¿Cuál es el valor del registro X11 luego de la ejecución del siguiente código assembler en LEGv8?
39 | ```
40 | LSR X11, X9, #3
41 | ANDI X11, X11, #0x555
42 | ```
43 | ```
44 | a)
45 | X11 = 0x000000000AAAAAAA
46 | X11 = 0x0
47 |
48 | b)
49 | X11 = 0x15555555
50 | X11 = 0x555
51 | ```
--------------------------------------------------------------------------------
/practico 7/ej06.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 6
2 | Traducir el siguiente programa en “C” a ensamblador LEGv8 dada la asignación de variables a registros
3 | X0 <-> str
4 | X1 <-> found
5 | X2 <-> i
6 | X9 <-> N.
7 | El número 48 se corresponde con el carácter ‘0’ en ASCII, por lo tanto el programa cuenta la cantidad de ‘0’s que aparecen en una cadena de caracteres de longitud N.
8 | ```c
9 | #define N (1<<10)
10 | char *str;
11 | long found, i;
12 | for(found=0, i=0; i!=N; ++i)
13 | found += (str[i]==48);
14 | ```
15 |
16 | ```
17 | addi x0, xzr, #1024 // N = 1024
18 | addi x1, xzr, #0 // found = 0
19 | addi x2, xzr, #0 // i = 0
20 | add x0, x0, x2 // str = &str[i]
21 | loop: cmp x2, x9 // i = N ?
22 | B.EQ done // si i = N, salto a done
23 | add x3, x0, x2 // x3 = &str[i] + i
24 | ldur x4, [x3, #0] // x4 = str[i]
25 | cmpi x4, #48 // str[i] = 0 ?
26 | B.NE skip // si str[i] != 0, salto a skip
27 | addi x1, x1, #1 // found++
28 | skip: addi x2, x2, #1 // i++
29 | B loop // salto incondicional a loop
30 | done:
31 | ```
--------------------------------------------------------------------------------
/practico 8/ej10.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 10
2 | ¿Qué valor devuelve en X0 este programa?
3 | ```
4 | .org 0x0000
5 | MOVZ X0, 0x0400, LSL #0
6 | MOVK X0, 0x9100, LSL #16
7 | STURW X0, [XZR,#12]
8 | STURW X0, [XZR,#12]
9 | ```
10 |
11 | ```
12 | 00:MOVZ X0, 0x0400, LSL #0 // x0 = 0x0000000000000400
13 | 04:MOVK X0, 0x9100, LSL #16 // x0 = 0x0000000091000400
14 | 08:STURW X0, [XZR,#12] // en la posición de memoria 12, guardo x0
15 | 12:STURW X0, [XZR,#12] se sobreescribe ésta instrucción por 0x91000400
16 |
17 | 0x91000400 = 10010001000000000000010000000000b
18 | Veamos de que instrucción se trata:
19 | opcode: 10010001000 = 0x488 => addi (tipo I)
20 | ALU_immediate: 00000000001 => (#1)
21 | Rn: 00000 => (x0)
22 | Rd: 00000 => (x0)
23 |
24 | La operación es:
25 | addi x0, x0, #1
26 |
27 | Entonces en la posición 12 reemplazamos STURW X0, [XZR,#12] por addi x0, x0, #1
28 |
29 | MOVZ X0, 0x0400, LSL #0 // x0 = 0x0000000000000400
30 | MOVK X0, 0x9100, LSL #16 // x0 = 0x0000000091000400
31 | STURW X0, [XZR,#12]
32 | addi x0, x0, #1 // x0 = x0 + 1 = 0x91000401
33 |
34 | Al finalizar el programa, x0 = 0x91000401
35 | ```
--------------------------------------------------------------------------------
/practico 8/ej05.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 5
2 | Ejecutar el siguiente código assembler que está en memoria para dar el valor final del registro X1. El contenido de la memoria se da como una lista de pares, *dirección de memoria: contenido*, suponiendo alineamiento de memoria del tipo *big endian*. Describir sintéticamente que hace el programa.
3 | ```
4 | 0x10010000: 0x8B010029
5 | 0x10010004: 0x8B010121
6 | ```
7 |
8 | ```
9 | 0x10010000: 0x8B010029
10 |
11 | 0x8B010029 = 10001011000000010000000000101001b
12 | Los 11 primeros bits son 10001011000b = 0x458 => add (tipo R)
13 | Entonces:
14 | opcode: 10001011000
15 | Rm: 00001 => x1
16 | shamt: 000000
17 | Rn: 00001 => x1
18 | Rd: 01001 => x9
19 |
20 | La primera operación es add x9, x1, x1
21 | ```
22 | ```
23 | 0x10010004: 0x8B010121
24 |
25 | 0x8B010121 = 10001011000000010000000100100001
26 | Los 11 primeros bits son 10001011000b = 0x458 => add (tipo R)
27 |
28 | Entonces:
29 | opcode: 10001011000
30 | Rm: 00001 => x1
31 | shamt: 000000
32 | Rn: 01001 => x9
33 | Rd: 00001 => x1
34 |
35 | La segunda operación es add x1, x9, x1
36 | ```
37 | ```
38 | Entonces, el bloque de codigo
39 | 0x10010000: 0x8B010029 // add x9, x1, x1
40 | 0x10010004: 0x8B010121 // add x1, x9, x1
41 | realiza la operacion x1 = x1 * 3
42 | ```
--------------------------------------------------------------------------------
/practico 9/ej06.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 6
2 | En este ejercicio analizaremos en detalle cómo se ejecuta una instrucción en el single-cycle datapath, asumiendo que la palabra de instrucción que ejecuta el procesador es: 0xf8014062, dado que PC=0x100.
3 |
4 | 6.1) Cuáles son las salidas de los bloques *Sign-extend* y *Shift left 2* para esta palabra de instrucción?
5 | ```
6 | Primero veamos cuál es la instrucción 0xf8014062
7 |
8 | 0xf8014062 = 11111000000000010100000001100010b
9 |
10 | opcode: 111 1100 0000 = 0x7C0 => stur
11 | DT_adress: 000010100 => 20
12 | op: 00
13 | Rn: 00011 => x3
14 | Rt: 00010 => x2
15 |
16 | La operación es stur x2, [x3, #20]
17 | ```
18 |
19 | 
20 |
21 | ```
22 | Por lo tanto, la salida de Sign-extend es 20, y la de Shift left 2 es 80
23 | ```
24 |
25 |
26 |
27 | 6.2) Cuáles son los valores de entrada a la unidad ALU control para esta palabra de instrucción?
28 | ```
29 | 00, que siempre es la misma para ldur y stur
30 | ```
31 |
32 |
33 |
34 | 6.3) Cuál es la nueva dirección en el PC después de ejecutar esta instrucción?
35 |
36 | 
37 |
38 | ```
39 | 0x104
40 | ```
41 |
42 |
43 |
44 | 6.4) Mostrar los valores de las entradas y salidas de cada Mux durante la ejecución de esta instrucción. Para los valores que son salidas de Registers, utilizar “Reg[Xn]”.
45 |
46 | 
47 |
48 |
49 |
50 | 6.5) Cuáles son los valores de entrada de la ALU y las dos unidades Add?
51 |
52 | 
53 |
54 |
55 |
56 | 6.6) Cuáles son los valores de todas las entradas del bloque Registers?
57 |
58 | 
--------------------------------------------------------------------------------
/practico 9/ej11.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 11
2 | Al implementar los circuitos Control, ALU control se utilizaron muchas condiciones no-importa para simplificar la lógica. Esto produce efectos laterales. Cuando Instruction[31:21] está en el rango 0x5B8-0x5BF, obtenemos del Control:
3 |
4 | | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 |
5 | |:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|
6 | | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
7 |
8 | Mientras que de ALU control tiene una implementación utilizando condiciones no importa que produce:
9 |
10 | | ALUop1 | ALUop0 | I[31:21] | Operation |
11 | |:------:|:------:|:--------:|:---------:|
12 | | 1 | 1 | 0x5B8 | 0110 |
13 | | ⋮ | ⋮ | ⋮ | ⋮ |
14 | | 1 | 1 | 0x5BF | 0110 |
15 |
16 | Este es un típico caso de [instrucción no documentada](https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(computing)) con un comportamiento no del todo claro. Si, además, en el módulo Sign-extend esta instrucción se interpreta como un formato CB, indicar que hace esta instrucción, asignarle un mnemónico y describir la operación, a fin de completar la fila correspondiente a la nueva instrucción en la *green card*.
17 |
18 | 
19 |
20 | - 0x5B8-0x5BF es un opcode no usado en LEGv8.
21 | - No se escriben registros ni la memoria de datos.
22 | - Se leen 2 registros, ambos entran a la ALU y se hace la resta entre ellos.
23 | - Si la resta da cero (si R1 = R2), como Branch = 1, salta a lo que haya en Sign-extend con Sl2 + PC.
24 | - Como Reg2Loc = 1, los bits 9-5 se utilizan para direccionar el segundo registro. Dado que en el módulo Sign-extend esta instrucción se interpreta como un formato CB, esos bits también se utilizan como parte del campo “COND_BR_address” para calcular el desplazamiento del branch.
25 |
26 | - Operación realizada: compara y salta si el registro 1 es igual al registro 2.
27 | - Mnemónico propuesto: CBEQ
--------------------------------------------------------------------------------
/practico 8/ej08.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 8
2 | Dadas las siguientes direcciones de memoria:
3 | ```
4 | 0x00014000
5 | 0x00114524
6 | 0x0F000200
7 | ```
8 |
9 | #### 8.1) Si el valor del PC es 0x00000000, es posible llegar con una sola instrucción conditional branch a las direcciones de memoria arriba listadas?
10 | ```
11 | El campo de inmediato de conditional branch es de 19 bits
12 | CB | opcode | COND_BR_address | Rt |
13 | ³¹ ²⁴ ²³ ⁵ ⁴ ⁰
14 |
15 | La maxima cantidad de instrucciones que puedo saltar hacia adelante es 2¹⁸ - 1
16 | 2¹⁸ = 1000000000000000000b = 0x40000
17 | 2¹⁸ - 1 = 0111111111111111111b = 0x3FFFF
18 |
19 | La maxima cantidad de posiciones de memoria que puedo saltar hacia adelante es Instrucciones * 4
20 | 11111111111111111100b = 0xFFFFC
21 |
22 | Partiendo de PC = 0x00000000 se alcanza la dirección:
23 | 0x00000000 + 0x000FFFFC = 0x000FFFFC
24 |
25 | Entonces:
26 | - 0x00014000 es posible llegar con una sola instrucción
27 | - 0x00114524 no es posible llegar con una sola instrucción
28 | - 0x0F000200 no es posible llegar con una sola instrucción
29 | ```
30 |
31 | #### 8.2) Si el valor del PC es 0x00000600, es posible llegar con una sola instrucción branch a las direcciones de memoria arriba listadas?
32 | ```
33 | El campo de inmediato de branch es de 26 bits
34 | B | opcode | BR_address |
35 | ³¹ ²⁶ ²⁵ ⁰
36 |
37 | La maxima cantidad de instrucciones que puedo saltar hacia adelante es 2²⁵ - 1
38 | 2²⁵ = 10000000000000000000000000b = 0x2000000
39 | 2²⁵ - 1 = 01111111111111111111111111b = 0x1FFFFFF
40 |
41 | La maxima cantidad de posiciones de memoria que puedo saltar hacia adelante es Instrucciones * 4
42 | 0111111111111111111111111100b = 0x07FFFFFC
43 |
44 | Partiendo de PC = 0x00000600 se alcanza la dirección:
45 | 0x00000600 + 0x07FFFFFC = 0x080005FC
46 |
47 | Entonces:
48 | - 0x00014000 es posible llegar con una sola instrucción
49 | - 0x00114524 es posible llegar con una sola instrucción
50 | - 0x0F000200 no es posible llegar con una sola instrucción
51 | ```
52 |
53 | #### 8.3) Si el valor del PC es 0x00000000 y quiero saltar al primer GiB de memoria 0x40000000. Escribir exactamente 2 instrucciones contiguas que posibilitan el salto lejano (far jump).
54 | ```
55 | MOVZ X0, 0x4000, LSL 16 // precacargo la direccion en el registro X0
56 | BR X0 // salto a la direccion que contiene el registro
57 |
58 | *si el PC es distinto de 0x0, la respuesta es la misma
59 | ```
--------------------------------------------------------------------------------
/practico 7/ej05.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 5
2 |
3 | Dados los siguientes programas en LEGv8:
4 | ```c
5 | // primer algorítmo:
6 |
7 | ADD X10, XZR, XZR // x10 = 0
8 | loop: LDUR X1, [X0,#0] // x1 = &x0[0]
9 | ADD X2, X2, X1 // x2 = x2 + &x0[0]
10 | ADDI X0, X0, #8 // &x0[0] += 8 = &x0[1]
11 | ADDI X10, X10, #1 // x10 += 1
12 | CMPI X10, #100 // flags = x10 - #100
13 | B.LT loop // si x10 < 100, loop
14 | ```
15 | ```c
16 | segundo algorítmo:
17 |
18 | ADDI X10, XZR, #50 // x10 = 50
19 | loop: LDUR X1, [X0,#0] // x1 = &x0[0]
20 | ADD X2, X2, X1 // x2 += &x0[0]
21 | LDUR X1, [X0,#8] // x1 = &x0[1]
22 | ADD X2, X2, X1 // x2 += &x0[1]
23 | ADDI X0, X0, #16 // x0 += 16
24 | SUBI X10, X10, #1 // x10--
25 | CBNZ X10, loop // si x10 != 0, loop
26 | ```
27 |
28 | #### 5.1) ¿Cuántas instrucciones LEGv8 ejecuta cada uno?
29 | ```
30 | En el primer algorítmo se ejecutan 501 instrucciones
31 | (100 veces un loop de 5 instrucciones + la innicialización de x10).
32 |
33 | En el segundo algorítmo se ejecutan 351 instrucciones
34 | (50 veces un loop de 7 instrucciones + la inicialización de x10).
35 | ```
36 |
37 | #### 5.2) Reescribir en “C” dada la asignación X10 <--> i X1 <--> a X2 <--> result X0 <--> MemArray
38 | *Opcional: optimizar los códigos assembler para reducir el número de instrucciones LEGv8 ejecutadas.*
39 | ```c
40 | // primer algorítmo:
41 |
42 | i = 0;
43 | while(i < 100) {
44 | a = MemArray[0];
45 | result += a;
46 | MemArray[0] = MemArray[1];
47 | i++;
48 | }
49 | ```
50 | ```c
51 | // segundo algorítmo:
52 |
53 | i = 50;
54 | while(i != 0) {
55 | a = MemArray[0];
56 | result += a;
57 | a = MemArray[1];
58 | result += a;
59 | MemArray += 16;
60 | }
61 |
62 | /* De igual manera: */
63 | for(long i = 50; i != 0; i--) {
64 | a = MemArray[0];
65 | result += a;
66 | a = MemArray[1];
67 | result += a;
68 | MemArray += 16;
69 | }
70 |
71 | /* Reduciendo las líneas de código: */
72 | for(long i = 50; i != 0; i--) {
73 | a = MemArray[0];
74 | result += a
75 | MemArray += 8;
76 | }
77 |
78 | /* En assembler: */
79 | addi x10, xzr, #50 // x10 = 50
80 | loop: ldur x1, [x0,#0] // x1 = &x0[0]
81 | add x2, x2, x1 // x2 += &x[0]
82 | addi x1, x1, #8 // x1 = &x0[1]
83 | subis x10, x10, 1 // flags = x10 - 1
84 | B.GE loop // si x10 >= 1, vuelvo a loop
85 | done:
86 | ```
--------------------------------------------------------------------------------
/practico 7/ej04.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 4
2 |
3 | Dados los siguientes programas LEGv8:
4 | ```
5 | loop: ADDI X0, X0, #2 // x0 += 2
6 | SUBI X1, X1, #1 // x1--
7 | CBNZ X1, loop // si x1 = 0, vuelvo a loop
8 | done:
9 |
10 | // éste algorítmo calcula x1 * 2 y lo guarda en x0
11 | ```
12 | ```
13 | loop: SUBIS X1, X1, #0 // flags = x1 - 0
14 | B.LE done // si x1 <= 0, salto a done
15 | SUBI X1, X1, #1 // x1--
16 | ADDI X0, X0, #2 // x0 += 2
17 | B loop
18 | done:
19 |
20 | // es lo mismo que el primer algorítmo pero escrito de forma diferente
21 | ```
22 |
23 | #### 4.1) Dar los valores finales de X0, teniendo en cuenta que inicialmente vale { X0=0, X1=10 }.
24 | ```
25 | Al finalizar cualquiera de los dos algorítmos, x0 = 20.
26 | ```
27 |
28 | #### 4.2) Dada la asignación a X0, X1 <-> acc, i, escribir el programa “C” equivalente donde todas las variables son de tipo long.
29 | ```c
30 | long acc, i;
31 | do {
32 | acc += 2;
33 | i--;
34 | } while(x1 != 0);
35 | ```
36 | ```c
37 | long acc;
38 | for(long i = N; 0 < i; i--) {
39 | acc += 2;
40 | }
41 | ```
42 |
43 | #### 4.3) Dado que inicialmente { X1=N } ¿Cuántas instrucciones LEGv8 se ejecutan?
44 | ```
45 | Si x1 = N, se ejecutan 2N instrucciones en el primer algoritmo y
46 | 3N instrucciones en el segundo algorítmo.
47 | ```
48 |
49 | #### 4.4) Para el segundo programa. Si reemplazamos B.LE done por B.MI(branch on minus) done ¿Cuál es el valor final de X0 suponiendo que inicialmente {X0=0; X1=10}?
50 | ```
51 | loop: SUBIS X1, X1, #0 // flags = x1 - 0
52 | B.MI done // si x1 < 0, salto a done
53 | SUBI X1, X1, #1 // x1--
54 | ADDI X0, X0, #2 // x0 += 2
55 | B loop
56 | done:
57 |
58 | Acá el loop termina cuando x1 es negativo, entonces se hace una vuelta más
59 | que en el algorítmo original, por lo tanto x0 = 22 al finalizar el algorítmo.
60 | ```
61 |
62 | #### 4.5) Dada la asignación a X0, X1 <-> acc, i, escribir el programa “C” equivalente del punto “4.4”, donde todas las variables son de tipo long.
63 | ```c
64 | long acc;
65 | for(long i = N; 0 <= i; i--) {
66 | acc += 2;
67 | }
68 | ```
69 |
70 | #### 4.6) Mostrar que se puede reducir el número de instrucciones ejecutadas en el segundo programa, combinando SUBIS y SUBI.
71 | *Ayuda: agregar una instrucción por fuera del lazo. Ayuda: es lo mejor de los dos mundos ;)*
72 | ```
73 | loop: ADDI X0, X0, #2 // x0 += 2
74 | cmpi x1, #1 // flags = x1 - 1
75 | B.LE done // si x1 <= 0, salto a done
76 | B loop
77 | done:
78 | ```
--------------------------------------------------------------------------------
/practico 8/ej07.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 7
2 | Ensamblar estos delay loops.
3 | ```
4 | MOVZ X0, 0x1, LSL #48
5 | L1: SUBI X0,X0,#1
6 | CBNZ X0, L1
7 | ```
8 | ```
9 | MOVZ X0, 0x1, LSL #48 = 0xD2E00020
10 | opcode: 110100101
11 | LSL: 11
12 | MOV_immediate: 0000000000000001
13 | Rd: 00000
14 |
15 | SUBI X0,X0,#1 = 0xD1000400
16 | opcode: 1101000100
17 | ALU_immediate: 000000000001
18 | Rn: 00000
19 | Rd: 00000
20 |
21 | CBNZ X0, L1 = 0xB5FFFFE0
22 | opcode: 10110101
23 | COND_BR_address: 1111111111111111111 = -1 (porque vuelvo una operacion para atras)
24 | Rt: 00000
25 |
26 |
27 | Entonces el bloque de codigo ensamblado seria:
28 | 0xD2E00020
29 | 0xD1000400
30 | 0xB5FFFFE0
31 | ```
32 |
33 |
66 |
67 | ```
68 | MOVZ X0, 0x2, LSL #16
69 | L1: SUBIS XZR,X0,#0
70 | B.EQ EXIT
71 | SUBI X0,X0,#1
72 | B L1
73 | EXIT:
74 | ```
75 | ```
76 | MOVZ X0, 0x2, LSL #16 = 0xD2A00040
77 | opcode: 110100101
78 | LSL: 01
79 | MOV_immediate: 0000000000000010
80 | Rd: 00000
81 |
82 | SUBIS XZR,X0,#0 = 0xF100001F
83 | opcode: 1111000100
84 | ALU_immediate: 000000000000
85 | Rn: 00000
86 | Rd: 11111
87 |
88 | B.EQ EXIT = 0x54000060
89 | opcode: 01010100
90 | COND_BR_address: 0000000000000000011 = 3 (porque salto 3 operaciones)
91 | Rt: 00000
92 |
93 | SUBI X0,X0,#1 = 0xD1000400
94 | opcode: 1101000100
95 | ALU_immediate: 000000000001
96 | Rn: 00000
97 | Rd: 00000
98 |
99 | B L1 = 0x17FFFFFD
100 | opcode: 000101
101 | BR_address: 11111111111111111111111101 = -3 (porque vuelvo 3 operaciones para atras)
102 |
103 |
104 | Entonces el bloque de codigo ensamblado seria:
105 | 0xD2A00040
106 | 0xF100001F
107 | 0x54000060
108 | 0xD1000400
109 | 0x17FFFFFD
110 | ```
--------------------------------------------------------------------------------
/practico 9/ej03.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 3
2 | Completar la tabla con el estado de las señales.
3 | Indicar con X las condiciones no-importa.
4 |
5 | | Instr. | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 | ALUop |
6 | |:-------|:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|:-----:|
7 | | **Tipo R** | | | | | | | | | | 10 |
8 | | **LDUR** | | | | | | | | | | 00 |
9 | | **STUR** | | | | | | | | | | 00 |
10 | | **CBZ** | | | | | | | | | | 01 |
11 |
12 |
13 |
14 |
15 |
16 | 
17 | | Instr. | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 |
18 | |:-------|:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|
19 | | **Tipo R** | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
20 |
21 |
22 |
23 |
24 |
25 | 
26 | | Instr. | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 |
27 | |:-------|:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|
28 | | **LDUR** | x | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
29 |
30 |
31 |
32 |
33 |
34 | 
35 | | Instr. | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 |
36 | |:-------|:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|
37 | | **STUR** | 1 | 1 | x | 0 | 0 | 1 | 0 | 0 | 0 |
38 |
39 |
40 |
41 |
42 |
43 | 
44 | | Instr. | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 |
45 | |:-------|:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|
46 | | **CBZ**| 1 | 0 | x | 0 | 0 | 0 | 1 | 0 | 1 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | Entonces, la tabla queda de la siguiente manera:
54 | | Instr. | Reg2Loc | ALUSrc | MemtoReg | RegWrite | MemRead | MemWrite | Branch | ALUop1 | ALUop0 |
55 | |:-------|:-------:|:------:|:--------:|:--------:|:-------:|:--------:|:------:|:------:|:------:|
56 | | **Tipo R** | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
57 | | **LDUR** | x | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
58 | | **STUR** | 1 | 1 | x | 0 | 0 | 1 | 0 | 0 | 0 |
59 | | **CBZ**| 1 | 0 | x | 0 | 0 | 0 | 1 | 0 | 1 |
60 |
--------------------------------------------------------------------------------
/lab/ejercicio1/app.s:
--------------------------------------------------------------------------------
1 | //---------------- Inicio Carga Parametros ------------------------------------
2 |
3 | .equ SCREEN_WIDTH, 640
4 | .equ SCREEN_HEIGH, 480
5 | .equ BITS_PER_PIXEL, 32
6 |
7 | .equ GPIO_BASE, 0x3f200000
8 | .equ GPIO_GPFSEL0, 0x00
9 | .equ GPIO_GPLEV0, 0x34
10 |
11 | // Incluimos el archivo donde estan todas las funciones
12 | .include "funciones.s"
13 |
14 | // Los inputs para este programa son:
15 | // W,A
16 |
17 | .equ key_W, 0x2
18 | .equ key_A, 0x4
19 |
20 | .globl main
21 |
22 | main:
23 | // x0 contiene la direccion base del framebuffer
24 | mov x20, x0 // Guarda la dirección base del framebuffer en x20
25 |
26 | //---------------- Fin Carga Parametros ------------------------------------
27 |
28 | reseteo:
29 | //---------------- Inicio Dibujo ------------------------------------
30 |
31 | // Llamamos a todas las funciones encargadas de realizar el dibujo
32 |
33 | BL pintar_fondo
34 |
35 | BL cohete
36 |
37 | BL cabeza_cohete
38 |
39 | BL ventanillas
40 |
41 | BL luces
42 |
43 | BL propulsores
44 |
45 | BL estrellas
46 |
47 | BL luna
48 |
49 | //---------------- Fin Dibujo ------------------------------------
50 |
51 | //---------------- Inicio Lectura Inputs ------------------------------------
52 |
53 | // Debo realizar un loop que este todo el tiempo verificando si se pulsa una tecla
54 |
55 | loop_pulsador:
56 |
57 | // Seteamos el GPIO para poder realizar la lectura de los inputs
58 | mov x9, GPIO_BASE
59 |
60 | // Atención: se utilizan registros w porque la documentación de broadcom
61 | // indica que los registros que estamos leyendo y escribiendo son de 32 bits
62 |
63 | // Setea gpios 0 - 9 como lectura
64 | str wzr, [x9, GPIO_GPFSEL0]
65 |
66 | // Lee el estado de los GPIO 0 - 31
67 | ldr w10, [x9, GPIO_GPLEV0]
68 |
69 | // And bit a bit mantiene el resultado del bit 2 en w10 (notar 0b... es binario)
70 | // al inmediato se lo refiere como "máscara" en este caso:
71 | // - Al hacer AND revela el estado del bit 2
72 | // - Al hacer OR "setea" el bit 2 en 1
73 | // - Al hacer AND con el complemento "limpia" el bit 2 (setea el bit 2 en 0)
74 |
75 | and w11, w10, 0b00000010
76 | and w12, w10, 0b00000100
77 |
78 | // si w11 es 0 entonces el GPIO 1 estaba liberado
79 | // de lo contrario será distinto de 0, (en este caso particular 2)
80 | // significando que el GPIO 1 fue presionado
81 |
82 | cmp w11 , key_W // Al presionar la tecla "W" la luna cambia de tamaño
83 | beq cambiar_Luna
84 |
85 | cmp w12 , key_A // Al presionar la tecla "A" se resetea el dibujo
86 | beq reseteo
87 |
88 | b loop_pulsador
89 |
90 | //---------------- Fin Lectura Inputs ------------------------------------
91 |
92 | //---------------- Inicio Modificacion ------------------------------------
93 |
94 | cambiar_Luna:
95 |
96 | // LLamo a la funcion que cambia la luna y luego vuelvo al loop del pulsador
97 |
98 | BL bigLuna
99 |
100 | B loop_pulsador
101 |
102 | //---------------- Fin Modificacion ------------------------------------
103 |
104 | //---------------- Infinite Loop ------------------------------------
105 | InfLoop:
106 | b InfLoop
107 |
--------------------------------------------------------------------------------
/practico 9/ej08.md:
--------------------------------------------------------------------------------
1 | ## Ejercicio 8
2 | Suponiendo que los diferentes bloques dentro del procesador tienen las siguientes **latencias**:
3 |
4 | | I-Mem / D-Mem | Register File | Mux | ALU | Adder | Single gate | Register Read | Register Setup | Sign extend | Control | Sl2 |
5 | |:-------------:|:-------------:|:-----:|:------:|:------:|:-----------:|:-------------:|:--------------:|:-----------:|:-------:|:-----:|
6 | | 250 ps | 150 ps | 25 ps | 200 ps | 150 ps | 5 ps | 30 ps | 20 ps | 50 ps | 50 ps | 25 ps |
7 |
8 | 8.1) Cuál es la latencia si lo único que tuviera que hacer el procesador es fetch de instrucciones consecutivas?
9 |
10 | **Latencia de fetch** = RegRead + Imem = 30 + 250 = **280ps**
11 |
12 | 
13 |
14 | - Register read: tiempo posterior al flanco ascendente de reloj, necesario para que el nuevo valor de registro aparezca en la salida. Este valor se aplica sólo al PC.
15 | - Register setup: tiempo que la entrada de datos de un registro debe permanecer estable antes del flanco ascendente de reloj. Este valor se aplica tanto al PC como al Register File.
16 |
17 |
18 |
19 | 8.2) Hay un modo alternativo de generar la señal Reg2Loc fácilmente de la instrucción sin tener que esperar la latencia de Control. Explicar cómo sería.
20 | ```
21 | El bit 28 de las instrucciones contiene el valor correcto para la línea de control Reg2Loc
22 | ```
23 |
24 |
25 |
26 | 8.3) Cuál es la latencia si solo hubiera instrucciones de tipo R?
27 | ```
28 | Latencia de una instrucción tipo R = RegRead + I-Mem + Control + Mux + RegFile + Mux + ALU + Mux + RegSetup
29 | = 30 + 250 + 50 + 25 + 150 + 25 + 200 + 25 + 20
30 | = 775ps
31 | ```
32 |
33 |