Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/08/2011, 16h14   #1
red18
Invité de passage
 
Étudiant
Inscription : août 2011
Messages : 1
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 1
Points : 0
Points : 0
Par défaut bootloader de linux 0.01

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 asm :
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 !
red18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 18h09   #2
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
C'est moi ou il manque pas mal de code ?

pour lire les secteurs, il est obligatoire de trouver l'interruption 13h
quelque part puisqu'on est en mode réel

a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h30.


 
 
 
 
Partenaires

Hébergement Web