ASM-Funktion debuggen (Win/x64)
-
Hallo,
ich habe eine sehr rechenintensive Funktion meines Programms in Assembler mit SSE2 neu geschrieben. Wie sollte es auch anders sein, das Ergebnis der Funktion entspricht nicht dem was ich erwarte. Während ich Abstürze relativ einfach durch auskommentieren finden und dann beheben konnte, habe ich große Schwierigkeiten den (oder die) Rechenfehler zu finden.
Ich benutze MS Visual C++ 2010 Pro. Als Assembler benutze ich YASM (Programm soll später auch auf *nix laufen). Im C Code kann ich Haltepunkte setzen, die Variablen überwachen etc., bei ASM bekomme ich das nicht richtig hin. Wie kann ich Assembler-Code Schritt für Schritt ausführen und dabei alle Register (rax bis r15 und xmm0 bis xmm15) überwachen? Wenn es nicht direkt im Programm geht, mir würde auch ein Simulator helfen, in den ich den Code reinkopiere und der den dann interpretiert mit meinen Startparametern.
Vielen Dank
Stefan
-
Du kannst eine breakpoint (= INT 3) auch manuell in den ASM Code einfügen. Die angezeigten Register kann man mit dem Kontextmenü im Reiter "Register" einstellen.
-
Habe INT 3 ausprobiert: Programm stürzt ab. Im Disassebly wird auch noch anderer Code angezeigt:
000000013FAD14F4 pmovmskb eax,xmm4 000000013FAD14F8 int 3 000000013FAD14FA db 0fh 000000013FAD14FB test dword ptr [rcx],ebp 000000013FAD14FD add al,0 000000013FAD14FF add byte ptr [rcx-7Dh],cl 000000013FAD1502 db eah 000000013FAD1503 or byte ptr [rbp-3Bh],bh
Alles was nach int 3 kommt habe ich nicht geschrieben, bei "test" stürzt er ab (Zugriffsverletzung). Der Code scheint auch nicht eingefügt zu sein, sondern hat den Code der dort vorher stand überschrieben. An den anderen Stellen mit "int 3" ist das nicht, schreibt int 3 den Code um wenn es aufgerufen wird?
Wo ist das Kontextmenü "Register"? Ich kann bei "Überwachen" zwar die normalen Register überwachen, aber nicht die xmm ("xmm0 CXX0068: Fehler: Der Typ wird nicht unterstützt")
Vielen Dank
Stefan