LODSB en mode protégé

Résolu
benjamindu58futur11 - 5 oct. 2012 à 19:05
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 oct. 2012 à 22:11
Bonjour à tous :)

J'ai entrepris récemment de créer mon propre OS pour un défi personnel (ne sachant que faire ces derniers temps...) uniquement en assembleur

J'aimerais donc savoir avec quels registres fonctionne LODSB en mode protégé, sachant qu'en mode réel, il fonctionne avec AL, DS et SI.

Merci d'avance pour une éventuelle réponse :)

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 oct. 2012 à 20:16
Dixit manuel Intel:
For legacy mode, Load byte at address DS:(E)SI into AL.
For 64-bit mode load byte at address (R)SI into AL.

Ces antiquités sont à oublier.

ciao...
BruNews, MVP VC++
3
PYRHON Messages postés 7 Date d'inscription vendredi 16 décembre 2011 Statut Membre Dernière intervention 27 décembre 2012
9 oct. 2012 à 13:31
J'ai pas bien compris la réponse de BruNews qui laisserait supposer que les instructions sur String ne serviraient plus ou ne seraient plus utilisables, car LODSB et autres instructions du même type, fonctionne dans tous les modes, Réel, Protegé, 64 bits ou pas, et même en SMM.
Salut...
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 oct. 2012 à 18:10
Bien entendu que fonctionne encore mais contre productif.

Une boucle bien construite (entrelacement des instructions pour éviter les 'stall'):
mov ecx, N
goLOOP:
...
...
sub ecx, 1
jnz short goLOOP

sera à tout coup plus performante que REP LODSB et autres trucs du siecle dernier.
C'est comme utiliser encore la FPU alors qu'il y a SSE quand ce n'est pas AVX.

ciao...
BruNews, MVP VC++
3
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
23 oct. 2012 à 00:51
En réalité,je pense que Brunews est certainement très compétant en programmation mais qu'il néglige ou ignore le fonctionnement intime d'une unité centrale.
Les instructions dont il s'agit sont, en effet, loin d'être obsolètes.
Voici un exemple datant du siècle dernier :
?
MOV SI,FROM
MOV DI,TO
MOV CX,65535
REP MOSW
?
Cette dernière instruction déplace,à elle seule, 65535 mots depuis l'emplacement de mémoire pointé par SI vers celui pointé par DI
(Turbo Assembler Users' Guide page 184,1988)
En fait, MOSW réalise en 7 microcycles les opérations suivantes:
MOV [SI],[DI] (4 cycles)
SI=SI+1, DI=DI+1, CX=CX-1 (1 cycle)
REP répéter MOSW si CX n'est pas nul (2 cycles).
Comment cela est-il possible ? Voir "Microprogrammation" sur Wikipedia.
Cette technique qui a été introduite sur les miniordinateurs au milieu des années 60, permet en effet de réaliser au sein même de l'unité centrale des opérations simultanées.

Amicalement.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 oct. 2012 à 22:11
No probleme, pas de molémique mais une discussion intéressante.

Fortran a évolué au cours des ans et il existe toujours. Un de ses principaux promoteurs à ma connaissance est Intel qui fournit des libs optimisées pour Fortran dans sa Math Kernel Library.

Ce qui suit ne traitera que de l'architecture Intel x86 (en 32 ou 64).

Quand je parle des 3 canaux des CPUs, c'est sur 1 même CPU. Si on distribue un traitement sur plusieurs CPUs (ou CORE), on parlera de multithreading.

Intel486, 1 seul canal:
Exec1: mov eax, ecx
Exec2: add edx, 2

Le Pentium de 1993 introduit la notion de 2 canaux.
Exec1, canal 1: mov eax, ecx
Exec1, canal 2: add edx, 2
canal2 s'exécute en simultané à canal1. Ceci n'est malheureusement pas vrai à tout coup, ce serait trop beau. C'est tout l'art d'entrelacer correctement les instructions.
Il est clair que:
lea edx, [edx + eax*4 - 4]
lea edx, [edx + ecx*4]
ne passera pas en 1 op multi canal (parallélisation d'instructions), la seconde instruction étant dépendante du résultat de la premiere.
Il y a une importante littérature sur la parallélisation des instructions, lire Michael Abrash (et autres).

goLOOP:
..
..
sub ecx, 1
jnz short goLOOP

Aucun malaise sur "remontée" à goLOOP, les unités de prefetch actuelles font cela à merveille.

J'ai fait un exemple comparatif "REP MOVSQ" vs boucle sur ecx.
http://brunews.com/cpycmp.zip
Code et exe (Windows x64) sont dans le zip.

J'alloue 3 pages mémoire (pDATA, pA, pB), bouton lance copie de pDATA vers pA par REP MOVSQ, autre bouton copie de pDATA vers pB par MOVDQA.
Sur CoreI7 950, 12 Go RAM:
MOVDQA : 253 ticks
REP MOVSQ : 302 ticks, ce qui fait 19.36 % de plus.

A noter aussi que RSI et RDI ne sont pas des registres "generaux", on doit les restituer en sortie de fonction tels qu'on les a trouvés, ce n'est pas à négliger. Quand on écrit la boucle soi meme, on utilise les registres qu'on a de dispo sur le moment, rien d'imposé.

ciao...
BruNews, MVP VC++
1
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 oct. 2012 à 09:41
Le discours concerne le mode protégé, je peux donc supposer qu'on a switché en x64.
Si on reste en 16 bits, oublier ce qui suit.

cpy48:
add rdx, 48
movdqa xmm0, [rcx]
movdqa xmm1, [rcx + 16]
movdqa xmm2, [rcx + 32]
movdqa [rdx - 48], xmm0
movdqa [rdx - 32], xmm1
movdqa [rdx - 16], xmm2
add rcx, 48
sub eax, 1
jnz short cpy48:

rcx : addr source
rdx : addr dest
eax : nbr de fois 48 octets

Ici j'utilise les 3 canaux des CPUs d'aujourd'hui sans aucun STALL, 48 octets par tour.
Va donc vérifier si le "Intel XE 2013" genere des 'REP xxx', faut pas y songer.

Le fonctionnement intime des années 60 ne doit plus sortir des musées.

ciao...
BruNews, MVP VC++
0
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
24 oct. 2012 à 14:58
Petite info,
Avec les nouveaux matériels il semblerait que

For legacy mode, Load byte at address DS:(E)SI into AL.
For 64-bit mode load byte at address (R)SI into AL.

Ces antiquités sont à oublier.

soit erroné.Après des tests de rapidité sur le masm32 forum,ces intrustions sont devenus plus rapides pour certain matériel.
En gros,elles redeviennent à la mode.
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
27 oct. 2012 à 02:55
@ Brunews
J'avoue ne pas être compétant en 64 bits et encore moins en multiprocesseurs. Mais le fragment de code que j'ai cité existe aussi sous la forme REP MOVSD en 32 Bits et REP MOVSQ pour le 64.
Par rapport à ce qui date de 50 ans, le fait de passer de 16 bits en 64 bits ne change en rien le fonctionnement intime d'un processeur. Quant au fait de pouvoir distribuer l'exécution d'un programme entre trois processeurs parallèles, je m?interroge : est- ce qu'on ne pourrait pas, dans ton morceau de code, utiliser avantageusement trois MOVSQ ? Et le saut en arrière JNZ short cpy48, ne risque-t-il pas, s'il est mal placé, d'obliger le processeur à recharger sa pile à partir de la mémoire centrale ? Ce qui n'a jamais lieu avec le REP.
Je tiens à préciser que je ne cherche pas du tout à polémiquer : je n'ai pas de réponse à ces questions et je cours mêmele risque qu'elles soient stupides. En fait, je suis d'une époque où à l'achat d'un mini computeur, on recevait une caisse de documentation qui en décrivait le fonctionnement dans le détail, une shématèque avec l'emplacement de chaque circuit intégré, le nom de tous les signaux qui passaient d'une carte à l'autre et d'une armoire à l'autre. C'est avec l'arrivée du PC que j'ai été confronté avec cette horreur qui s'appelle la rétention d'information dans le seul but de se rendre indispensable.
Enfin, cher Brunews, en recherchant sur Google des renseignements sur les 64 bits, j'ai été surpris de trouver le mot « Fortran ». Est-ce vraiment le nom du compilateur que j'ai utilisé avec l'assembleur dans les années soixante du siècle dernier ?
Amicalement.
0
Rejoignez-nous