From 5a208bb3074171638855994cfef0eb32ba111156 Mon Sep 17 00:00:00 2001 From: ModernityRejecter Date: Wed, 29 Apr 2026 13:10:50 +0300 Subject: [PATCH 1/4] Restructure repository, translate README to English, and add CI workflow --- .github/workflows/ci.yml | 28 + Makefile | 21 + README.md | 73 +- .../checker.py | 195 -- .../generator.py | 55 - TEMA GATA DE FOLOSIT/checker.py | 195 -- TEMA GATA DE FOLOSIT/generator.py | 55 - TEMA GATA DE FOLOSIT/task1 | Bin 17784 -> 0 bytes TEMA GATA DE FOLOSIT/task2 | Bin 1065724 -> 0 bytes TEMA GATA DE FOLOSIT/tests/task1/add/1.in | 13 - TEMA GATA DE FOLOSIT/tests/task1/add/1.out | 5 - TEMA GATA DE FOLOSIT/tests/task1/add/2.in | 55 - TEMA GATA DE FOLOSIT/tests/task1/add/2.out | 23 - TEMA GATA DE FOLOSIT/tests/task1/add/3.in | 13 - TEMA GATA DE FOLOSIT/tests/task1/add/3.out | 5 - TEMA GATA DE FOLOSIT/tests/task1/add/4.in | 13 - TEMA GATA DE FOLOSIT/tests/task1/add/4.out | 3 - TEMA GATA DE FOLOSIT/tests/task1/add/5.in | 513 ---- TEMA GATA DE FOLOSIT/tests/task1/add/5.out | 255 -- TEMA GATA DE FOLOSIT/tests/task1/add/6.in | 563 ----- TEMA GATA DE FOLOSIT/tests/task1/add/6.out | 241 -- .../tests/task1/add_delete/1.in | 57 - .../tests/task1/add_delete/1.out | 29 - .../tests/task1/add_delete/2.in | 213 -- .../tests/task1/add_delete/2.out | 502 ---- .../tests/task1/add_delete/3.in | 253 -- .../tests/task1/add_delete/3.out | 746 ------ TEMA GATA DE FOLOSIT/tests/task1/add_get/1.in | 35 - .../tests/task1/add_get/1.out | 15 - TEMA GATA DE FOLOSIT/tests/task1/add_get/2.in | 9 - .../tests/task1/add_get/2.out | 3 - TEMA GATA DE FOLOSIT/tests/task1/add_get/3.in | 387 --- .../tests/task1/add_get/3.out | 163 -- .../tests/task1/add_get_delete/1.in | 27 - .../tests/task1/add_get_delete/1.out | 17 - .../tests/task1/add_get_delete/2.in | 219 -- .../tests/task1/add_get_delete/2.out | 453 ---- .../tests/task1/add_get_delete/3.in | 265 -- .../tests/task1/add_get_delete/3.out | 384 --- .../tests/task1/add_get_delete/4.in | 209 -- .../tests/task1/add_get_delete/4.out | 157 -- .../task1/add_get_delete_defragmentation/1.in | 33 - .../add_get_delete_defragmentation/1.out | 31 - .../task1/add_get_delete_defragmentation/2.in | 493 ---- .../add_get_delete_defragmentation/2.out | 1856 -------------- .../task1/add_get_delete_defragmentation/3.in | 513 ---- .../add_get_delete_defragmentation/3.out | 2130 ----------------- .../task1/add_get_delete_defragmentation/4.in | 173 -- .../add_get_delete_defragmentation/4.out | 119 - .../task1/add_get_delete_defragmentation/5.in | 211 -- .../add_get_delete_defragmentation/5.out | 123 - TEMA GATA DE FOLOSIT/tests/task2/add/1.in | 55 - TEMA GATA DE FOLOSIT/tests/task2/add/1.out | 22 - TEMA GATA DE FOLOSIT/tests/task2/add/2.in | 527 ---- TEMA GATA DE FOLOSIT/tests/task2/add/2.out | 223 -- TEMA GATA DE FOLOSIT/tests/task2/add/3.in | 529 ---- TEMA GATA DE FOLOSIT/tests/task2/add/3.out | 224 -- TEMA GATA DE FOLOSIT/tests/task2/add/4.in | 543 ----- TEMA GATA DE FOLOSIT/tests/task2/add/4.out | 231 -- .../tests/task2/add_get_delete/1.in | 65 - .../tests/task2/add_get_delete/1.out | 49 - .../tests/task2/add_get_delete/2.in | 245 -- .../tests/task2/add_get_delete/2.out | 309 --- .../tests/task2/add_get_delete/3.in | 319 --- .../tests/task2/add_get_delete/3.out | 682 ------ .../tests/task2/add_get_delete/4.in | 187 -- .../tests/task2/add_get_delete/4.out | 302 --- .../task2/add_get_delete_defragmentation/1.in | 55 - .../add_get_delete_defragmentation/1.out | 75 - .../task2/add_get_delete_defragmentation/2.in | 176 -- .../add_get_delete_defragmentation/2.out | 585 ----- .../task2/add_get_delete_defragmentation/3.in | 187 -- .../add_get_delete_defragmentation/3.out | 648 ----- .../task2/add_get_delete_defragmentation/4.in | 168 -- .../add_get_delete_defragmentation/4.out | 405 ---- Tema (deja compilata)/task1 | Bin 17784 -> 0 bytes Tema (deja compilata)/task2 | Bin 1065724 -> 0 bytes ... de Calcul (ASC) - Tema Laborator 2024.pdf | Bin .../checker.py | 0 .../generator.py | 0 {Tema (source code) => src}/task1.s | 0 {Tema (source code) => src}/task2.s | 0 .../tests => tests}/task1/add/1.in | 0 .../tests => tests}/task1/add/1.out | 0 .../tests => tests}/task1/add/2.in | 0 .../tests => tests}/task1/add/2.out | 0 .../tests => tests}/task1/add/3.in | 0 .../tests => tests}/task1/add/3.out | 0 .../tests => tests}/task1/add/4.in | 0 .../tests => tests}/task1/add/4.out | 0 .../tests => tests}/task1/add/5.in | 0 .../tests => tests}/task1/add/5.out | 0 .../tests => tests}/task1/add/6.in | 0 .../tests => tests}/task1/add/6.out | 0 .../tests => tests}/task1/add_delete/1.in | 0 .../tests => tests}/task1/add_delete/1.out | 0 .../tests => tests}/task1/add_delete/2.in | 0 .../tests => tests}/task1/add_delete/2.out | 0 .../tests => tests}/task1/add_delete/3.in | 0 .../tests => tests}/task1/add_delete/3.out | 0 .../tests => tests}/task1/add_get/1.in | 0 .../tests => tests}/task1/add_get/1.out | 0 .../tests => tests}/task1/add_get/2.in | 0 .../tests => tests}/task1/add_get/2.out | 0 .../tests => tests}/task1/add_get/3.in | 0 .../tests => tests}/task1/add_get/3.out | 0 .../tests => tests}/task1/add_get_delete/1.in | 0 .../task1/add_get_delete/1.out | 0 .../tests => tests}/task1/add_get_delete/2.in | 0 .../task1/add_get_delete/2.out | 0 .../tests => tests}/task1/add_get_delete/3.in | 0 .../task1/add_get_delete/3.out | 0 .../tests => tests}/task1/add_get_delete/4.in | 0 .../task1/add_get_delete/4.out | 0 .../task1/add_get_delete_defragmentation/1.in | 0 .../add_get_delete_defragmentation/1.out | 0 .../task1/add_get_delete_defragmentation/2.in | 0 .../add_get_delete_defragmentation/2.out | 0 .../task1/add_get_delete_defragmentation/3.in | 0 .../add_get_delete_defragmentation/3.out | 0 .../task1/add_get_delete_defragmentation/4.in | 0 .../add_get_delete_defragmentation/4.out | 0 .../task1/add_get_delete_defragmentation/5.in | 0 .../add_get_delete_defragmentation/5.out | 0 .../tests => tests}/task2/add/1.in | 0 .../tests => tests}/task2/add/1.out | 0 .../tests => tests}/task2/add/2.in | 0 .../tests => tests}/task2/add/2.out | 0 .../tests => tests}/task2/add/3.in | 0 .../tests => tests}/task2/add/3.out | 0 .../tests => tests}/task2/add/4.in | 0 .../tests => tests}/task2/add/4.out | 0 .../tests => tests}/task2/add_get_delete/1.in | 0 .../task2/add_get_delete/1.out | 0 .../tests => tests}/task2/add_get_delete/2.in | 0 .../task2/add_get_delete/2.out | 0 .../tests => tests}/task2/add_get_delete/3.in | 0 .../task2/add_get_delete/3.out | 0 .../tests => tests}/task2/add_get_delete/4.in | 0 .../task2/add_get_delete/4.out | 0 .../task2/add_get_delete_defragmentation/1.in | 0 .../add_get_delete_defragmentation/1.out | 0 .../task2/add_get_delete_defragmentation/2.in | 0 .../add_get_delete_defragmentation/2.out | 0 .../task2/add_get_delete_defragmentation/3.in | 0 .../add_get_delete_defragmentation/3.out | 0 .../task2/add_get_delete_defragmentation/4.in | 0 .../add_get_delete_defragmentation/4.out | 0 148 files changed, 103 insertions(+), 18857 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 Makefile delete mode 100644 Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/checker.py delete mode 100644 Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/generator.py delete mode 100644 TEMA GATA DE FOLOSIT/checker.py delete mode 100644 TEMA GATA DE FOLOSIT/generator.py delete mode 100644 TEMA GATA DE FOLOSIT/task1 delete mode 100644 TEMA GATA DE FOLOSIT/task2 delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/4.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/4.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/5.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/5.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/6.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add/6.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_delete/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_delete/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_delete/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_delete/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_delete/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_delete/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/4.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete/4.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/4.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/4.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/5.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task1/add_get_delete_defragmentation/5.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/4.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add/4.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/4.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete/4.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/1.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/1.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/2.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/2.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/3.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/3.out delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/4.in delete mode 100644 TEMA GATA DE FOLOSIT/tests/task2/add_get_delete_defragmentation/4.out delete mode 100644 Tema (deja compilata)/task1 delete mode 100644 Tema (deja compilata)/task2 rename {Cerinta temei => docs}/Arhitectura Sistemelor de Calcul (ASC) - Tema Laborator 2024.pdf (100%) rename {Scripturi de verificare pentru Linux sau masina virtuala de Linux => scripts}/checker.py (100%) rename {Scripturi de verificare pentru Linux sau masina virtuala de Linux => scripts}/generator.py (100%) rename {Tema (source code) => src}/task1.s (100%) rename {Tema (source code) => src}/task2.s (100%) rename {Date de intrare/tests => tests}/task1/add/1.in (100%) rename {Date de intrare/tests => tests}/task1/add/1.out (100%) rename {Date de intrare/tests => tests}/task1/add/2.in (100%) rename {Date de intrare/tests => tests}/task1/add/2.out (100%) rename {Date de intrare/tests => tests}/task1/add/3.in (100%) rename {Date de intrare/tests => tests}/task1/add/3.out (100%) rename {Date de intrare/tests => tests}/task1/add/4.in (100%) rename {Date de intrare/tests => tests}/task1/add/4.out (100%) rename {Date de intrare/tests => tests}/task1/add/5.in (100%) rename {Date de intrare/tests => tests}/task1/add/5.out (100%) rename {Date de intrare/tests => tests}/task1/add/6.in (100%) rename {Date de intrare/tests => tests}/task1/add/6.out (100%) rename {Date de intrare/tests => tests}/task1/add_delete/1.in (100%) rename {Date de intrare/tests => tests}/task1/add_delete/1.out (100%) rename {Date de intrare/tests => tests}/task1/add_delete/2.in (100%) rename {Date de intrare/tests => tests}/task1/add_delete/2.out (100%) rename {Date de intrare/tests => tests}/task1/add_delete/3.in (100%) rename {Date de intrare/tests => tests}/task1/add_delete/3.out (100%) rename {Date de intrare/tests => tests}/task1/add_get/1.in (100%) rename {Date de intrare/tests => tests}/task1/add_get/1.out (100%) rename {Date de intrare/tests => tests}/task1/add_get/2.in (100%) rename {Date de intrare/tests => tests}/task1/add_get/2.out (100%) rename {Date de intrare/tests => tests}/task1/add_get/3.in (100%) rename {Date de intrare/tests => tests}/task1/add_get/3.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/1.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/1.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/2.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/2.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/3.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/3.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/4.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete/4.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/1.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/1.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/2.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/2.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/3.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/3.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/4.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/4.out (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/5.in (100%) rename {Date de intrare/tests => tests}/task1/add_get_delete_defragmentation/5.out (100%) rename {Date de intrare/tests => tests}/task2/add/1.in (100%) rename {Date de intrare/tests => tests}/task2/add/1.out (100%) rename {Date de intrare/tests => tests}/task2/add/2.in (100%) rename {Date de intrare/tests => tests}/task2/add/2.out (100%) rename {Date de intrare/tests => tests}/task2/add/3.in (100%) rename {Date de intrare/tests => tests}/task2/add/3.out (100%) rename {Date de intrare/tests => tests}/task2/add/4.in (100%) rename {Date de intrare/tests => tests}/task2/add/4.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/1.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/1.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/2.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/2.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/3.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/3.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/4.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete/4.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/1.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/1.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/2.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/2.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/3.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/3.out (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/4.in (100%) rename {Date de intrare/tests => tests}/task2/add_get_delete_defragmentation/4.out (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ca52fc8 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,28 @@ +name: CI - Test Assembly Implementation + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc-multilib make python3 + + - name: Build project + run: make + + - name: Run Task 1 Tests + run: python3 scripts/checker.py task1 + + - name: Run Task 2 Tests + run: python3 scripts/checker.py task2 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..351cdfd --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +# Compiler and flags +AS = gcc +ASFLAGS = -m32 -no-pie + +# Directories +SRC_DIR = src +BIN_DIR = . + +# Targets +all: task1 task2 + +task1: $(SRC_DIR)/task1.s + $(AS) $(ASFLAGS) $< -o $(BIN_DIR)/$@ + +task2: $(SRC_DIR)/task2.s + $(AS) $(ASFLAGS) $< -o $(BIN_DIR)/$@ + +clean: + rm -f task1 task2 + +.PHONY: all clean diff --git a/README.md b/README.md index 4888e9c..ddc57f7 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,63 @@ -# Informatii utile +# Contiguous Memory Allocation Simulator (x86 Assembly) -Rezolvarea temei de laborator la materia Arhitectura sistemelor de calcul din anul universitar 2024 - 2025 Universitatea Bucuresti. +This repository contains an x86 (32-bit) assembly implementation of a contiguous memory allocation system. It simulates how an operating system manages memory blocks or how a file system allocates space on a disk. -## Explicatie a fiecarui folder +## Project Overview -- Folderul "Cerinta temei": - Contine doar fisierul unde este prezentata cerinta impreuna cu niste exemple. +The simulator models a memory space (8MB total) divided into blocks of 8KB. For the purpose of this simulation, the logic is scaled down to 1024 addressable units. The project consists of two main tasks: -- Folderul "Date de intrare": - Contine un folder numit "tests" unde se gasesc o serie de input-uri (si output-urile folosite de scripturile de verificare) care au fost oferite pentru a ne verifica tema inainte de predarea acesteia. +- **Task 1: Unidimensional Memory Allocation** + Simulates a 1D memory array where files are allocated contiguously using a **First-Fit** strategy. +- **Task 2: Bidimensional Memory Allocation** + Extends the simulation to a 2D memory grid (matrix) and includes more advanced operations like populating allocation data from real files on the disk using system calls. -- Folderul "Scripturi de verificare pentru Linux sau masina virtuala de Linux": - Contine script-urile folosite pentru verificarea temei pentru testarile facute direct pe Linux sau pe o masina virtuala de Linux. +## Supported Operations -- Folderul "Scripturi de verificare pentru Windows Subsystem for Linux (WSL)": - Contine script-urile folosite pentru verificarea temei pentru testarile facute pe Windows Subsystem for Linux (WSL). +The simulator supports the following commands: +- **ADD (1)**: Allocate a contiguous range of blocks for a file. +- **GET (2)**: Retrieve the start and end indices of a file. +- **DELETE (3)**: Free all blocks associated with a specific file. +- **DEFRAGMENTATION (4)**: Reorganize memory to eliminate external fragmentation by moving all allocated files to the beginning of the memory space. +- **CONCRETE (5 - Task 2 only)**: Scan a directory and allocate space for files based on their real size on disk. -- Folderul "Tema (deja compilata)": - Contine cele doua programe scrise in assembly x86_32 sintaxa AT&T deja compilate care indeplinesc cerintele care se pot gasi in folderul mentionat mai sus (puncte 80 / 100 --> OPERATIA CONCRETE NU ESTE IMPLEMENTATA). +## Repository Structure -- Folderul "Tema (source code)": - Contine cele doua fisiere cu codul assembly x86_32 sintaxa AT&T din care au fost compilate programele din folder-ul anterior. +- `src/`: Contains the x86 assembly source code (`task1.s`, `task2.s`). +- `tests/`: Input and expected output files for automated testing. +- `scripts/`: Python scripts for testing (`checker.py`) and generating test cases (`generator.py`). +- `docs/`: Original project requirements in Romanian (PDF). +- `Makefile`: Build instructions for compiling the assembly code. -- Folderul "TEMA GATA DE FOLOSIT": - Cum sugereaza numele folder-ul contine necesarul pentru corecta functionare a celor doua programe impreuna cu script-urile de verificare, astfel se poate rula script-ul direct in acest folder, acesta fiind gata de utilizat. Pentru mai multe informatii in legatura cu script-ul faceti referinta la link-ul de mai jos. -______________________________________________________________________________________________________________________________________________________________________________________ - ## **Consultati urmatorul link pentru alte informatii utile:** https://github.com/iancuivasciuc/csa/tree/master/project +## Getting Started + +### Prerequisites + +To build and run this project, you need: +- A Linux environment (or WSL on Windows). +- `gcc` with 32-bit support (`gcc-multilib`). +- `make` and `python3`. + +### Building the Project + +Run the following command in the root directory: +```bash +make +``` +This will generate two executables: `task1` and `task2`. + +### Running Tests + +You can use the provided checker script to verify the implementation: +```bash +python3 scripts/checker.py +``` + +## Technical Details + +- **Language**: x86 Assembly (32-bit, AT&T Syntax). +- **System Calls**: Uses Linux system calls for I/O and file management. +- **Memory Strategy**: First-Fit for contiguous allocation. + +## License + +This project was developed as part of the Computer Systems Architecture (ASC) course at the University of Bucharest, 2024-2025. diff --git a/Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/checker.py b/Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/checker.py deleted file mode 100644 index 625c71f..0000000 --- a/Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/checker.py +++ /dev/null @@ -1,195 +0,0 @@ -import os -import argparse -import subprocess -import signal - -exercises = { - "task1": { - "summary": "Unidimensional case.", - "description": ( - "TODO" - ), - "tests": [ - ("add", 10), - ("add_get", 10), - ("add_delete", 10), - ("add_get_delete", 5), - ("add_get_delete_defragmentation", 15), - ], - "max_score": 50, - }, - "task2": { - "summary": "Bidimensional case.", - "description": ( - "TODO" - ), - "tests": [ - ("add", 10), - ("add_get_delete", 10), - ("add_get_delete_defragmentation", 10), - ], - "max_score": 30, - } -} - -timeout = 300 - - -def is_executable(path): - # Check if the file from path is executable. - return os.path.isfile(path) and os.access(path, os.X_OK) - - -def check_exercise(exercise): - print(f"Checking {exercise}:") - - binary_path = os.path.join(".", exercise) - tests_path = os.path.join("tests", exercise) - - if not os.path.exists(binary_path): - print("🔴 File not found!") - print(f"{exercise}: 0/{exercises[exercise]["max_score"]}!\n") - return 0 - - if not is_executable(binary_path): - print("🔴 File is not executable!") - print(f"{exercise}: 0/{exercises[exercise]["max_score"]}!\n") - return 0 - - test_score = 0 - - for test in exercises[exercise]["tests"]: - test_dir = os.path.join(tests_path, test[0]) - - assert (os.path.exists(test_dir) and os.path.isdir(test_dir)) - - num_tests = len(os.listdir(test_dir)) // 4 - passed = True - - for i in range(1, num_tests + 1): - test_input = os.path.join(test_dir, f"{i}.in") - test_output = os.path.join(test_dir, f"{i}.out") - - assert (os.path.exists(test_input) and os.path.exists(test_output)) - - fin = open(test_input, "r") - fout = open(test_output, "r") - - input_data = fin.read() - expected_output = fout.read() - - try: - # Run the process with input and capture output - result = subprocess.run( - [binary_path], - input=input_data, - capture_output=True, - timeout=timeout, - check=True, - text=True, - ) - - output = result.stdout - - # Compare the program's output to the expected output - if output != expected_output: - output_lines = output.splitlines() - expected_output_lines = expected_output.splitlines() - - for idx in range(len(output_lines)): - if output_lines[idx] != expected_output_lines[idx]: - print( - f"🔴 Wrong answer at test {test_input}!\n\nOutput: \"{output_lines[idx]}\"\nExpected: \"{expected_output_lines[idx]}\"\n") - - passed = False - break - except subprocess.CalledProcessError as err: - # Handle errors when the program exits with a non-zero status - return_code = err.returncode - - if return_code > 0: - print(f"🔴 Test {test_input} exited with error code {return_code}!") - else: - signal_number = -return_code - print( - f"🔴 Test {test_input} was terminated by signal: {signal.strsignal(signal_number)} (signal {signal_number})!") - - passed = False - break - except subprocess.TimeoutExpired: - print(f"🔴 Test {test_input} timed out after {timeout} second!") - - passed = False - break - - if passed: - test_score += test[1] - print(f"✔️ Passed test {test[0]}!") - else: - print(f"🔴 Failed test {test[0]}!") - - print(f"{exercise}: {test_score}/{exercises[exercise]["max_score"]}!\n") - - return test_score - - -def check_all_exercises(): - score, max_score = 0, 0 - for exercise in exercises: - test_score = check_exercise(exercise) - score += test_score - max_score += exercises[exercise]["max_score"] - - print(f"Final grade: {score}/{max_score}!") - - -def show_exercise(exercise): - exercise_info = exercises[exercise] - - print(f"Summary: {exercise_info['summary']}\n") - print(f"Description: {exercise_info['description']}\n") - - -def show_all_exercises(): - for exercise in exercises: - print(f"{exercise}: {exercises[exercise]['summary']}") - - -def main(): - # Setup arguments parser - parser = argparse.ArgumentParser( - description="Check a list of assembly exercise." - ) - - parser.add_argument( - "-s", "--show", - action="store_true", - help="Display the summary, description, input/output format.", - ) - - parser.add_argument( - "exercise", - nargs="?", - choices=exercises.keys(), - help="Specify an exercise to check or view its details.", - ) - - # Parse arguments - args = parser.parse_args() - - if args.exercise: - # If an exercise is specified - if args.show: - show_exercise(args.exercise) - else: - check_exercise(args.exercise) - else: - # If no exercise is specified - if args.show: - show_all_exercises() - else: - check_all_exercises() - - -if __name__ == "__main__": - main() diff --git a/Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/generator.py b/Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/generator.py deleted file mode 100644 index 29ab20f..0000000 --- a/Scripturi de verificare pentru Windows Subsystem for Linux (WSL)/generator.py +++ /dev/null @@ -1,55 +0,0 @@ -import sys -import random - - -def generate(input_file): - fin = open(input_file, 'w') - files = set() - - seed = random.randrange(sys.maxsize) - rng = random.Random(seed) - - num_commands = 40 - fin.write(f"{num_commands}\n") - - for _ in range(num_commands): - command = random.randint(1, 4) - fin.write(f"{command}\n") - - if command == 1: - num_adds = random.randint(1, 10) - fin.write(f"{num_adds}\n") - - for _ in range(num_adds): - fd = random.randint(1, 255) - while fd in files: - fd = random.randint(1, 255) - fin.write(f"{fd}\n") - files.add(fd) - - dim = random.randint(9, 9000) - fin.write(f"{dim}\n") - elif command == 2: - fd = random.choice(list(files)) - fin.write(f"{fd}\n") - elif command == 3: - fd = random.choice(list(files)) - files.remove(fd) - fin.write(f"{fd}\n") - elif command == 4: - pass - - fin = fin.close() - - -def main(): - if len(sys.argv) != 2: - print("Usage: python3 generator.py ") - return - - input_file = sys.argv[1] - generate(input_file) - - -if __name__ == '__main__': - main() diff --git a/TEMA GATA DE FOLOSIT/checker.py b/TEMA GATA DE FOLOSIT/checker.py deleted file mode 100644 index 1e35626..0000000 --- a/TEMA GATA DE FOLOSIT/checker.py +++ /dev/null @@ -1,195 +0,0 @@ -import os -import argparse -import subprocess -import signal - -exercises = { - "task1": { - "summary": "Unidimensional case.", - "description": ( - "TODO" - ), - "tests": [ - ("add", 10), - ("add_get", 10), - ("add_delete", 10), - ("add_get_delete", 5), - ("add_get_delete_defragmentation", 15), - ], - "max_score": 50, - }, - "task2": { - "summary": "Bidimensional case.", - "description": ( - "TODO" - ), - "tests": [ - ("add", 10), - ("add_get_delete", 10), - ("add_get_delete_defragmentation", 10), - ], - "max_score": 30, - } -} - -timeout = 300 - - -def is_executable(path): - # Check if the file from path is executable. - return os.path.isfile(path) and os.access(path, os.X_OK) - - -def check_exercise(exercise): - print(f"Checking {exercise}:") - - binary_path = os.path.join(".", exercise) - tests_path = os.path.join("tests", exercise) - - if not os.path.exists(binary_path): - print("🔴 File not found!") - print(f"{exercise}: 0/{exercises[exercise]["max_score"]}!\n") - return 0 - - if not is_executable(binary_path): - print("🔴 File is not executable!") - print(f"{exercise}: 0/{exercises[exercise]["max_score"]}!\n") - return 0 - - test_score = 0 - - for test in exercises[exercise]["tests"]: - test_dir = os.path.join(tests_path, test[0]) - - assert (os.path.exists(test_dir) and os.path.isdir(test_dir)) - - num_tests = len(os.listdir(test_dir)) // 2 - passed = True - - for i in range(1, num_tests + 1): - test_input = os.path.join(test_dir, f"{i}.in") - test_output = os.path.join(test_dir, f"{i}.out") - - assert (os.path.exists(test_input) and os.path.exists(test_output)) - - fin = open(test_input, "r") - fout = open(test_output, "r") - - input_data = fin.read() - expected_output = fout.read() - - try: - # Run the process with input and capture output - result = subprocess.run( - [binary_path], - input=input_data, - capture_output=True, - timeout=timeout, - check=True, - text=True, - ) - - output = result.stdout - - # Compare the program's output to the expected output - if output != expected_output: - output_lines = output.splitlines() - expected_output_lines = expected_output.splitlines() - - for idx in range(len(output_lines)): - if output_lines[idx] != expected_output_lines[idx]: - print( - f"🔴 Wrong answer at test {test_input}!\n\nOutput: \"{output_lines[idx]}\"\nExpected: \"{expected_output_lines[idx]}\"\n") - - passed = False - break - except subprocess.CalledProcessError as err: - # Handle errors when the program exits with a non-zero status - return_code = err.returncode - - if return_code > 0: - print(f"🔴 Test {test_input} exited with error code {return_code}!") - else: - signal_number = -return_code - print( - f"🔴 Test {test_input} was terminated by signal: {signal.strsignal(signal_number)} (signal {signal_number})!") - - passed = False - break - except subprocess.TimeoutExpired: - print(f"🔴 Test {test_input} timed out after {timeout} second!") - - passed = False - break - - if passed: - test_score += test[1] - print(f"✔️ Passed test {test[0]}!") - else: - print(f"🔴 Failed test {test[0]}!") - - print(f"{exercise}: {test_score}/{exercises[exercise]["max_score"]}!\n") - - return test_score - - -def check_all_exercises(): - score, max_score = 0, 0 - for exercise in exercises: - test_score = check_exercise(exercise) - score += test_score - max_score += exercises[exercise]["max_score"] - - print(f"Final grade: {score}/{max_score}!") - - -def show_exercise(exercise): - exercise_info = exercises[exercise] - - print(f"Summary: {exercise_info['summary']}\n") - print(f"Description: {exercise_info['description']}\n") - - -def show_all_exercises(): - for exercise in exercises: - print(f"{exercise}: {exercises[exercise]['summary']}") - - -def main(): - # Setup arguments parser - parser = argparse.ArgumentParser( - description="Check a list of assembly exercise." - ) - - parser.add_argument( - "-s", "--show", - action="store_true", - help="Display the summary, description, input/output format.", - ) - - parser.add_argument( - "exercise", - nargs="?", - choices=exercises.keys(), - help="Specify an exercise to check or view its details.", - ) - - # Parse arguments - args = parser.parse_args() - - if args.exercise: - # If an exercise is specified - if args.show: - show_exercise(args.exercise) - else: - check_exercise(args.exercise) - else: - # If no exercise is specified - if args.show: - show_all_exercises() - else: - check_all_exercises() - - -if __name__ == "__main__": - main() diff --git a/TEMA GATA DE FOLOSIT/generator.py b/TEMA GATA DE FOLOSIT/generator.py deleted file mode 100644 index 29ab20f..0000000 --- a/TEMA GATA DE FOLOSIT/generator.py +++ /dev/null @@ -1,55 +0,0 @@ -import sys -import random - - -def generate(input_file): - fin = open(input_file, 'w') - files = set() - - seed = random.randrange(sys.maxsize) - rng = random.Random(seed) - - num_commands = 40 - fin.write(f"{num_commands}\n") - - for _ in range(num_commands): - command = random.randint(1, 4) - fin.write(f"{command}\n") - - if command == 1: - num_adds = random.randint(1, 10) - fin.write(f"{num_adds}\n") - - for _ in range(num_adds): - fd = random.randint(1, 255) - while fd in files: - fd = random.randint(1, 255) - fin.write(f"{fd}\n") - files.add(fd) - - dim = random.randint(9, 9000) - fin.write(f"{dim}\n") - elif command == 2: - fd = random.choice(list(files)) - fin.write(f"{fd}\n") - elif command == 3: - fd = random.choice(list(files)) - files.remove(fd) - fin.write(f"{fd}\n") - elif command == 4: - pass - - fin = fin.close() - - -def main(): - if len(sys.argv) != 2: - print("Usage: python3 generator.py ") - return - - input_file = sys.argv[1] - generate(input_file) - - -if __name__ == '__main__': - main() diff --git a/TEMA GATA DE FOLOSIT/task1 b/TEMA GATA DE FOLOSIT/task1 deleted file mode 100644 index c4b3a744ee291b8b4da5466e1de208d4201faabe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17784 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 N9b>-03My&4{{kEJ6KVhe diff --git a/TEMA GATA DE FOLOSIT/task2 b/TEMA GATA DE FOLOSIT/task2 deleted file mode 100644 index 97117f44f23cafef50564049820f49b5269ff34a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1065724 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 N9b>-03My&4{{kEJ6KVhe diff --git a/Tema (deja compilata)/task2 b/Tema (deja compilata)/task2 deleted file mode 100644 index 97117f44f23cafef50564049820f49b5269ff34a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1065724 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 Date: Wed, 29 Apr 2026 13:13:35 +0300 Subject: [PATCH 2/4] Update CI trigger to run on all branches --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca52fc8..3a7f98b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,6 @@ name: CI - Test Assembly Implementation on: push: - branches: [ main, master ] pull_request: branches: [ main, master ] From 00a0e8cf0f0aec06d721d275438e243ecd07dc6a Mon Sep 17 00:00:00 2001 From: ModernityRejecter Date: Wed, 29 Apr 2026 13:15:50 +0300 Subject: [PATCH 3/4] Separate Task 1 and Task 2 into independent CI jobs --- .github/workflows/ci.yml | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a7f98b..65835c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,22 +6,30 @@ on: branches: [ main, master ] jobs: - build-and-test: + test-task1: + name: Test Task 1 (Unidimensional) runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y gcc-multilib make python3 - - - name: Build project - run: make - + - name: Build Task 1 + run: make task1 - name: Run Task 1 Tests run: python3 scripts/checker.py task1 + test-task2: + name: Test Task 2 (Bidimensional) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc-multilib make python3 + - name: Build Task 2 + run: make task2 - name: Run Task 2 Tests run: python3 scripts/checker.py task2 From 2de4e3b6992bc4371288d4a0e865cd19320970ba Mon Sep 17 00:00:00 2001 From: ModernityRejecter Date: Wed, 29 Apr 2026 13:20:12 +0300 Subject: [PATCH 4/4] Clarify that CONCRETE operation is not implemented in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ddc57f7..d53de1b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The simulator models a memory space (8MB total) divided into blocks of 8KB. For - **Task 1: Unidimensional Memory Allocation** Simulates a 1D memory array where files are allocated contiguously using a **First-Fit** strategy. - **Task 2: Bidimensional Memory Allocation** - Extends the simulation to a 2D memory grid (matrix) and includes more advanced operations like populating allocation data from real files on the disk using system calls. + Extends the simulation to a 2D memory grid (matrix). Note: The `CONCRETE` operation is not implemented in this version. ## Supported Operations @@ -18,7 +18,7 @@ The simulator supports the following commands: - **GET (2)**: Retrieve the start and end indices of a file. - **DELETE (3)**: Free all blocks associated with a specific file. - **DEFRAGMENTATION (4)**: Reorganize memory to eliminate external fragmentation by moving all allocated files to the beginning of the memory space. -- **CONCRETE (5 - Task 2 only)**: Scan a directory and allocate space for files based on their real size on disk. +- **CONCRETE (5 - Task 2 only)**: *Not implemented.* ## Repository Structure