(ASM-LIB) CheckFunction (V1.02)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

(ASM-LIB) CheckFunction (V1.02)

Beitrag von Deeem2031 »

Und gleich noch eine :mrgreen:
Die LIB besteht aus 3 Befehlen (StartCheck(),StopCheck() und ProcessCheck())
Die Procs überprüfen ob die Register zwischen StartCheck() und StopCheck() verändert wurden, dürfte also nur für LIB-Progger oder leute die ASM-Code benutzen interessant sein.

Eigentlich wollte ich mit dieser Lib zuerst nur eine Procedure überprüfen indem ich deren pointer übergebe. (CheckFunction(@Proc(),arg1,arg2,...))
Da aber @Procedure() zwar vom Syntax her vom Compiler akzeptiert wird, aber nicht das macht was es soll (nämlich den pointer zurück geben) funktionierte die ganze Sache nicht. (Ist kein Bug, hab Fred schon gefragt ;) )
Also kam ich paar Minuten später auf die Idee es mit den 3 Procs zu machen (Eigentlich braucht man nur StartCheck() und StopCheck(), aber ProcessCheck() vereinfacht das auswerten)

Download: http://www.deeem2031.de/CheckFunction.zip

Procs:
StartCheck()
*Result = StopCheck()
Result = ProcessCheck(flags.l)

Beispiel:

Code: Alles auswählen

DisableDebugger

ResetCPURegister()
ResetCPUFlags()
StartCheck()
InitNetwork()
*Result.CheckResult = StopCheck()
If ProcessCheck(#CheckFunction_Important) = 0
  icon = 0 ; :)
Else
  icon = 16 ; :(
EndIf

output.s = "---Register---"+#CRLF$
output + "Esp: "+Str(*Result\Esp)+#CRLF$
output + "Eax: "+Str(*Result\Eax)+#CRLF$
output + "Ebx: "+Str(*Result\Ebx)+#CRLF$
output + "Ecx: "+Str(*Result\Ecx)+#CRLF$
output + "Edx: "+Str(*Result\Edx)+#CRLF$
output + "Esi: "+Str(*Result\Esi)+#CRLF$
output + "Edi: "+Str(*Result\Edi)+#CRLF$
output + "Ebp: "+Str(*Result\Ebp)+#CRLF$
output + #CRLF$
output + "---Flags---"+#CRLF$
output + "CF: "+Str(*Result\flags&#CheckFunction_Flag_CarryFlag)+#CRLF$
output + "PF: "+Str(*Result\flags&#CheckFunction_Flag_ParityFlag)+#CRLF$
output + "AF: "+Str(*Result\flags&#CheckFunction_Flag_AuxiliaryFlag)+#CRLF$
output + "ZF: "+Str(*Result\flags&#CheckFunction_Flag_ZeroFlag)+#CRLF$
output + "SF: "+Str(*Result\flags&#CheckFunction_Flag_SignFlag)+#CRLF$
output + "TF: "+Str(*Result\flags&#CheckFunction_Flag_Trapflag)+#CRLF$
output + "IF: "+Str(*Result\flags&#CheckFunction_Flag_InterruptFlag)+#CRLF$
output + "DF: "+Str(*Result\flags&#CheckFunction_Flag_DirectionFlag)+#CRLF$
output + "OF: "+Str(*Result\flags&#CheckFunction_Flag_OverflowFlag)+#CRLF$
output + "IOPL: "+Str(*Result\flags&#CheckFunction_Flag_IOPrivilegeLevel)+#CRLF$
output + "NT: "+Str(*Result\flags&#CheckFunction_Flag_NestedTaskFlag)+#CRLF$
output + "RF: "+Str(*Result\flags&#CheckFunction_Flag_ResumeFlag)+#CRLF$
output + "VM: "+Str(*Result\flags&#CheckFunction_Flag_VirtualModeFlag)+#CRLF$
  
MessageRequester("Change",output,icon)
Wenn von ProcessCheck() 0 zurückgegeben wird heißt es das keiner der angegebenen Register sich verändert hat, andernfalls ist es die Anzahl der Register die sich geändert haben.
Soll heißen wenn ProcessCheck() Null zurückgibt ist alles ok :)
Was man mit dem Rückgabewert von StopCheck() anfängt kann man dem Beispiel entnehmen. Die Werte sind die Differenzen zwischen Aufruf von StartCheck() und StopCheck(). Wobei Eax, Ecx und Edx sogut wie keine Rolle spielen.

Ansonsten ist nurnoch zu sagen das man StartCheck() und StopCheck() nicht als Parameter einer Procedure angeben darf, da die Werte dadurch verfälscht werden.
Zuletzt geändert von Deeem2031 am 30.04.2005 02:40, insgesamt 3-mal geändert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: (ASM-LIB) CheckFunction (V1.00)

Beitrag von Danilo »

Deeem2031 hat geschrieben:Da aber @Procedure() zwar vom Syntax her vom Compiler akzeptiert wird, aber nicht das macht was es soll (nämlich den pointer zurück geben) funktionierte die ganze Sache nicht. (Ist kein Bug, hab Fred schon gefragt ;) )
Was meinst Du denn damit?

Das funktioniert schon so wie es sollte - es gibt den Pointer
zu der Procedure zurück.
Wird zum Beispiel für Callbacks gebraucht, aber auch sowas
funktioniert:

Code: Alles auswählen

Procedure Beep(freq)
  Beep_(freq,50)
EndProcedure

For a = 0 To 3500 Step 100
  CallFunctionFast(@Beep(),a)
Next a
Also alles so wie es soll.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Eben nicht. Versuch das ganze doch mit einer Procedure aus einer UserLibrary, oder einfach nur @InitNetwork() oder so...
Da wirst du nie die Adresse der Procedure zurückbekommen, dein Beispiel funktioniert nur weil du die Procedure im PBCode drin stehen hast.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Deeem2031 hat geschrieben:Eben nicht. Versuch das ganze doch mit einer Procedure aus einer UserLibrary, oder einfach nur @InitNetwork() oder so...
Da wirst du nie die Adresse der Procedure zurückbekommen, dein Beispiel funktioniert nur weil du die Procedure im PBCode drin stehen hast.
Das ist schon klar. Du redest von 'Procedure', und darunter
verstehe ich eben lokale Prozeduren im PB-Source.
Zu dem Rest sagen ja die meisten 'Befehle' oder 'PB-Funktionen',
wodurch Dein Beitrag eben nicht eindeutig war und ich einfach
mal nachfragte... :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Mir ist vorhin aufgefallen, dass ich den Ebp-Register vergessen habe :roll:
Bei der Gelegenheit habe ich auch gleich ProcessCheck() etwas flexibler gemacht und der Procedure einen flags.l Parameter geschenkt.

Der Link ist der selbe wie vorher: http://www.deeem2031.de/CheckFunction

Den Rest dürfte das Beispiel erklären:

Code: Alles auswählen

Structure CheckResult
  Esp.l
  Eax.l
  Ebx.l
  Ecx.l
  Edx.l
  Esi.l
  Edi.l
  Ebp.l
EndStructure

Enumeration
  #CheckFunction_Esp = 1<<0
  #CheckFunction_Eax = 1<<1
  #CheckFunction_Ebx = 1<<2
  #CheckFunction_Ecx = 1<<3
  #CheckFunction_Edx = 1<<4
  #CheckFunction_Esi = 1<<5
  #CheckFunction_Edi = 1<<6
  #CheckFunction_Ebp = 1<<7
EndEnumeration

#CheckFunction_Important = #CheckFunction_Esp|#CheckFunction_Ebx|#CheckFunction_Esi|#CheckFunction_Edi|#CheckFunction_Ebp

StartCheck()
InitNetwork()
*Result.CheckResult = StopCheck()
If ProcessCheck(#CheckFunction_Important) = 0
  Debug ":)"
EndIf

MessageRequester("Change","Esp: "+Str(*Result\Esp)+#CRLF$+"Eax: "+Str(*Result\Eax)+#CRLF$+"Ebx: "+Str(*Result\Ebx)+#CRLF$+"Ecx: "+Str(*Result\Ecx)+#CRLF$+"Edx: "+Str(*Result\Edx)+#CRLF$+"Esi: "+Str(*Result\Esi)+#CRLF$+"Edi: "+Str(*Result\Edi)+#CRLF$+"Ebp: "+Str(*Result\Ebp))
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8835
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Diese Enumeration würde ich aber in eine RES-Datei machen.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Code: Alles auswählen

Enumeration
  #CheckFunction_Esp = 1<<0
  #CheckFunction_Eax = 1<<1
  #CheckFunction_Ebx = 1<<2
  #CheckFunction_Ecx = 1<<3
  #CheckFunction_Edx = 1<<4
  #CheckFunction_Esi = 1<<5
  #CheckFunction_Edi = 1<<6
  #CheckFunction_Ebp = 1<<7
EndEnumeration
Hat das einen Vorteil gegenüber

Code: Alles auswählen

  #CheckFunction_Esp = 1
  #CheckFunction_Eax = 2
  #CheckFunction_Ebx = 4
  #CheckFunction_Ecx = 8
  #CheckFunction_Edx = 16
  #CheckFunction_Esi = 32
  #CheckFunction_Edi = 64
  #CheckFunction_Ebp = 128
? Nur so eine Frage, ist aber wohl Geschmacksache, aber zumindest das Enumeration kannst du weglassen ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> ? Nur so eine Frage, ist aber wohl Geschmacksache, aber zumindest das Enumeration kannst du weglassen
Die Enumeration dient ja auch zusätzlich zur optischen Hervorhebung einer Konstantendeklaration. Finde ich also ganz gut. Das andere ist, wenn man keine Lust hat, alle Werte im Kopf zu verdoppeln Bild oder eine Geschmacksfrage
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

@freedimension:

Wie ts-soft schon sagte: Dem Compiler ist es egal, aber es ist übersichtlicher.

Version 1.02:

Neu:
-ResetCPUFlags() und ResetCPURegister()
-die CheckResult-Structure und die Flags sind nun in einer .res vereint

Und da es mit der Resident schon zwei Dateien sind und die ich sowieso als Archiv hochladen musste, hab ich auch gleich einen BeispielCode, eine Readme, den Resident-SourceCode, den Asm-SourceCode und die Library-desc Datei dazugepackt.

Neuer Link: http://www.deeem2031.de/CheckFunction.zip
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten