LODSB en mode protégé [Résolu]

benjamindu58futur11 - 5 oct. 2012 à 19:05 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscriptionModérateurStatut 7 novembre 2014 Dernière intervention
- 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 :)
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscriptionModérateurStatut 7 novembre 2014 Dernière intervention - 5 oct. 2012 à 20:16
3
Merci
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de BruNews
Meilleure réponse
PYRHON 7 Messages postés vendredi 16 décembre 2011Date d'inscription 27 décembre 2012 Dernière intervention - 9 oct. 2012 à 13:31
3
Merci
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...

Merci PYRHON 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de PYRHON
Meilleure réponse
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscriptionModérateurStatut 7 novembre 2014 Dernière intervention - 9 oct. 2012 à 18:10
3
Merci
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de BruNews
Guilou34 142 Messages postés mercredi 5 avril 2006Date d'inscription 29 janvier 2016 Dernière intervention - 23 oct. 2012 à 00:51
1
Merci
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.
Commenter la réponse de Guilou34
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscriptionModérateurStatut 7 novembre 2014 Dernière intervention - 27 oct. 2012 à 22:11
1
Merci
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++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscriptionModérateurStatut 7 novembre 2014 Dernière intervention - 23 oct. 2012 à 09:41
0
Merci
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++
Commenter la réponse de BruNews
ToutEnMasm 552 Messages postés jeudi 28 novembre 2002Date d'inscription 26 mars 2016 Dernière intervention - 24 oct. 2012 à 14:58
0
Merci
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.
Commenter la réponse de ToutEnMasm
Guilou34 142 Messages postés mercredi 5 avril 2006Date d'inscription 29 janvier 2016 Dernière intervention - 27 oct. 2012 à 02:55
0
Merci
@ 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.
Commenter la réponse de Guilou34

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.