Tout programme lancé nécessite une communication entre le système d’exploitation et l’assembleur, alors face à l’embarras du choix des assembleurs aussi bien que la multitude des systèmes d’exploitation existants, il faut se poser la question si les instructions résultant des programmes restent ils les mêmes !?
Voici une liste clarifiant un ensemble d’abréviations qui vont se répéter à plusieurs reprises sur cet article :
ABI : c’est le pont entre le système d’exploitation et l’assembleur
ISA ou langage assembleur renvoi au langage du processeur.
Avant de se lancer dans la comparaison, il s’avère indispensable de rappeler le rôle de l’ABI qui constitue un pont entre le système d’organisation et l’ ISA, en effet c’est l’ ABI qui traduit le langage de système d’exploitation pour le processeur, notamment celui du système d’organisation pour l’assembleur afin qu’il soit interprété par le processeur, ce dernier ne reconnaît que le langage de l’ ISA et chaque processeur dispose de son propre langage ce qui mène à penser encore une fois à questionner l’impact du processeur sur les résultats des programmes.Avant de se lancer dans la comparaison, il s’avère indispensable de rappeler le rôle de l’ABI qui constitue un pont entre le système d’organisation et l’ ISA, en effet c’est l’ ABI qui traduit le langage de chacun pour l’autre, notamment celui du système d’organisation pour l’assembleur afin qu’il soit interprété par le processeur, ce dernier ne reconnaît que le langage de l’ ISA et chaque processeur dispose de son propre langage ce qui mène à penser encore une fois à questionner l’impact du processeur sur les résultats des programmes.
Quelques rôles de l’ABI:
- Choix des paramètres à passer
- Nettoyage des paramètres de la pile
- Placement de la valeur de retour et mode de retournement
- Mode de propagation des exceptions
- Appel des fonctions et choix du registre
Différences entre les ABI systèmes:
Il y a plus de différences entre les ABI UNIX et Windows que le simple mappage d’arguments à des registres spécifiques.
Sur Win64, par exemple, l’appelant doit allouer l’espace pile pour les arguments de fonction même si les arguments sont passés dans les registres.
Sur UNIX, par contre, une fonction feuille (c’est-à-dire une fonction qui n’appelle pas d’autres fonctions) n’a même pas besoin d’allouer de l’espace pile du tout si elle n’en a pas besoin de plus de 128 octets ,on peut utiliser une certaine quantité de pile sans l’allouer sauf si c’est le code noyau.
les concepteurs d’ABI Windows ont pu viser à minimiser les différences entre 32 et 64 bits pour le bénéfice des personnes qui doivent porter les fichiers assembleur de l’un à l’autre. L’ABI dans Win64 et Win32 sont identique pour le cas où il n’y a pas plus de deux arguments ne dépassant pas 32 bits et renvoyant une valeur ne dépassant pas 32 bits.
Comparaison entre les résultats de l’ ISA sans les appels système
Afin d’apporter une réponse aux questions liées à l’impact de l’assembleur sur les résultats des programmes, c’était judicieux de lancer des programmes simulateurs dans différentes circonstances. Premièrement un programme simple testé sur trois systèmes d’exploitation le mac OS, Windows et Linux en utilisant un processeur Intel, la photo ci-dessous illustre le code élaboré pour ce programme simple sans appel système :
Non ce n’est pas chinois, c’est simplement le code d’un programme simple qui a donné les résultats suivants :
Les résultats de l’assembleur au niveau des différents systèmes d’exploitation démontrent une légère différence négligeable même au niveau des instructions du moment qu’il n’y a eu pas de grandes modifications. Il est à noter que les tests menés dans cet exercice correspondent à un processeur Intel ayant un langage propre à lui. Nous remarquons que les résultats ne seront pas les mêmes si on change de processeur sauf que quel que soit le processeur, il n’y aura pas de différences significatives entre les différents systèmes d’exploitation. Mais qu’en est il des programmes avec appel système !?
Comparaison entre les résultats de l’ ISA avec les appels système
Pour s’en rendre compte, je vous invite à consulter les résultats de l’assembleur après exécution du programme avec appel système :
Les résultats ne sont visiblement pas les mêmes pour les trois systèmes d’organisation, quelques instructions ont totalement disparu, d’autres sont modifiées et de nouvelles sont apparues.
Conclusion
En synthèse, sur les différents systèmes d’exploitation et avec un même processeur les résultats de l’assembleur d’un programme simple sont les mêmes, par contre lors d’un programme avec appel système, les instructions ne sont plus exactement les mêmes.
Pierre Bolinches, Hamza Dardouri, Ghita Laoud, Tanina Soualah, Emel Topal