Inclure de l'assembleur dans du pascal ou obtenir l'interface graphique d'une calculatrice en assembleur

a marqué ce sujet comme résolu.

Bonjour, Je suis étudiant et en première année d’un DUT informatique, je me tourne vers vous, car je ne trouve pas grand chose sur Internet. J’ai comme projet faire une calculatrice en assembleur et de faire l’interface d’une calculatrice qui fonctionne, y a t’il un moyen d’intégrer une interface graphique directement en assembleur. Perso, j’ai eu comme idée de faire une interface graphique sur Lazarus en Pascal (je sais que c’est obsolète, mais j’utilise les moyens que nous donne notre IUT) et d’intégrer l’assembleur directement, hors je ne sais pas du tout comment faire ??? Mon professeur m’a parlé d’une fonction include, mais ne m’a pas donné plus d’information malheureusement. Je vous remercie infiniment.

C’est tout à fait possible de faire une interface graphique directement en assembleur. La méthode la plus simple est évidemment de faire appel à une lib externe.

En supposant qu’on veuille utiliser cette lib (écrite en C++, mais la même chose peut être fait en C et probablement en Pascal aussi):

#include <iostream>

static int next_id = 0;

extern "C" {
int createWindow() {
  int id = next_id;
  next_id++;
  std::cout << "ceateWindow " << id << "\n";
  return id;
}

void closeWindow(int id) {
  std::cout << "closeWindow " << id << "\n";
}
}

Essentiellement, on a deux fonctions: createWindow qui ne prend aucun argument et retourne un int, et closeWindow qui prend un int en argument et ne retourne rien. Pour compiler cette lib, on peut utiliser la commande clang++ -o my_lib.o my_lib.cc.

Pour faire appel à cet lib en assembleur il suffit de déclarer les fonctions avec extern et y faire appel en se référant aux conventions d’appel du système que tu utilises (x86–64 sur linux dans l’exemple):

section .data
  global main
  extern createWindow
  extern closeWindow

section .text
main:
  call createWindow
  ; window id is in rax, put it in rdi
  mov rdi,rax
  call closeWindow

  ; return 0
  mov rax,0
  ret

Le fichier peut se compiler avec nasm -f elf64 main.s -o main.o.

Pour générer l’exécutable, il suffit de linker le tout avec clang++ -o main main.o my_lib.o. À noter que clang va y ajouter la lib standard C++ (nécessaire pour la lib écrite en C++) qui contient le _start qui s’occupera d’appeler le main écrit en asm (en plus d’initialiser un certain nombre de trucs nécessaire pour la lib standard C++).

Suivant l’assembleur que tu utilises et le système pour lequel tu veux compiler ton programme, les choses peuvent être un peu différentes, mais le principe devrait rester le même.

Il est aussi possible de faire l’inverse: créer les fonctions nécessaire à la calculatrice en assembleur et ensuite faire appel à ces fonctions dans le langage que tu veux, ce qui te permet de gérer l’interface graphique dans ce langage. Voici un exemple rapide:

#include <iostream>

extern "C" {
// La fonction de la lib asm.
int add(int, int);
}

int main() {
  std::cout << "3 + 5 = " << add(3, 5) << "\n";
  return 0;
}
section .data
  global add

section .text
add:
  mov rax, rdi
  add rax, rsi
  ret

Pour compiler et linker, on peut utiliser les même commandes que pour l’autre exemple.

La vache…

Je pense que tu peux aboutir à un résultat sans trop de peine en utilisant les API Win32 (si tant est que tu parles d’assembleur x86 Windows) pour faire une simple boîte de dialogue modale. Tu as sans doute des ressources intéressantes ici par exemple : http://n8on.free.fr/hackzines/hccc/5/dialogboxwin32asm.html

Je te souhaite bien du courage. Enseigner l’assembleur, c’est plutôt intéressant, mais ce qu’on te demande de faire, ça pique un peu, je trouve.

En fait, moi je ne comprends pas bien ce que ça fait dans un DUT… Bon courage

Phigger

À l’époque où j’étais encore étudiant (il y a environ 7 ans) j’avais eu vent des mêmes choses et je trouvais ça totalement normal que les étudiants apprennent à manipuler du langage machine, plus pour une question de culture générale qu’autre chose.

Car l’assembleur est quelque chose qui se retrouve toujours utilisé par ton processeur intel/AMD, même en 2021. Et aussi dans des applications très, très spécifiques (rétro-ingénierie, protection logicielle, logiciels malveillants, etc). Bref, ça vaut le détour.

Après, est-ce pertinent d’enseigner ça en DUT et, pis encore, de leur faire faire un calculette en assembleur ? C’est discutable.

Ah, et pour te prouver (au cas où) que je ne te raconte pas de conneries, j’avais eu pour projet d’écrire ce tutoriel il y a quelques 10 ans et plus : http://venom630.free.fr/geo/tutz/programmation/asm/

À l’époque où j’étais encore étudiant (il y a environ 7 ans) j’avais eu vent des mêmes choses et je trouvais ça totalement normal que les étudiants apprennent à manipuler du langage machine, plus pour une question de culture générale qu’autre chose.

Car l’assembleur est quelque chose qui se retrouve toujours utilisé par ton processeur intel/AMD, même en 2021. Et aussi dans des applications très, très spécifiques (rétro-ingénierie, protection logicielle, logiciels malveillants, etc). Bref, ça vaut le détour.

Après, est-ce pertinent d’enseigner ça en DUT et, pis encore, de leur faire faire un calculette en assembleur ? C’est discutable.

Ge0

Ça vaut certes le détour, mais dans l’exercice en question, je ne dirais même pas que l’on découvre ici l’assembleur, mais plus volontiers qu’on découvre comment l’interfacer avec un langage haut-niveau. Ça peut aussi valoir le détour aussi, cela dit… (selon les projets à venir dans le cursus, peut-être ?)

En tout cas pour découvrir l’assembleur je pense qu’on peut trouver bien plus intéressant que cet exercice, sauf si le but est effectivement d’initier les étudiants à l’interfaçage en respectant une ABI, le extern "C", apprendre quels registres on a le droit de « détruire » sans sauvegarde préalable, etc. (auquel cas @Berdes nous donne déjà un très bon aperçu).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte