CPU - Drapeaux - Obtenir leur état

Pour discuter de l'assembleur
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

CPU - Drapeaux - Obtenir leur état

Message par Ollivier »

Code : Tout sélectionner

Procedure GetFlags()
!        PushF
!        Pop       RAX
         ProcedureReturn
EndProcedure
Pour le 32 bits (x86), remplacer "RAX" par "EAX".

/!\ Attention /!\

Cette fonctionnalité est disponible depuis le débogueur natif de PureBasic.
Il est recommandé de lire les codes sources proposés par Mesa.

Aussi, Falsam a poussé la recherche avec l'instruction ASM CpuId. Instruction qui offre un panel exhaustif d'informations supplémentaires.
Dernière modification par Ollivier le mar. 25/oct./2016 19:20, modifié 3 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: CPU - Drapeaux - Obtenir leur état

Message par GallyHC »

Bonjour,

Je vais me permettre une petite question. Crois-tu qu'un code petit soit il, sans aucun commentaire soit vraiment utile. Sachant que dans ce cas ce sera dur de le trouvais avec recherche (même les bots auront du mal à le référencer)?

Après les membres du site tout comme moi je penses, mérite des explications sur le code que tu postes. Par exemples j'ai une valeur avec ton code et alors c'est quoi pour de vrai...

Cordialement,
GallyHC

PS: je ne vais pas faire le même commentaire sur ton autres code, mais c tout pareil.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par Ollivier »

Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: CPU - Drapeaux - Obtenir leur état

Message par Kwai chang caine »

T'as pas tort GALLYHC 8)
Une procédure sans exemple, c'est un peu, de mon avis, mépriser les "sans dent" :lol:
Surtout qu'en général, ce n'est pas un travail supplémentaire, puisque l'exemple simple existe, le créateur ayant en principe testé le code qu'il soumet. ..

Ceci dit, l'ASM est un des rares sujets ou l'explication est plus néfaste que l'ignorance :lol:
Quand on voit un code ASM sans commentaire, on peut en vouloir à son créateur :?
Mais quand on voit le même code avec commentaires, on s'en veut à soi même :mrgreen:

L'ASM c'est le gourou de la programmation, quand il dit quelque chose, faut le croire sans se poser de questions, de peur d'obtenir une réponse :lol:
Dernière modification par Kwai chang caine le lun. 24/oct./2016 8:29, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: CPU - Drapeaux - Obtenir leur état

Message par Zorro »

oui, mais sur ce forum , il y a une rubrique Asm

ici : http://www.purebasic.fr/french/viewforum.php?f=12

respecter au mieux les rubriques du forum, c'est aussi clarifier a qui se destine les codes ;)

c'est peut etre un truc ou astuce, mais c'est d'abord de l'assembleur ! donc ...

(je sais pas ce que font les modos ici ! (comme ça tout le monde en prends pour son grade :lol: )
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: CPU - Drapeaux - Obtenir leur état

Message par Kwai chang caine »

Tout à fait d'accord avec toi
Je me suis fait la même réflexion, pour ce qui est du sujet.

D'autant plus si il n'y a pas de commentaire, et d'exemple.
Cela prouve que le post s'adresse à un public averti "qui en vaut deux" :mrgreen:

Pour les modos, je ne veux pas d'ennui avec la police :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par falsam »

Hello Zorro & Kwai chang caine. Alors on ronchonne de bon matin ? ça va l'estomac ? pas trop de sécrétion de biliaire ?

Le sujet a été posté dans la nuit et ce n'est pas un drame si durant quelques heures ce sujet ne se trouve pas dans la bonne section.

Les modérateurs ne peuvent pas parcourir tous les sujets. Si vous pensez qu'il y a un souci dans un sujet pensez à cliquer sur l'icone ! situé en bas à droite de chaque message.

@GallyHC : J'espére que le lien fourni par Ollivier aura éclairé ta lanterne :wink:

@Ollivier : Pardonne moi mon insolence mais je n'ai rien compris et ton lien ne m'apporte rien de plus.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: CPU - Drapeaux - Obtenir leur état

Message par GallyHC »

Bonjour,

Grace au lien d'Olivier, j'ai re-compris ce que j'avais compris. Par contre, je ne vois toujours l'utilité, ni même en quoi on peu l'utilisé.

Cordialement,
GallyHC

PS: Ne pas mettre de commentaire sur son propre "topic" avec source est un peu un manque de respect vis a vis des utilisateurs. C'est un peu comme si je balancer un clé usb sur le bureau d'un dev (ami) et que je parte.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par Ollivier »

Falsam a écrit :Pardonne moi mon insolence mais je n'ai rien compris et ton lien ne m'apporte
rien de plus.
Dès que je peux, je rajoute un bon code suffisamment explicatif.
Je m'en sers pour vérifier des instructions ASM. Il y a peut-être un équivalent dans le débogueur. S'il s'avère qu'il n'y en a pas, je pense qu'il faudra redéplacer le sujet dans Truc & Astuces (ou Trip n tick).
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Re: CPU - Drapeaux - Obtenir leur état

Message par Mesa »

Oui, on a accès aux FLAGS avec le deboggeur:

Code : Tout sélectionner

Procedure GetFlags()
  ! PushFD ; Copier les Flags sur la pile
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86 ; Si processeur 32 Bits ou OS 32 Bits alors utiliser EAX sinon utiliser RAX
    ! Pop EAX ; copier la pile dans eax ; x86
  CompilerElse 
    ! Pop RAX; copier la pile dans rax ; x64  
  CompilerEndIf
  ;Mettre un point d'arrêt ici avec F9 ou par le menu "Débogueur\Point d'arrêt"
  ProcedureReturn ; ProcedureReturn renvoie toujours eax ou rax
EndProcedure


ShowAssemblyViewer() ; Avec le point d'arrêt, la fenêtre qui s'ouvre montre bien que EAX ou RAX est égal à FLAGS
a.q=GetFlags()
Debug a
Debug Hex(a)
Debug Bin(a)

Le bit 21 des FLAGS permet de savoir si le CPU a le CPUID: code de Froggerprogger

Code : Tout sélectionner

;Reading out the CPUID-Data, if available
;
;by Froggerprogger 10.12.03 http://forum.purebasic.com/english/viewtopic.php?p=91098

Dim CpuFeatures.s (32,2)
CpuFeatures(0,0) = "FPU  :  available"
CpuFeatures(1,0) = "VME  :  Virtual 8086 Mode Enhancements"
CpuFeatures(2,0) = "DE  :  Debugging Extension, I/O Breakpoints"
CpuFeatures(3,0) = "PSE  :  Page Size Extension 4MB"
CpuFeatures(4,0) = "TSC  :  command RDTSC available"
CpuFeatures(5,0) = "MSR  :  commands RDMSR and WRMSR available"
CpuFeatures(6,0) = "PAE  :  Physical Address Extension > 32-Bit"
CpuFeatures(7,0) = "MCE  :  Machine Check Exception"
CpuFeatures(8,0) = "CX8  :  command CMPXCH8B available"
CpuFeatures(9,0) = "APIC  :  available"
CpuFeatures(10,0) = "<reserved>"
CpuFeatures(11,0) = "SEP  :  commands SYSENTER/SYSEXIT | SYSCALL/SYSRET available"
CpuFeatures(12,0) = "MTTR  :  supported"
CpuFeatures(13,0) = "PGE  :  supported"
CpuFeatures(14,0) = "MCA  :  available"
CpuFeatures(15,0) = "CMOV  :  commands CMOVxxx available, together with FPU, also FCOMI/FCMOV"
CpuFeatures(16,0) = "PAT"
CpuFeatures(17,0) = "PSE-36"
CpuFeatures(18,0) = "PSN  :  Processor serial number"
CpuFeatures(19,0) = "CLFSH  :  command CLFLUSH available"
CpuFeatures(20,0) = "<reserved>"
CpuFeatures(21,0) = "D5  :  Debug store supported"
CpuFeatures(22,0) = "ACPI  :  check temperature and control CPU"
CpuFeatures(23,0) = "MMX  :  supported"
CpuFeatures(24,0) = "FXSR  :  commands FXSAVE and FXRSTOR available "
CpuFeatures(25,0) = "SSE  :  supported"
CpuFeatures(26,0) = "SSE2  :  supported"
CpuFeatures(27,0) = "SS  :  SelfSnoop"
CpuFeatures(28,0) = "<reserved>"
CpuFeatures(29,0) = "TM  :  thermal monitor"
CpuFeatures(30,0) = "3DNow!  :  Instructions Extension available (AMD only)"
CpuFeatures(31,0) = "3DNow!  :  Insctructions available (AMD only)"


;test if EFlags Bit 21 can be changed. Then CPUID is available
!PUSHFD
!POP EAX
!MOV EBX, EAX
!XOR EAX, 00200000h
!PUSH EAX
!POPFD
!PUSHFD
!POP EAX
!XOR EAX, EBX
;jump to goon1, if CPUID is available
!JNZ goon1
MessageRequester("","No CPUID available.",0)
End

!goon1:
Global a.l, b.l, c.l, d.l

MessageRequester("Bouh","Chouette, vous avez un CPU plus récent qu'un Pentium III ! ;)) et voici ce qu'il a dans le ventre",#PB_MessageRequester_Info)

!MOV EAX, 0
!CPUID
!MOV [v_a], EAX
!MOV [v_b], EBX
!MOV [v_c], ECX
!MOV [v_d], EDX

b$=Left(PeekS(@b,-1,#PB_Ascii),4)
c$=Left(PeekS(@c,-1,#PB_Ascii),4)
d$=Left(PeekS(@d,-1,#PB_Ascii),4)

Debug a
Debug "Name:" + b$ + d$ + c$


If a >= 1
  !MOV EAX, 1
  !CPUID
  !MOV [v_a], EAX
  !MOV [v_b], EBX
  !MOV [v_c], ECX
  !MOV [v_d], EDX
  
  For i=0 To 31
    If d>>i&1   
      CpuFeatures(i,1) = "YES"
    Else
      CpuFeatures(i,1) = "NO"
    EndIf
  Next
  
Else
  For i=0 To 31
    CpuFeatures(i,1) = "no information available"
  Next
EndIf

For i=0 To 31
  Debug CpuFeatures(i,0) + " :     "+CpuFeatures(i,1)
Next
Mais si on veut afficher les FLAGS en détail, un allemand a fait ça:

Code : Tout sélectionner

;http://www.purebasic.fr/english/viewtopic.php?f=13&t=37083&hilit=PushF
; Define ShowAsmInfo

		OpenWindow(0,0,0,960,200,"ASM Information")
		Global AsmInfoID=TextGadget(0,0,0,960,500,"")
		Global AsmInfoText.s


		Macro WaitKey
				Repeat
				Until WaitWindowEvent(10)=#PB_Event_CloseWindow;#WM_CHAR
		EndMacro

		Macro ShowAsmInfo(Text)

				#DecimalMode=#True

				Global VarAX.l          ;der Ordnung halber alle Variablen deklarieren
				Global VarBX.l
				Global VarCX.l
				Global VarDX.l
				Global VarDI.l
				Global VarSI.l
				Global VarBP.l
				Global VarSP.l
				Global FA.b             ;C, P, A, Z, S, D, O - Flags
				Global FC.b
				Global FD.b
				Global FO.b
				Global FP.b
				Global FS.b
				Global FZ.b

				!PUSHFD                 ;Flags sichern
				!PUSHAD                 ;alle Register sichern
				!MOV [v_VarAX],eax      ;alle Register in Variablen schreiben
				!MOV [v_VarBX],ebx
				!MOV [v_VarCX],ecx
				!MOV [v_VarDX],edx
				!MOV [v_VarDI],edi
				!MOV [v_VarSI],esi
				!MOV [v_VarBP],ebp
				!MOV [v_VarSP],esp

				!PUSHFD                 ;das 32-bittige E-FLAG-Register auf den Stack schieben
				!POP eax                ;und in das EAX-Register laden

				!MOV [v_FC],0           ;für Carry-Flag; Variable erstmal auf Null
				!SHR eax,1              ;nach Rechts shiften, das letzte geshiftete Bit steht im Carry-Flag
				!ADC [v_FC],0           ;Wert des Carry-Flags zum Variablen-Wert addieren

				!MOV [v_FP],0           ;für Parity-Flag
				!SHR eax,2
				!ADC [v_FP],0

				!MOV [v_FA],0           ;für Auxiliary-Flag
				!SHR eax,2
				!ADC [v_FA],0

				!MOV [v_FZ],0           ;für Zero-Flag
				!SHR eax,2
				!ADC [v_FZ],0

				!MOV [v_FS],0           ;für Signum-Flag
				!SHR eax,1
				!ADC [v_FS],0

				!MOV [v_FD],0           ;für Direction-Flag
				!SHR eax,3
				!ADC [v_FD],0

				!MOV [v_FO],0           ;für Overflow-Flag
				!SHR eax,1
				!ADC [v_FO],0

				Delay(1)                ;sonst funktionierts direkt nach einem MessageRequester nicht

				;hWnd=GetForegroundWindow_()

				CompilerIf #DecimalMode
						AsmInfoText+"C="+Str(FC)+"  P="+Str(FP)+"  A="+Str(FA)+"  Z="+Str(FZ)+"  S="+Str(FS)+"  D="+Str(FD)+"  O="+Str(FO)+"   EAX="+Str(VarAX)+"  EBX="+Str(VarBX)+"  ECX="+Str(VarCX)+"  EDX="+Str(VarDX)+"  EDI="+Str(VarDI)+"  ESI="+Str(VarSI)+"  EBP="+Str(VarBP)+"  ESP="+Str(VarSP)+"     ["+Text+"]"+#CRLF$
				CompilerElse
						AsmInfoText+"C="+Str(FC)+"  P="+Str(FP)+"  A="+Str(FA)+"  Z="+Str(FZ)+"  S="+Str(FS)+"  D="+Str(FD)+"  O="+Str(FO)+"   EAX="+Hex(VarAX)+"  EBX="+Hex(VarBX)+"  ECX="+Hex(VarCX)+"  EDX="+Hex(VarDX)+"  EDI="+Hex(VarDI)+"  ESI="+Hex(VarSI)+"  EBP="+Hex(VarBP)+"  ESP="+Hex(VarSP)+"     ["+Text+"]"+#CRLF$
				CompilerEndIf
				SetWindowText_(AsmInfoID,@AsmInfoText)

				!POPAD                  ;die gesicherten Register wieder zurück holen
				!POPFD                  ;die gesicherten Flags wieder zurück holen

		EndMacro

; EndDefine

Global DxMul.l=1000
Global DxMem.l=123

Global x.l=50
Global y.l=100
Global Screenx.l=2000
Global Screeny.l=1000

EnableASM

MOV eax,x
MOV ecx,y
CMP eax,ScreenX      ; x > ScreenX ?
JG exitMP32
CMP ecx,ScreenY      ; y > SreenY ?
JG exitMP32
OR eax,ecx         ; x OR y < 0?
JS exitMP32

;MOV eax,DxMul      ; DxMul
;IMUL ecx            ; y*DxMul
IMUL ecx,DxMul      ; y*DxMul

;      SHL ecx,2            ; x*4
ShowAsmInfo("")
MOV eax,x            ; x
ShowAsmInfo("x")
SHL eax,2            ; x*4
ShowAsmInfo("x*4")
ADD eax,ecx         ; x*4+y*DxMul
ShowAsmInfo("x*4+y*dxmul")
ADD eax,DxMem         ; x*4+y*DxMul
ShowAsmInfo("+dxmem")
!exitMP32:

WaitKey
Mesa.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par falsam »

Merci Mesa
Le bit 21 des FLAGS permet de savoir si le CPU a le CPUID
La au moins on sait à quoi ça sert.

➽ CPUID : http://www.gladir.com/LEXIQUE/ASM/cpuid.htm

Si on souhaite lire le constructeur du processeur alors on met la valeur 0 dans le registre EAX pour lire ensuite les registre EBX, ECX, EDX (Sont fous ces fondeurs de mettre leurs noms sur 3 registres )

Code : Tout sélectionner

;CPUID  fournit  une interface pour demander des informations concernant un CPU.
;Cette instruction retourne les informations du microprocesseur dans les 4 registres suivants: EAX, EBX, ECX, EDX.

Procedure.s CPUGetVendor()
  Protected a.l ;Cette variable contiendra la valeur du registre EBX 
  Protected b.l ;Cette variable contiendra la valeur du registre EDX
  Protected c.l ;Cette variable contiendra la valeur du registre ECX   
  
  ;si EAX = 0 alors EAX retourne les valeurs des registres EBX, EDX, ECX
  !mov eax,0
  
  !cpuid 
  
  ;EBX ← chaîne de caractères d'identification du fabricant :
  ; Intel: 756E6547h ("Genu")
  ; AMD: 68747541h ("Auth")
  !mov [p.v_a], ebx
  
  ;EDX ← chaîne de caractères d'identification du fabricant :
  ; Intel: 49656E69h ("inel")
  ; AMD: 69746E65h ("enti")
  !mov [p.v_b], edx 
  
  ;ECX ← chaîne de caractères d'identification du fabricant :
  ; Intel: 6C65746Eh ("ntel")
  ; AMD: 444D4163h ("cAMD")
  !mov [p.v_c], ecx 
  
  Debug "Valeur du registre EBX: " + PeekS(@a, 4, #PB_Ascii)
  Debug "Valeur du registre EDX: " + PeekS(@b, 4, #PB_Ascii)
  Debug "Valeur du registre ECX: " + PeekS(@c, 4, #PB_Ascii)
  
  ProcedureReturn PeekS(@a, 4, #PB_Ascii) + PeekS(@b, 4, #PB_Ascii) + PeekS(@c, 4, #PB_Ascii)
EndProcedure

Debug "Fabricant: " + CPUGetVendor()
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par Ollivier »

@Mesa

Merci pour contribution, j'ai rajouté une recommandation en tête de sujet.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par Ar-S »

(Sont fous ces fondeurs de mettre leurs noms sur 3 registres )
Mais c'est claire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: CPU - Drapeaux - Obtenir leur état

Message par Ollivier »

@Falsam

Merci pour ta contribution. L'inventaire des drapeaux d'états est arborescent. Par exemple, CpuId indique si l'instruction CMov est prise en charge ou non.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: CPU - Drapeaux - Obtenir leur état

Message par Kwai chang caine »

Au bout de X codes, j'ai enfin à peu prés compris à quoi ça servait (Principalement celui de FALSAM :wink: )
C'est le bout du monde pour moi, mais ça reste passionnant 8O
Merci à tous 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre