Bonjour à tous,
Voici quelques questions à propos d'une partie du code du fichier boot.s de linux 0.01 (excusez-moi si le sujet existe déjà, je ne voudrais pas créer une nouvelle discussion pour rien, mais je n'ai pas regardé). Voici le bout de code en question :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 read_it: mov ax,es test ax,#0x0fff die: jne die | es must be at 64kB boundary xor bx,bx | bx is starting address within segment rp_read: mov ax,es cmp ax,#ENDSEG | have we loaded all yet? jb ok1_read ret ok1_read: mov ax,#sectors sub ax,sread mov cx,ax shl cx,#9 add cx,bx jnc ok2_read je ok2_read xor ax,ax sub ax,bx shr ax,#9
On est censé ici lire les secteurs des pistes, mais certaines lignes sont (pour moi) assez obscures. Voici les questions que je me pose :
Que vaut la variable sectors utilisée au début de ok1_read? Et où est-elle? On peut la voir, mais juste en commentaire au début du fichier.
Je ne comprends pas du tout la ligne add cx, bx dans ok1_read. Jusqu'à présent, on mettait le nombre de secteurs par piste dans ax, on lui soustrait le nombre de secteurs restant à lire, on met le tout dans cx, on le multiplie par 512 (pour déterminer la taille des secteurs restant à lire???), et on en arrive ensuite à add cx, bx que je ne comprends pas. La doc que j'ai trouvée n'est pas claire là-dessus *. Quel est le rapport de tout ça avec la limite de 64KB (dans les commentaires de Linus) ?? La limite d'adressage ? Que signifie-t-elle, ici, dans la lecture des secteurs ?
Ensuite, quelqu'un pourrait-il m'expliquer les routines read_it, die et rp_read (fonctionnement + chaque ligne de code). Qu'est ce qu'ENDSEG ? Quelle valeur vaut-il ? Dans die, pourquoi mettons-nous à 0 bx (à quoi cela servirait-t-il alors de l'ajouter à cx dans ok1_read) ? Et quelle est la valeur de es dans read_it ? 0x0 ou 0x10000 (je veux dire : conserve-t-il la valeur SYSSEG plus haut dans boot.s) ? À quoi sert le "test" ici, et pourquoi ce masque ? Quel bit cherche-t-on à tester et dans quel but ? Si un spécialiste pouvait m'éclairer… excusez pour les erreurs éventuelles.
* La doc contient ceci en commentaire de add cx, bx : « cx = cx + offset in current segment (bx) = total bytes read after the processing of this time ». Si cx est la taille des secteurs restant à lire, et bx une adresse, comment peut-on les ajouter ?
Merci beaucoup !
Bonne fin de journée !