Le Dimanche 22 Juillet 2001 10:55, vous avez �crit :
> > Dimanche 22 Jul 2001 � 00:47:58,  Le Bot Jean-Michel  �crivait :
> > ---------------
> > Je suis en train de lire le livre de Linus Torvalds (Il �tait une fois
> > Linux, �ditions OEM). Le p�re de notre OS favori y raconte comment dans
> > la premi�re moiti� des ann�es 80, avec son Commodore Vic-20 puis son
> > Sinclair QL, il programmait en langage assembleur voire m�me en langage
> > machine (alors que C existait d�j�, cf. p. 71) !!!

Il ne faut pas �tre surpris comme �a. Quand on est au niveau "syst�me", il 
faut obligatoirement ecrire des fonctions en assembleur, parce que tout ce 
que tu as � ta disposition, c'est le langage C. El le langage C ce n'est rien 
d'autre qu'un vaste n�ant... tout juste une 20aine de mots clef si ma m�moire 
est bonne.

Quand tu fais un simple "printf" , tu appelles une fonctiond de la librairie 
stdio qu'il a bien fallu �crire, et qui est propre au syst�me.

De m�me que quand tu d�clares un char[] tu d�clares en fait un  tableau bas� 
sur le type int (qui n'est pas un entier, mais qui est le "mot machine") seul 
et unique type du langage C.

Donc, tu comprendras bien qu'il faut disposer de fonctions �l�mentaires, 
lesquelles ne peuvent pas �tre �crites en C ... parce que le langage C ne le 
permet pas.

Quand � l'histoire de programmer directement en langage machine, je l'ai 
moi-m�me fait. La raison en est simple.

J'avais un TRS-80 dot� de 16Ko (oui kilo-octets) de RAM. Lorsque j'avais 
charg� le compilateur assembleur, par manque de RAM je ne pouvais compiler 
grosso-modo qu'un code source produisant environ 4Ko de code binaire.

Si mon programme executable devait faire plus de 4Ko, il me fallait donc 
trouver une autre solution.

J'ai donc utilis� le d�bugger, outil proche du "debug" du DOS pour ceux qui 
connaissent, qui n'occupait qu'1 ou 2 Ko de RAM, je pouvait donc produire un 
binaire de plus de 10 Ko & le sauvegarder.

J'�crivais donc mon code assembleur, et je le "compilais" � la main.

Ne soyez pas impressionn�s, je parle d'ASSEMBLEUR pas  de MACRO-ASSEMBLEUR 
(comme MASM). On �tait donc limit� au jeu d'instruction du CPU, on n'avait 
pas de macro-instruction du type IF ...

En fait la seule chose que permettait ce genre d'assembleur �tait de mettre 
des noms symboliques en colonne 1, et l'adresse de ces noms �tait r�solue par 
le compilateur, ainsi que des vommentaires en colonne 4. Ca donnait des truc 
du genre :

LOOP    XOR A                   ; RAZ DE L ACCUMULATEUR
        LDIR
        CALL    MYSUB   ; FAIRE LES CALCULS
        JP      NZ,LOOP ; BOUCLER SI PRECISION PAS ATTEINTE
        RET                     ; FIN DE ROUTINE
MYSUB ADD
.......

Dans cet exemple, on voit que chaque instruction assembleur est effectivement 
une des instruction �l�mentaire du CPU Z80, et comme quand on code en 
assembleur, on a la liste du jeu d'instruction, et on a pour chaque 
instruction son code machine.

Par exemple, JP NZ,LOOP

on a dans la doc "saut si l'accumulateur n'est pas � z�ro".
Code machine : C6LLHH o� HH l'octet de poids fort et LL celui de poids faible 
de l'adresse o� aller.

De m�me pour CALL MYSUB on voit dans la doc "CDLLHH"
Alors l�, c'est plus probl�matique, parce qu'il faut compter � la main le 
nombre d'octets qu'occupent les instructions suivantes pour savoir � quelle 
adresse va ser retrouver le d�but de la routine MYSUB (en l'occurrence ca 
fera 4 octets plus loin : 3 pour le CALL (CDLLHH) et un pour le RETurn (C9).

mais mis � part ce petit d�tail de calcul d'adresses � la main, c'est 
exactement la m�me chose que de coder en assembleur "pur" (pas 
macro-assembleur) ou en langage machine... faut juste faire un peu plus gaffe 
aux fautes de frappes ;-)

(note, les valeurs que j'ai donn�es sont compl�tement bidon, je ne me 
souviens plus du jeu d'instruction Z80, mis � part C9 pour le RET).





Répondre à