Frage zur "DB" Funktion
-
Habe ein Assemblerprogramm hier gefunden
http://www.delphipraxis.net/topic36841.htmlWas ich dabei nicht verstehe ist die "24" in folgender Zeile:
db "hello world",24
Warum 24? hello world inklusive Leerzeichen wären 11 Zeichen. Wie kommt man da auf die 24? Oder hat das nichts mit der Größe des Strings zu tun?
-
Ja, hat nichts mit der Groesse oder Laenge des Strings zu tun.
Dabei erstmal zu "db" - dabei handelt es sich nicht um eine "Funktion", sondern um ein Schluesselwort, das dem Assembler anzeigt, dass ein Array von Bytes folgt. Das kann wie in C als String oder Zahlenfolge (getrennt durch Kommata) angegeben werden. Die 24 ist also einfach nur ein Byte mit dem Wert 24, das an's Ende des Strings angehaengt wird. Das waere das ASCII-Zeichen "$".
In DOS wird damit fuer eine der Ausgabefunktionen der String terminiert.
-
Danke, mein Programm funktioniert jetzt, nachdem ich an alle Strings 24 angehängt habe
Was mir allerdings noch fehlt, ist der Code für "neue Zeile".
Seltsamerweise muss ich vor jedem "db" erstmal ein "jmp" auf den Quellcode danach einfügen. Warum? Normalerweise wird doch ein Programm von oben nach unten abgearbeitet.
PS. Was bedeutet DB eigentlich ausgeschrieben? B wird wohl für Byte stehen?
-
xrt schrieb:
Danke, mein Programm funktioniert jetzt, nachdem ich an alle Strings 24 angehängt habe

Schoen. Wie gesagt macht das aber nur Sinn, wenn du besagte DOS-Funktion 09 zur Ausgabe des Strings benutzt (was bisher bei dir offenbar der Fall ist).
xrt schrieb:
Was mir allerdings noch fehlt, ist der Code für "neue Zeile".
Dezimal geschrieben ist das die 10. Und 13 bringt den Cursor an den Zeilenanfang zurueck - es bietet sich also an, die beiden immer direkt hintereinander zu setzen.
xrt schrieb:
Seltsamerweise muss ich vor jedem "db" erstmal ein "jmp" auf den Quellcode danach einfügen. Warum? Normalerweise wird doch ein Programm von oben nach unten abgearbeitet.
Richtig. Und zwar ohne Ruecksicht darauf, was dort steht.
So wie sich das anhoert, schreibst du deine Byte-Arrays einfach mitten in den restlichen Quellcode?
Dann musst du natuerlich mit einem Jump drueber wegspringen. Der Assembler packt alles genau so wie du es aufschreibst in der Reihenfolge in die ausfuehrbare Binaerdatei - egal ob Code oder Daten. Die CPU macht da auch keinen Unterschied, dh. wenn du nicht drueber wegspringst, wird halt dein String "ausgefuehrt". Was dabei passiert ist idR. wenig sinnvoll - kannst du dir ja mal mit einem Debugger anschauen.xrt schrieb:
PS. Was bedeutet DB eigentlich ausgeschrieben? B wird wohl für Byte stehen?
Ja, genau wie w->word, d->double word usw. Wofuer das d steht muesste ich aber raten.
-
Wenn ich
db "text",10,24eingebe, springt er leider nicht in eine neue Zeile, sondern gibt stattdessen ein weißes Dreieck aus, das nach rechts zeigt.
Ich hab schon auf der http://de.wikipedia.org/wiki/Codepage_850 nachgeschaut, aber Zeichen Nr. A sieht dort auch nicht wie ein weißes Dreieck aus?!
-
xrt schrieb:
Wenn ich
db "text",10,24eingebe, springt er leider nicht in eine neue Zeile, sondern gibt stattdessen ein weißes Dreieck aus, das nach rechts zeigt.
Ich hab schon auf der http://de.wikipedia.org/wiki/Codepage_850 nachgeschaut, aber Zeichen Nr. A sieht dort auch nicht wie ein weißes Dreieck aus?!Lesen kannst du aber schon?? Dann lies dir nochmals die Postings durch und schaue ob es evt. einen Zusatz zu dem Tipp mit 10 für neue Zeile gab...
-
Ja das hab ich alles gelesen.
Ich will aber keinen Carriage Return (13), sondern nur neue Zeile (10).
Die Ausgabe soll dann so aussehen:ein text
.............nächster Text(anstatt ... Leerzeichen, geht hier im Forum irgendwie nicht?)
-
Dann zeig halt mal deinen Code und erklaere wie du ihn erstellst und laufen laesst.
-
Nobuo T schrieb:
Wofuer das d steht muesste ich aber raten.
Das d steht für define. Also dann define byte, define word etc.

-
freaked schrieb:
Nobuo T schrieb:
Wofuer das d steht muesste ich aber raten.
Das d steht für define. Also dann define byte, define word etc.

Danke

Hier ein Screenshot von meinem Programm:
http://img-up.net/?up=debuggerDLxi5U.jpgHier im Forum kann man anscheinend keine Bilder einbinden?
-
Noe, normalerweise fuer Quellcode auch nicht noetig.

Offenbar zeigt debug alle Zahlen als hex an. dezimal 10 ist hexadezimal 0a und 13 ist 0d...
-
Mit "(0)a" macht er jetzt eine neue Zeile + automatisch Carriage Return... ich brauch die 13 (0d) also gar nicht mehr... rätselhaft...
-
Verwendet dein Assembler zufälligerweise standardmäßig das Hexadezimalsystem, wenn man bei den Zahlen kein speziellen Marker voran stellt?
Das würde erklären warum bei dir 10 ein "seltsames" Zeichen ist und du bei 0a dein Newline bekommst.Warum er einen Carriage Return durchführt kann ich dir allerdings nicht sagen.
-
Mein "Assembler" ist bis jetzt das Konsolenprogramm "debug" gewesen, dass bei DOS/Windows soviel ich weiß immer mitgeliefert ist. Es scheint hexadezimale Zahlen zu verwenden, besonders gut kenn ich "debug" allerdings nicht...
Ein komisches Phänomen ist dabei auch: normalerweise habe ich in der Eingabeaufforderung ein deutsches Tastaturlayout, sobald ich aber "debug" starte, schaltet es auf Englisch um
Das gilt komischerweise auch für manche Systemordner, manchmal wird mir "Programme" angezeigt, manchmal "Program Files"...