Seite 1 von 1

Register-und Flag-Anzeige in Titel-Leiste

Verfasst: 25.07.2007 12:57
von Helle
Kann nützlich bei der Fehlersuche sein:

Code: Alles auswählen

; Nachfolgendes Macro kann benutzt werden um sich die wichtigsten Register-Werte und Flag-
; Zustände in der Window-Titel-Leiste anzeigen zu lassen. 
; Einfach an der interssierenden Code-Stelle "asminfo" einfügen. Funktioniert nicht bei
; zugeschaltetem Debugger (dafür gibt es CALLDEBUGGER).
; Die angezeigten Register-Werte sind in Hex!
; "Helle" Klaus Helbing, 25.07.2007, PB v4.02

;-------- 
Macro asminfo
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_()
String$="EAX="+Hex(VarAX)+"  EBX="+Hex(VarBX)+"  ECX="+Hex(VarCX)+"  EDX="+Hex(VarDX)+"  EDI="+Hex(VarDI)+"  ESI="+Hex(VarSI)+"  EBP="+Hex(VarBP)+"  ESP="+Hex(VarSP)+"  C="+Str(FC)+"  P="+Str(FP)+"  A="+Str(FA)+"  Z="+Str(FZ)+"  S="+Str(FS)+"  D="+Str(FD)+"  O="+Str(FO)
pString=@String$
SetWindowText_(hWnd, pString)
!POPAD                  ;die gesicherten Register wieder zurück holen
!POPFD                  ;die gesicherten Flags wieder zurück holen
EndMacro  
;--------

; Test mit irgendeinem Code, muß nicht Assembler sein!
!MOV eax,$12345
!MOV ebx,$23456
!SUB eax,ebx
asminfo

End 
Gruß
Helle

Edit: Flags auch gesichert.