Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
code assembleur/linux
Envoyé par: reconor

Bonjour,
je vous remercie infiniment pour les grands efforts que vous faites pour nous aider et que si nous sommes debout sur les epaules des geants .
je veux bien que vous m'expliquez ce codes en assembleur et s'il y'a une possibilité de le convertir en assembleur sous linux tout en faisant sortir ces mots sur le port parallele j'attend votre aide le plus tot possible .
*******************************
MOV AX, CS
MOV DS, AX


MOV SI, 0

next_situation:

MOV AL, datCW[SI]
OUT 7, AL

INC SI

CMP SI, 4
JB next_situation
MOV SI, 0

JMP next_situation

; données binaires pour la rotation
; dans le sens des aiguilles d'une
; montre, d'une demi-étape :
datCW db 110b
db 100b
db 011b
db 010b

; données binaires pour la rotation
; dans le sens contraire aux aiguilles
; d'une montre, d'une demi-étape :
datCCW db 011b
db 001b
db 110b
db 010b


; données binaires pour la rotation
; dans le sens des aiguilles
; d'une montre, d'une étape :
datCW_FS db 001b
db 011b
db 110b
db 000b

; données binaires pour la rotation
; dans le sens contraire des aiguilles
; d'une montre, d'une étape :
datCCW_FS db 100b
db 110b
db 011b
db 000b
***************************

merci bien d'avance:-p



Poste le Friday 9 June 2006 13:13:54
Répondre     Citer    
Re: code assembleur/linux
Envoyé par: abgech

Je ne sais pas où tu as récupéré ton code, mais c'est le prototype d'un travail de bricoleur, absolument pas un travail de professionnel. Pour être franc: direction poubelle. :-F
Pratiquement pas de commentaires au niveau du code, et surtout, une boucle infinie dont on ne peut sortir que par une interruption matérielle.

En principe, d'après ce que l'on peut voir, il envoie, à l'infini, 4 séries de 4 octets chacune sur le port 7. D'après les maigres commentaires, on peut en déduire qu'il envoie 4 matrices de transformation d'une figure, mais pourquoi le répète-t-il à l'infini ?
Si tu nous disais exactement ce que tu veux faire, il serait, peut-être, possible de t'aider.

Ce code est totalement inutilisable sous Linux (et sous Windows également) parce qu'il fait appel à une instruction (OUT 7, AL) qui fait une sortie directe sur le matériel et qui ne peut pas tourner en mode utilisateur, mais uniquement en mode noyau.

De façon générale, les applications qui nécessite l'emploi de l'assembler ne tournent pas avec un système d'exploitation (SE). Ce sont des logiciels qui doivent respecter des contraintes de temps extrêmement rigoureuses et un système d'exploitation (surtout pré-emptif comme Unix ou l'un de ses clones/dérivés (Linux, ...). Ces applications sont développées à l'aide d'un SE, mais elles s'exécutent sur des cartes processeur "stand-alone".

Il est facile de traduire ce code en C:
...
unsigned char datCW{
                    {/* données binaires pour la rotation dans le sens des aiguilles d'une
                        montre, d'une demi-étape */
                     0x06,0x04,0x03,0x02
                    } 
                    {/* données binaires pour la rotation dans le sens contraire aux aiguilles
                        d'une montre, d'une demi-étape */
                     0x03,0x01,0x06,0x02
                    }
                    {/* données binaires pour la rotation dans le sens des aiguilles d'une       
                        montre, d'une étape */
                     0x01,0x03,0x06,0x00
                    }
                    {/* données binaires pour la rotation dans le sens contraire des aiguilles
                        d'une montre, d'une étape /*
                     0x04,0x06,0x03,0x00
                    }
                   }
int x1,x2;
...
for ( ; ; )
    for (x1 = 0; x1 < 4; x1++)
        for (x2 = 0; x2 < 4; x2++)
            putchar(datCW[x1,x2];
...

NB: Ce code n'a pas été compilé, il peut contenir des erreurs de syntaxe, il s'agit simplement de te donner une idée.

Tu redirige le fichier de sortie standard (stdout) sur le port 7 et le tour est joué.


Mais je ne comprends pas pourquoi la boucle infinie ... :-/

Poste le Friday 9 June 2006 17:36:56
Répondre     Citer    
Re: code assembleur/linux
Envoyé par: abgech

Après réétude du code assembler (tu vois pourquoi les commentaires sont importants, ils permettent de comprendre plus rapidement le code). Je modifie le code C du message précédent:
...
unsigned char datCW{
                    {/* données binaires pour la rotation dans le sens des aiguilles d'une
                        montre, d'une demi-étape */
                     0x06,0x04,0x03,0x02
                    } 
                    {/* données binaires pour la rotation dans le sens contraire aux aiguilles
                        d'une montre, d'une demi-étape */
                     0x03,0x01,0x06,0x02
                    }
                    {/* données binaires pour la rotation dans le sens des aiguilles d'une       
                        montre, d'une étape */
                     0x01,0x03,0x06,0x00
                    }
                    {/* données binaires pour la rotation dans le sens contraire des aiguilles
                        d'une montre, d'une étape */
                     0x04,0x06,0x03,0x00
                    }
                   }
int x1;
...
for ( ; ; )
    for (x1 = 0; x1 < 4; x1++)
        putchar(datCW[x1,0]);
...

Mais la raison de la boucle infinie fait toujours partie des questions infinies ...

Poste le Friday 9 June 2006 17:51:21
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
code assembleur/linux
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons