Solution de pioueo pour Comparaison

intro hardware

13 février 2024

Dans ce petit challenge fort sympathique, il faut implémenter une comparaison entre deux registres de données intialisés avec des valeurs aléatoires, puis dans le registre de données R0, mettre 0 si c’est égal, sinon 1.

Il faut lire très attentivement la documentation de la machine virtuelle qui se trouve ici. Nous allons avoir besoin des instructions suivantes :

Très naïvement, selon les instructions du challenge et la documentation de l’assembleur de la machine virtuelle, nous pouvons écrire le programme suivant que nous nommerons compar.asm :

; On compare R5 et R6                                                       
CMP R5, R6
; La comparaison a positionné le drapeau Z que l’on teste
; Si Z vrai, on saute à la branche r5_r6_different
; sinon on saute à la branche r5_r6_equal
JZA r5_r6_different
JNZA r5_r6_equal
  
r5_r6_different:
   ; on arrive ici si drapeau Z vrai
   ; on colle 0 dans R0 et on s'en va à la fin
   MOV R0, #0
   JZA end
  
r5_r6_equal:
   ; on arrive ici si drapeau Z faux
   ; on colle 1 dans R0 et on s'en va à la fin
   MOV R0, #1
   JZA end
  
end:
   ; Arrêt du programme
   STP

Ensuite, nous pouvons utiliser le fichier assembler.py fourni, qui va générer le code machine en hexadécimal :

$ python3 assembly.py compar.asm

Vous devriez obtenir un code machine en hexadécimal. Il ne reste plus qu’à interagir avec le conteneur Docker du challenge en fournissant le code machine obtenu pour récupérer le flag.