Catégorie Underflow

Compilateur Brainfuck

Le Brainfuck est un langage de programmation ne comportant que 8 instructions, impliquant une difficulté de compréhension et d’écriture dont le langage tire son nom.

J’ai choisi d’entamer un nouveau projet : la réalisation d’un compilateur Brainfuck pour architecture x86.
L’objectif de ce projet est de me permettre de mieux appréhender le fonctionnement des assembleurs, et de découvrir le format standard pour les exécutables UNIX : elf.

Dans un premier temps, je vais coder en assembleur les parties de code qui seront communes à tout programme Brainfuck (ce que j’appellerais maintenant la base) :

  • l’allocation du tableau
  • les procédures pour déplacer le pointeur et modifier les valeurs du tableau

Je vais ensuite devoir écrire un programme capable de traduire le Brainfuck en un langage intermédiaire qui sera linéaire, puis en langage binaire. Grâce à la base, je ne devrais avoir à utiliser que des appels (vers les fonctions de la base) et des sauts conditionnels, ce qui simplifiera grandement la transcription en binaire.

Je vais rencontrer deux difficultés :

  • linéariser les instructions [ et ] du brainfuck
  • réussir à comprendre la doc Intel pour transcrire CALL et JE

Let’s code.

Emulateur CHIP-8 : done

La machine CHIP-8

CHIP-8

La nuit dernière, j’ai codé un émulateur CHIP-8 en C. Il s’agit de mon premier émulateur et il fonctionne plutôt bien !

Je me suis servi des spécifications du CHIP-8 que j’ai récupéré ici : http://devernay.free.fr/hacks/chip8/C8TECH10.HTM

Pong sur l'émulateur CHIP-8

Pong sur l'émulateur CHIP-8

Le travail consiste dans un premier temps à reproduire l’architecture du processeur (mémoire, registres, pile et horloge) et de la machine (clavier, écran et buzzer).

A ce stade, il est possible d’initialiser le CHIP-8, et de charger  le programme (tétris, pong, …) en mémoire. On peut ensuite entamer la lecture du programme.

 

La principale difficulté du projet est  de réussir à interpréter correctement les instructions. Le processeur utilise un jeu d’instruction assez réduit (une trentaine seulement) et les instructions sont codées sur 16 bits. On lit donc le programme par blocs de 16 bits pour former une instruction à chaque fois.

Je lis par exemple : 0x5430. Un coup d’œil sur les spécifications m’indique :

5xy0 - SE Vx, Vy
Skip next instruction if Vx = Vy.

Ainsi, pour pouvoir matcher cette instruction, il est nécessaire de pouvoir vérifier qu’elle commence par 5 et finit par 0 (ces deux chiffres hexa l’identifient comme étant SE Vx, Vy) et récupérer les deux valeurs x et y.

Pour matcher une instruction, je construit un masque. Pour l’exemple ci-dessus, j’utilise 0xF00F.

0×5**0 AND 0xF00F = 0×5000

(0×5120 AND 0xF00F) == 1 = 1 : l’instruction est matchée avec 0x5xy0

(0×5121 AND 0xF00F) == 1 = 0 : l’instruction n’est pas matchée 0x5xy0

Je peux ainsi matcher une instruction en me basant uniquement sur certains chiffres.

Pour récupérer un digit, le processus est quasiment identique :

Extraction du 3eme chiffre :

(0xABCD AND 0x00F0) = 0xC0 : le chiffre est extrait mais il y a une seizaine en trop !

(0xABCD AND 0x00F0) >> 4 = 0xC : le chiffre est correctement extrait

 

Une fois le code des 36 instructions écrit, il a ensuite fallu débug… à l’aveugle !

«Je»

Bienvenue sur mon blog personnel. Pour ceux qui ne me connaîtraient pas, je suis un étudiant en informatique. J’ai découvert cette passion assez tôt, en bidouillant quelques programmes en QuickBASIC sur Windows 95, réalisant à l’époque quelques mini-jeux et applications inutiles.

Depuis, je me suis orienté sur le développement de programmes divers et variés (principalement en C#, Python et C) et la création de sites internet (activité pour laquelle j’ai été amené à réaliser mon propre CMS).

Je dirais que j’ai constamment deux projets en construction :

  • un premier destiné à s’étaler sur le long terme, et que je destine à être publié par la suite
  • un autre qui n’est que passager, que je réalise tant qu’il m’amuse (c’est à dire tant qu’il reste un défi technique à accomplir)

Pour terminer, je suis aussi auto-entrepreneur. Je met à dispositions mes connaissances pour aider les entreprises : création de sites web, développement de logiciels et d’applications mobiles, conseil… Pour plus d’informations, je vous invite à consulter le site internet d’Arborescence3w.

J’ai décidé de créer ce blog, pour partager avec vous mes expériences en programmation et en informatique.

Je publierai ici des bouts de codes en pagaille, des explications foireuses sur le pourquoi du comment, des idées de projets, des projets, …

 

Bonne lecture !