Page 1 sur 1
[Résolu] Savoir sous quel processeur tourne un applicatif ?
Publié : lun. 19/juil./2010 23:46
par boddhi
Salut à tous !!!
Y a-t-il un moyen PB ou une astuce pour savoir sous quel processeur tourne la machine qui exécute un applicatif ???
Le but étant d'écrire un code (Lecture/Ecriture de tags ID3v2) qui soit multiOS et compatible intel/motorola.
Or, comme il doit y avoir des accès mémoire et fichiers, se pose le problème de la lecture/écriture des octets en big endian/little endian...
Est-ce que l'utilisation de la constante #PB_Compiler_OS suffirait ??
Comme, par exemple, je ne connais pas trop Linux, je suppose qu'il doit pouvoir peut-être tourner sous ces deux processeurs ??? Auquel cas, #PB_Compiler_OS ne serait pas satisfaisant...
Merci.
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : lun. 19/juil./2010 23:58
par GallyHC
Bonjour,
J’ai fait plusieurs sources qui charge des fichiers genre CAB, ZIP et qui fonctionne en Multi-OS. Il faut juste bien choisir le types des variables et donc le nombre de bits a prendre.
Cordialement,
GallyHC
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 0:32
par boddhi
@GallyHC
J'ai rapidement examiné 2 de tes codes : Chargements CAB et PCX
Effectivement, je sais qu'en choisissant le type de variables dans une structure on peut contourner (
seulement) une partie du problème...
Tes codes se seraient, en effet, compliqués si tu avais eu à gérer l'écriture en fonction du processeur...
Voilà
Code : Tout sélectionner
a.l=370934016
Debug PeekL(@a)
Debug "Intel retourne"
Debug Hex(PeekL(@a))
Debug "au lieu de"
Debug "$"+RSet(Hex(PeekB(@a)),2,"0")+RSet(Hex(PeekB(@a+1)),2,"0")+RSet(Hex(PeekB(@a+2)),2,"0")+RSet(Hex(PeekB(@a+3)),2,"0")
Je dois donc écrire une procédure qui inverse l'ordre des octets, quelque soit le type de variable > .b (ça, ça n'est pas le problème

), et ce, en fonction du processeur utilisé (ici, mon problème

)...
Je ne peux pas me permettre de traiter chaque valeur (.u, .i, ...) en .b pour être sûr qu'elle soit convenablement lue ou écrite...
D'où ma question...
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 0:46
par GallyHC
Je ne vois pas le problème...
370934016 donne bien $161C0100 en hexa et on inverse les poids fort et les poids faible. Donc $00011c16.
Cordialement,
GallyHC
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 0:55
par boddhi
370934016 donne bien $161C0100 en hexa et on inverse les poids fort et les poids faible. Donc $00011c16.
Intel retourne $161C0100 mais Motorola retournera $00011C16 soit 72726.
Il faut donc que je sache quand inverser la chaine hexa...
Exemple
Code : Tout sélectionner
Structure ID3
TagID3.s{3}
VersionMaj.b
VersionMin.b
Flag.b
Taille.i
EndStructure
Fichier.s="C:\test.mp3"
If OpenFile(0,Fichier)
WriteByte(0,$49)
WriteByte(0,$44)
WriteByte(0,$33)
WriteByte(0,$04)
WriteByte(0,$00)
WriteByte(0,$80)
WriteByte(0,$00)
WriteByte(0,$01)
WriteByte(0,$1C)
WriteByte(0,$16)
CloseFile(0)
EndIf
Debug "L'entête du fichier correspond à cela :"
Debug "$49 44 33 04 00 80 00 01 1C 16"
Debug "où $00 01 1C 16 équivaut à "+Str($00011C16)
Debug ""
Define.ID3 *TagID3
If ReadFile(0,Fichier)
*TagID3=AllocateMemory(10)
ReadData(0,*TagID3,10)
Debug "Sous Intel on obtiendra $"+Hex(*TagID3\Taille)+" soit "+Str(*TagID3\Taille)
Debug "alors que sous Motorola on aura bien $00011C16 soit 72726"
CloseFile(0)
EndIf
DeleteFile(Fichier)
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 9:13
par MLD
Salut boddhi
Sous window il faut utilisé l'api GetSystemInfo. Fait une recherche sur le fofo U.S pour voir?
Michel
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 9:23
par MLD
Re
Comme aujourd'hui c'est mon jour de bonté, j'ai cherché pour toi.
Code : Tout sélectionner
Structure SysInfo
StructureUnion
dwOemId.l
wProcessorArchitecture.w
wReserved.w
EndStructureUnion
dwPageSize.l
lpMinimumApplicationAddress.l
lpMaximumApplicationAddress.l
dwActiveProcessorMask.l
dwNumberOfProcessors.l
dwProcessorType.l
dwAllocationGranularity.l
wProcessorLevel.w
wProcessorRevision.w
EndStructure
GetSystemInfo_(@si.SysInfo)
Debug si\wProcessorArchitecture
Debug "---"
Debug si\dwPageSize
Debug si\dwActiveProcessorMask
Debug si\dwNumberOfProcessors
Debug si\dwProcessorType
Debug si\wProcessorLevel
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 9:58
par boddhi
@MLD
Merci pour ta bonté et tes recherches
Si j'ai bien compris, on utiliserait GetSystemInfo_(@si.SysInfo) pour savoir si l'ordinateur est basé sur un Intel ou non. Ok.
Je sais, je vais encore jouer les chieurs

, mais...
C'est une API windows et si elle convient parfaitement pour Windows, imbriquée dans un CompilerIf #PB_Compiler_OS, elle ne résout que partiellement mon objectif qui est, à partir d'un code MultiOS, de déterminer sous quel processeur une machine tourne...
Comme je ne connais ni Linux ni MacOs, je n'ai aucune idée de la manière dont je dois procéder si ce n'est exclure l'usage de ce code à ces OS. Ce qui n'est pas du tout mon but...
Je garde quand même ton bout de code en archive, il servira bien un jour ou l'autre

Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 10:19
par MLD
boddhi a écrit :@MLD
Merci pour ta bonté et tes recherches
Si j'ai bien compris, on utiliserait GetSystemInfo_(@si.SysInfo) pour savoir si l'ordinateur est basé sur un Intel ou non. Ok.
Je sais, je vais encore jouer les chieurs

, mais...
C'est une API windows et si elle convient parfaitement pour Windows, imbriquée dans un CompilerIf #PB_Compiler_OS, elle ne résout que partiellement mon objectif qui est, à partir d'un code MultiOS, de déterminer sous quel processeur une machine tourne...
Comme je ne connais ni Linux ni MacOs, je n'ai aucune idée de la manière dont je dois procéder si ce n'est exclure l'usage de ce code à ces OS. Ce qui n'est pas du tout mon but...
Je garde quand même ton bout de code en archive, il servira bien un jour ou l'autre

Je comprend. Mais dans ce cas il faut faire un soft qui démarre avant le système d'exploitation. Une seule solution le langage machine ou assembleur , pour aller chercher l'information dans le bios. (si je ne me trompe pas ?)
Michel
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 17:09
par pbprint
Salut Michel
...il faut faire un soft qui démarre avant le système d'exploitation. Une seule solution le langage machine ou assembleur , pour aller chercher l'information dans le bios. (si je ne me trompe pas ?)
Non, tu ne te trompes pas Michel, j'allais proposer exactement la même chose. Mais je crois qu'en C se sera beaucoup mieux (avec GetSystemInfo_(@si.SysInfo) appelée avant le test des types, plus rapide je crois..)
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 21:39
par TazNormand
@Mekkisoft/PbPrint : GetSystemInfo_ étant également une API windows, ça ne va pas l'aider non plus pour les proco Motorola/IBM PowerPC ou autre sous Linux. Arrêtes de polluer les topics avec tes réponses à 2 eurocents (et encore je suis généreux) !!! la cinquantaine et un comportement d'ado ! tss, et dire que tu veux nous donner des leçons
@Fred/Dobro/LSI : bannissez-moi ce parasite avant qu'il ne prolifère

Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 21:49
par GallyHC
Il y a peu etre un truc que je ne comprend plus. Mais une valeur numerique si on fait une convertion simple en hexa ce sera toujours le même resultat, ou alors l'hexa change et donc 1,2,3,4,5,6,7,8,9,A,B,C,D,E,F n'est plus la base 16...
Donc en faisant une conversion simple et en inversant apres sa donne quoi?
370934016 en hexa pure ce sera toujours $161C0100 et non pas $00011c16 (vu que $00011c16 = 72726), ou y a un truc que je ne comprends pas ?
Cordialement,
GallyHC
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 21:57
par boddhi
Et dire que la solution était là sous mes yeux... J'ai honte
Il suffit de :
Code : Tout sélectionner
Valeur1.w=1
Valeur2.b=PeekB(@Valeur1)
Debug "Valeur 1 : $"+Hex(Valeur1)
Debug "Valeur 2 : $"+Hex(Valeur2)
If Valeur1=Valeur2
Debug "On suppose qu'on tourne sous Intel"
Else
Debug "On suppose qu'on tourne sous Motorola"
EndIf
Debug ""
; Ce qui donne, condensé
Valeur1=1
If PeekB(@Valeur1)=Valeur1
Debug "On suppose qu'on tourne sous Intel"
Else
Debug "On suppose qu'on tourne sous Motorola"
EndIf
Vous confirmez ??? (Si quelqu'un tourne sous Motorola...)
Re: Comment savoir sous quel processeur tourne un applicatif
Publié : mar. 20/juil./2010 22:20
par boddhi
GallyHC a écrit :370934016 en hexa pure ce sera toujours $161C0100 et non pas $00011c16 (vu que $00011c16 = 72726), ou y a un truc que je ne comprends pas ?
Le problème est qu'un Intel n'agence pas les octets en mémoire de la même manière qu'un Motorola.
Pourquoi faire simple quand on peut faire compliqué ? (j'ignore en tout cas les raisons historique, architecturale, etc de cette conception)
Un test simple pour comprendre :
Déboggueur => Mémoire => Etendue =
@valeur => - =
@valeur+2 => Afficher
Tu auras comme résultat :
Sous Intel : $01 00
Sous Motorola : $00 01
Si tu continues avec :
Code : Tout sélectionner
AutreValeur.w=PeekB(@Valeur)<<8+PeekB(@Valeur+1)
Debug AutreValeur
AutreValeur, sous Intel, prendra la valeur $100, soit 256, alors que sous Motorola, elle aura bien pour valeur 1.
Ce qui n'est pas la même chose...
