Hallo, wieder ein kleines Problem.
Wenn ich einen Assembler-Einschub mache (asm ... end;) dann werden die dort verwendeten Variablen nicht mehr im Watch-Fenster angezeigt. V.a. vermisse ich da die Möglichkeit, wie es noch bei TD (Turbo Debug), das zusammen mit TP (Turbo Pascal) ausgeliefert wurde, möglich war: den Speicherauszug eines bestimmten Registers anzusehen. Man konnte dann mit ^g einen bestimmten Wert oder auch ein bestimmtes Register eingeben, dessen Umgebung dann angezeigt wurde (Links die HexadezimalWerte, rechts die entsprechenden ASCII). Mit Cursor AUF/AB konnte man dann noch jeweils 16 Bytes vor- bzw zurückspringen. Das war sehr praktisch. Könnte man das nicht auch in Lazarus implementieren?
Wie es jetzt läuft, muß ich erst aus dem ASM-Block raus, dann kann ich auch im WatchFenster die (veränderten) Varablen anschauen (manchmal geschieht aber auch gar keine Veränderung oder die Register werden mit falschen Werten gefüllt).
Außerdem habe ich mich etwas gewundert, daß es da, trotz direkter Speicheradressierung (Win32) noch die Register es,cs,ds etc. gibt und diese auch bei den Operatoren CMPSB, SCASB etc. verwendet werden. Ich dachte, die gäbe es jetzt nicht mehr?
Herzlichen Dank.
Speicherdump von Assembler-Registern?
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Speicherdump von Assembler-Registern?
Ja, das kann man machen. Bist du man? Bisher hat das nur keiner gemacht.br_klaus hat geschrieben:Das war sehr praktisch. Könnte man das nicht auch in Lazarus implementieren?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 244
- Registriert: Do 21. Jan 2010, 22:33
- OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
- CPU-Target: 32Bit
- Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)
Re: Speicherdump von Assembler-Registern?
Dazu müsste ich wissen, wie die Variablen zB des CodeFensters gelesen und dann im Beobachtungsfenster (formatiert) ausgegeben werden. Werden die irgendwo zwischengespeichert?
Dann, wie und wo die Register gelesen werden, um sie dann auch ähnlich formatiert ausgeben zu können, zB
Byte Ptr [esi+4] --> Speicherdump als Bytes (oder einfach B [esi+4])
Dword Ptr [esi+4] --> Speicherdump als Dwords (D [esi+4])
evtl. auch mit Variablen [esi+x]
Was mich auch immer sehr wundert, ist, daß die Ausgabe so langsam, Zeile für Zeile, geschieht, dauert immer mehrere Sekunden (bei vielen zu beobachtenden Variablen). Wenn die in einer TstringList o.ä. gespeichert und bearbeitet würden, müsste die Ausgabe doch viel schneller möglich sein. Oder liege ich da falsch?
Dann, wie und wo die Register gelesen werden, um sie dann auch ähnlich formatiert ausgeben zu können, zB
Byte Ptr [esi+4] --> Speicherdump als Bytes (oder einfach B [esi+4])
Dword Ptr [esi+4] --> Speicherdump als Dwords (D [esi+4])
evtl. auch mit Variablen [esi+x]
Was mich auch immer sehr wundert, ist, daß die Ausgabe so langsam, Zeile für Zeile, geschieht, dauert immer mehrere Sekunden (bei vielen zu beobachtenden Variablen). Wenn die in einer TstringList o.ä. gespeichert und bearbeitet würden, müsste die Ausgabe doch viel schneller möglich sein. Oder liege ich da falsch?
Re: Speicherdump von Assembler-Registern?
Afaik werden die Daten über GDB bezogen, deshalb vllt. die Langsamkeit. Bin aber nicht 100% sicher.
-
- Beiträge: 588
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: Speicherdump von Assembler-Registern?
Etwa so?
Einfach eingeben (ggf als pointer deref) und in den watch properties "mem dump" waehlen.
Einfach eingeben (ggf als pointer deref) und in den watch properties "mem dump" waehlen.
-
- Beiträge: 244
- Registriert: Do 21. Jan 2010, 22:33
- OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
- CPU-Target: 32Bit
- Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)
Re: Speicherdump von Assembler-Registern?
Sieht gut aus. Praktischer wäre jeZeile 16 (4+4) Bytes und dann die entsprechenden ASCII_Codes, das wäre viel übersichtlicher und man könnte leichter gewünschte Bytes finden.martin_frb hat geschrieben:Etwa so?
Einfach eingeben (ggf als pointer deref) und in den watch properties "mem dump" waehlen.
Bewirkt denn die Angabe $+Register, daß das Register in der Watchlist ausgegeben wird?
Und was heißt "pointer deref"?
-
- Beiträge: 588
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: Speicherdump von Assembler-Registern?
16 byte rows mit ascii: Ja das fehlt. Weil es derzeit kein spezielles mem-dump window gibt.
$eax ist gdb spezifisch, und kann so in das watch window eingegeben werden. (fuer jeden register, siehe auch register window)
Register sind nur fuer den top stackframe zuverlaessig. (google gdb / gdb "versucht" den wert fuer andere Frames zu finden)
deref: $eax^ (siehe bild)
$eax ist gdb spezifisch, und kann so in das watch window eingegeben werden. (fuer jeden register, siehe auch register window)
Register sind nur fuer den top stackframe zuverlaessig. (google gdb / gdb "versucht" den wert fuer andere Frames zu finden)
deref: $eax^ (siehe bild)