Register-und Flag-Anzeige in Titel-Leiste
Verfasst: 25.07.2007 12:57
Kann nützlich bei der Fehlersuche sein:
Gruß
Helle
Edit: Flags auch gesichert.
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
Helle
Edit: Flags auch gesichert.