Bug in DEBUG

Beim Testen von »Tips und Tricks« sind wir auf einen Fehler im DOS-Debugger gestoßen, der nach unseren Kenntnissen bei Microsofts symbolischem Debugger »SYMDEB« ab Version 4.0 behoben ist.

Dieser Bug kann beim Übersetzen von Maschinenprogrammen mit SYMDEB, die für DEBUG geschrieben sind, und umgekehrt, katastrophale Auswirkungen haben, die sehr wahrscheinlich zum PC-Absturz beim Übersetzen einer Routine führen. Es handelt sich dabei um den Maschinenbefehl »XCHG«, der zwei Register oder ein Register mit dem Inhalt einer Speicherzelle vertauscht. DEBUG vertauscht sowohl beim Assemblieren als auch beim Disassemblieren die beiden Operanden. Was auf den ersten Blick keine Auswirkungen hat, da der Befehl seinerseits ja genauso die Operanden vertauscht, zeigt seine unerwünschten Folgen erst bei einer genaueren Betrachtung der Befehlsgruppe »XCHG AX,r16«. »r16« steht für ein beliebiges 16-Bit-Register. Im INTEL-Befehlssatz für die Prozessoren 80×86/8088 ist nämlich eine spezielle Kurz-Übersetzung dieser Mnemonics vorgesehen. So sollten diese Befehle nur ein Byte belegen, weshalb sparsame Programmierer sie bevorzugt einsetzen. Indem DEBUG nun die Operanden vertauscht, liefert der Befehl »XCHG AX,BX« beispielsweise statt »93H« die längere Standard-Übersetzung »87H D8H«. Die katastrophalen Folgen sind nun offensichtlich: Durch die andere Befehlslänge verschiebt sich die Adresslage des folgenden Programmteils und alle absolut angesprochenen Adressen müßten neu angepaßt werden. Um also die Kompatibilität von Debug-Listings zwischen DEBUG und SYMDEB zu gewährleisten, sollten Sie diese »Mnemonics« besser »von Hand« übersetzen. Der erwähnte Befehl wäre dann als »DB 93« zu schreiben, was bei beiden Debuggern das selbe Ergebnis liefert. Selbstverständlich haben wir das im Ihnen vorliegenden Buch bereits berücksichtigt.

Quelle: 200 Utilities für PC-/MS-DOS von Gerhard Schild und Thomas Jannot