Developpez.com - Rubrique Assembleur

Le Club des Développeurs et IT Pro

Petit challenge : coder sans compilateur

Ou comment générer du code machine à la main

Le 2009-07-21 19:31:23, par Scheb, Membre du Club
Voila une petite question pour une sorte de challenge, comment compiler sans compilo? ou peut etre comment coder en binaire?^^

Je sais ça sert completement a rien c'est juste pour savoir

l'assembleur est très proche du langage machine, est il donc possible de traduire les fonctionnalités directement en binaire (et realiser un .exe pour autre pour le lire) ?
ou un alternative qui donnerai le même effet

vila vilou juste pour savoir^^
  Discussion forum
8 commentaires
  • Obsidian
    Modérateur
    C'est effectivement possible, en effectuant le travail du compilateur à la main. Il va sans dire que cela devient vite très fastidieux, mais ça s'est fait à une époque. Moi-même, j'ai programmé mon premier PIC en écrivant le programme sur papier, en l'assemblant à la main avec la liste des codes à côté, et en transposant le tout dans un fichier hexadécimal avant de l'envoyer au programmateur.

    À chaque micro-processeur correspond sa table des instructions, lequelles sont déclinées dans toutes les versions possibles en fonction des modes d'adressage. Tu n'as qu'à relever (parfois calculer) les bonnes valeur et les aligner les unes après les autres.

    Ça, c'est dans le principe. Après, pour faire un programme qui s'épanouisse pleinement au sein d'un système d'exploitation moderne, il faut qu'il puisse interagir avec et connaître à un moment t tous les points d'entrées relève de la gageure. Ensuite, le format *.exe sous Windows est assez compliqué en lui-même. C'est en soi un travail à temps plein que de vouloir le définir à la main, presque autant que la compilation proprement dite.

    Cela dit, les programmes *.COM étaient faits, eux, pour être une image stricte, monolithique et sans aucune structure d'un petit programme. Ils se prêtaient assez bien à ce genre d'exercice. En convertissant les codes hexadécimaux obtenus en codes ASCII, on arrivait à créer un programme exécutable avec le bloc-notes.

    Par exemple, pour faire facilement un programme qui se contentait de ressortir, on pouvait utiliser l'instruction « INT 20h » sur PC. Une fois assemblé, on obtenait CD 20. Traduit en décimal, ça faisait 205 32. Après avoir ouvert un bloc-notes, 205 s'obtenait avec Alt+2+0+5, et 32, c'était l'espace, tout simplement. Une fois saisi ces deux caractères, on sauvait le tout sous « prog.com » et on avait un exécutable en bonne et due forme.
  • Scheb
    Membre du Club
    très sympa tout ça!

    donc voici pour voir si j'ai bien compris, voici un code tout bete tirer d'un site pris au hasard qui affiche un Z avec des couleurs;

    J'ouvre un fichier bloc note et je traduit ceci en decimal à l'aide de l'ASCII, de la technique "alt+"

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    .model small ;faut il trouver des valeurs decimal pour ceci où on laisse ?
    .stack 100h ;  par exemple ceci donnerai: .stack 256 ?
    .486
    .data
    
    .code
    main    proc
            mov ax,@data
            mov ds,ax ; donc ici faut que je trouve la correspondance adequoite? d'ailleur je ne sais pas où trouver ça....
    
            mov ah,09h
            mov bh,0
            mov cx,1
            mov al,'Z'
            mov bl,11111001b
            int 10h
    
            mov ax,04C00h
            int 21h
    main endp
    end main
    mmmh ça m'interesse beaucoup, j'aimerai savoir comment faire (bien sûr je sais que cela ne sert pas mais bon, c'est interessant)

    (aussi il est donc impossible de coder directement en binaire ? puisque sur un bloc note on ne peut qu'ecrire en decimal)

    transposant le tout dans un fichier hexadécimal
    Il existe un moyen de lire et ecrire de l'hexadecimal ?

    Merci beaucoups pour les infos
  • Pour le format des instructions sur les processeur x86 en 32bits et la traduction asm/machine: http://en.wikibooks.org/wiki/X86_Ass...age_Conversion

    Sinon, pour les format des fichiers exécutables Windowb, regarde du côté des "PE File"; il y avait une traduction d'une série de tutoriels sur ce format qui était pas mal fait du tout, une petite recherche sur Googel devrait t'aider

    Pour le format des exécutables sous Linux, il faut regarder du côté elf. Là aussi y a moyen de trouver la doc....
    À partir de là, tu ouvres ton éditeur hexa préféré, et tu fais du hard-coding

    Il existe un moyen de lire et ecrire de l'hexadecimal ?
    Tu utilise un éditeur hexadécimal... Y en a des pas mal sur Internet, en cherchant un peu...

    Sinon, ce que peut être très enrichissant, c'est faire un petit compilo toi-même...
  • Scheb
    Membre du Club
    merci beaucoups, je vais voir ça de suite
  • Mais franchement, laisse tomber l'idée de coder, déjà rien que pour coder en hexa avec les formats elf ou pe, tu vas vraiment t'amuser... C'est du suicide
  • jabbounet
    Membre expert
    Envoyé par Lord BlackFox
    Mais franchement, laisse tomber l'idée de coder, déjà rien que pour coder en hexa avec les formats elf ou pe, tu vas vraiment t'amuser... C'est du suicide
    Parfois tu n'a pas le choix, c'est en général quand tu écrit un driver pour une carte et tu le mixe avec un langage de plus haut niveau pour ce qui n'est pas spécifique à ta carte.
  • et tu code directement en hexa?
    Pourquoi ne pas utiliser l'asm alors?
  • Scheb
    Membre du Club
    Envoyé par Lord BlackFox
    laisse tomber l'idée de coder
    oui ne t'inquiete pas, mon but n'étais pas de coder, mais surtout de comprendre

    Donc c'est bon, grâve à vous j'ai compris que c'étais possible mais surtout comment ça l'étais