Asm debugger *version finale

Pour discuter de l'assembleur
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Asm debugger *version finale

Message par celtic88 »

:D hi les natives loll

Alors j ai pas trouver un code qui fait ça !!

debugger les registres :

*mise à jour ajouter le debug de drapeaux !
*correction "flag IOPL 2BIT" merci a @mesa
*version finale

Code : Tout sélectionner

EnableExplicit

EnableExplicit

CompilerIf #PB_Compiler_Debugger = 1  
  Procedure _Dasm_Debug(__asmDebug, Type,Size)
    Select Type
      Case 1
        Debug __asmDebug
      Case 2
        Debug PeekA(@__asmDebug)
      Case 3
        Debug PeekU(@__asmDebug)
      Case 4
        Debug PeekS(__asmDebug)
      Case 5
        Debug PeekS(__asmDebug,-1,#PB_Ascii)
      Case 6
        ShowMemoryViewer(__asmDebug,Size)
      Case 7
        Protected Flags.s = RSet(Bin(__asmDebug,#PB_Long), 32, "0")
        Protected AllFlags.s = ";;;;;;;;;;ID;VIP;VIF;AC;VM;RF;;NT;IOPL_h;IOPL_l;OF;DF;IF;TF;SF;ZF;;AF;;PF;;CF"
        Protected s,sf.s,rets.s
        For s = 1 To 32
          If Mid(Flags,s,1) = "1"
            sf = StringField(AllFlags,s,";")
            If sf
              rets = "[" + sf + "]"  + " " + rets
            EndIf
          EndIf
        Next
        Debug "Flags : " + rets
      Case 8
        
        EnableASM
        SUB eax, eax
        MOV eax, CS
        MOV dword [p.v___asmDebug] , eax
        Debug "[CS = " + Hex(__asmDebug) + "]"
        MOV eax, DS
        MOV dword [p.v___asmDebug] , eax
        Debug "[DS = " + Hex(__asmDebug) + "]"
        MOV eax, SS
        MOV dword [p.v___asmDebug] , eax
        Debug "[SS = " + Hex(__asmDebug) + "]"
        MOV eax, ES
        MOV dword [p.v___asmDebug] , eax
        Debug "[ES = " + Hex(__asmDebug) + "]"
        MOV eax, FS
        MOV dword [p.v___asmDebug] , eax
        Debug "[FS = " + Hex(__asmDebug) + "]"
        MOV eax, GS
        MOV dword [p.v___asmDebug] , eax
        Debug "[GS = " + Hex(__asmDebug) + "]"
        DisableASM
        
      Case 9
        Debug "Point code : "  + Str(__asmDebug)
    EndSelect
  EndProcedure
  
  Global __Dasm_Debug = @_Dasm_Debug()
CompilerEndIf

Macro Dasm_Save_SFPU_MXCSR_SSE
  PUSH    ebp
  MOV     ebp,esp
  SUB     esp,512
  AND     esp,-16
  !fxsave  [esp] ;saves the current state of the FPU, MXCSR register, and all the FPU AND SSE registers
EndMacro

Macro Dasm_Reload_SFPU_MXCSR_SSE
  !fxrstor [esp]
  MOV     esp,ebp
  POP     ebp
EndMacro

Macro Dasm_Debug(reg,Type,Size=0)
  CompilerIf #PB_Compiler_Debugger = 1  
    PUSHFD
    PUSHA
    MOV eax, reg
    PUSH dword Size
    PUSH dword Type
    PUSH eax
    CALL [v___Dasm_Debug]
    POPA
    POPFD
  CompilerEndIf
EndMacro

Macro Dasm_ShowAssembly()
  CompilerIf #PB_Compiler_Debugger = 1
    PUSHFD
    PUSHA
    EnableDebugger
    ShowAssemblyViewer()
    DisableDebugger
    POPA
    POPFD
  CompilerEndIf
EndMacro   ;call ShowAssembly 

Macro Dasm_Pause()
  CompilerIf #PB_Compiler_Debugger = 1  
    PUSHFD
    PUSHA
    EnableDebugger
    CallDebugger
    DisableDebugger
    POPA
    POPFD
  CompilerEndIf
EndMacro  ;CallDebugger 

Macro Dasm_Flags()
  CompilerIf #PB_Compiler_Debugger = 1  
    PUSHFD
    PUSHA
    MOV eax,[esp + 4*8]
    PUSH dword 0
    PUSH dword 7
    PUSH eax
    CALL [v___Dasm_Debug]
    POPA
    POPFD
  CompilerEndIf
EndMacro

Macro Dasm_ShowText(Txt)
  CompilerIf #PB_Compiler_Debugger = 1  
    PUSHFD
    PUSHA
    EnableDebugger
    Debug Txt
    DisableDebugger
    POPA
    POPFD
  CompilerEndIf
EndMacro

Macro Dasm_SegmentRegisters()
  CompilerIf #PB_Compiler_Debugger = 1  
    PUSHA
    PUSH dword 0
    PUSH dword 8
    PUSH dword 0
    CALL [v___Dasm_Debug]
    POPA
  CompilerEndIf
EndMacro

Macro Dasm_NextInstructionPointer() ;EIP
  CompilerIf #PB_Compiler_Debugger = 1  
    PUSH eax
    MOV eax , @f
    
    PUSHA
    PUSH dword 0
    PUSH dword 9
    PUSH eax
    CALL [v___Dasm_Debug]
    POPA
    
    POP eax
    !@@:
  CompilerEndIf
EndMacro

Macro Dasm_Byte(reg):Dasm_Debug(reg,2):EndMacro    ;debug byte
Macro Dasm_Word(reg):Dasm_Debug(reg,3):EndMacro    ;debug word
Macro Dasm_long(reg):Dasm_Debug(reg,1):EndMacro    ;debug long
Macro Dasm_StringU(reg):Dasm_Debug(reg,4):EndMacro ;debug string unicode
Macro Dasm_StringA(reg):Dasm_Debug(reg,5):EndMacro ;debug ascii
Macro Dasm_ShowMemory(reg,Size):Dasm_Debug(reg,6,Size):EndMacro   ;call ShowMemory 


Procedure __test(par)  
  EnableASM
  DisableDebugger ;Très important
  
  Dasm_ShowText("Asm code debugging started.")
  
  Dasm_ShowText("Asm Segment Registers:")
  Dasm_SegmentRegisters()
  
  MOV ecx, esp
  
  MOV eax ,[ecx + 4]
  
  PUSH eax
  XOR eax,eax
  
  ADD eax,2147483647
  
  Dasm_ShowText("Asm Next Instruction Pointer:")
  Dasm_NextInstructionPointer()
  ADD eax,1
  
  Dasm_ShowText("Asm Show Flags:")
  Dasm_Flags() ;overflow!
  
  Dasm_ShowAssembly()
  Dasm_ShowText(">> (Asm Pause) <<")
  Dasm_Pause()
  
  Dasm_ShowText("Asm Show EAX:")
  Dasm_long(eax)
  
  POP eax
  Dasm_ShowText("Asm Show 'STRING ASCII' EAX:")
  Dasm_StringA(eax)  
  
  Dasm_ShowText("Asm Dump Stack.")
  Dasm_ShowMemory(ecx,16)
  
  DisableASM
  EnableDebugger
EndProcedure

__test(Ascii("celtic"))

corrigez moi si je trompe !
Dernière modification par celtic88 le mar. 16/janv./2018 17:25, modifié 9 fois.
.....i Love Pb :)
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: utiliser le debugger purebasic avec les registres

Message par celtic88 »

uPDATE :)
Dernière modification par celtic88 le dim. 14/janv./2018 19:06, modifié 1 fois.
.....i Love Pb :)
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: utiliser le debugger purebasic avec les registres et fla

Message par celtic88 »

re-up
.....i Love Pb :)
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: utiliser le debugger purebasic avec les registres et fla

Message par celtic88 »

@mesa ,bonjour

merci pour les liens :roll: , donc mon code est correcte 8)
.....i Love Pb :)
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Re: utiliser le debugger purebasic avec les registres et fla

Message par Mesa »

Attention, IOPL prend 2 bits.

M.
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: utiliser le debugger purebasic avec les registres et fla

Message par celtic88 »

@mesa merci pour la correction :)

RFLAGS
Bits 63..32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13..12 11 10 9 8 7 6 5 4 3 2 1 0
Drapeaux - - - - - - - - - - - ID VIP VIF AC VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF


https://fr.wikipedia.org/wiki/RFLAGS
.....i Love Pb :)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: utiliser le debugger purebasic avec les registres et fla

Message par PAPIPP »

Bonjour celtic88

Voici un prg http://www.purebasic.fr/french/viewtopi ... 99#p188999
ou http://www.purebasic.fr/french/viewtopi ... 32&start=0 avec une procédure Livide en ASM
Ce prg sert à mesurer le temps de 3 procédures différentes.

La procédure Livide(X,L) appartient à Ollivier.

Et Ollivier me demande pourquoi j’ai modifié sa procédure avec nop
Bonjour PAPIPP,

Merci d'avoir testé et comparé. Je n'ai pas compris pourquoi l'ajout d'un NOP dans ma procédure pour mesurer?
Voici ma réponse
Bonjour Ollivier

Le nop dans ta procédure m'a servi pour me permettre un arrêt avant l'instruction Lzcnt précédée de !
Or sur les instructions ASM précédés de ! on ne peut avoir d'arrêt.
L'instruction asm lzcnt n'est pas reconnue par PB on ne peut donc pas avoir d'arrêt dessus et pour l'exécuter directement en ASM il faut !
J'ai oublié de la retirer pour la mesure des temps.

J'ai mesuré à nouveau sans le nop et les résultats sont identiques. je pense que nop ne prend aucun cycle machine.
@ Ollivier

Pourquoi un arrêt ? Mais tout simplement pour suivre pas à pas l’évolution du prg sous debug.
Or il est impossible de suivre l’évolution d’un prg asm avec l’option !.
Par contre avec enableasm sans ! on peut défiler pas à pas le prg ASM sous l'option compiler avec le Débogueur.

Reprenons le pb d’arrêt sur dec ebx.

En fait lorsque l’on désire déboguer un prg ASM il ne faut pas d’instruction avec ! devant

On retire toutes les instructions avec ! et on encadre la portion que l’on désire déboguer avec
EnableASM
....
....
Disableasm



Ensuite F9 sur l’instruction ASM ou l’on désire s’arrêter lancer l’exécution avec debug
et sur l’arrêt de l’instruction ASM dans l’option debogueur de IDE de PB
on peut voir les registres avec l’option desassembleur.
et ensuite F8 pour faire du pas à pas comme en PB.

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: Asm debugger *version finale

Message par celtic88 »

merci @PAPIPP


le code est destiné à les débutantes comme moi pour les aider à comprendre l asm.
.....i Love Pb :)
Répondre