N
counter schrieb:
Als ich das mit
add byte ptr
und so gemacht habe wie aus deinem beispielt hat der PC nur gepiept und komsiche Zeichen ausgegeben.
Kann ich nicht nachvollziehen. In dem Code war zwar ein Fehler: Das Label fuer den String war falsch benannt und das Board hat seit Ewigkeiten die Macke, bei Strings abschliessende " in ' zu verwandeln, aber sonst funktionierte der Code bei mir mit einfachem C&P fehlerfrei.
counter schrieb:
Aber die Variable wert db "$" ist doch so richtig Null Terminiert oder ?
Mach dir mal klar, was "Null Terminiert" ueberhaupt bedeutet: Etwas (ein String) wird mit (dem Wert / der Zahl) Null terminiert, also abgeschlossen.
Das ist ganz offensichtlich in deinen Codes nirgendwo der Fall: Hier sind die Strings immer mit dem Zeichen ""abgeschlossen,dh.alsoquasi"" abgeschlossen, dh. also quasi ""abgeschlossen,dh.alsoquasi""-terminiert.
Dazu sollte man vielleicht noch etwas weiter ausholen:
Ein String ist allgemein eine beliebig lange Aneinanderreihung von einzelnen Zeichen, bzw. chars (hier ASCII-Codiert und jeweils 1 Byte breit).
Um mit Strings sinnvoll arbeiten zu koennen, musst du irgendwie bestimmen koennen, wie lang ein String eigentlich ist, bzw. wo er aufhoert.
Dazu gibt es im Prinzip 2 naheliegende Ansaetze:
1. Du speicherst die Laenge des Strings in einer Variable. In Pascal wurde das zB. so gemacht, dass direkt vor das erste eigentliche Zeichen eines Strings praktisch an die "0. Stelle" ein Byte gesetzt wurde, das die Laenge enthaelt.
2. Du legst einen bestimmten Code, praktisch also ein bestimmtes Zeichen, fest, welches das Ende des Strings markiert. In C und auch sonst nimmt man dazu praktischerweise das Zeichen mit dem Binaerwert 0 (dem ist auch kein lesbares Zeichen, bzw. einfach ein space zugeordnet). In deinem Code hier nimmst du stattdessen das Zeichen "$", um das Ende des Strings zu kennzeichnen - einfach, weil die DOS-Funktion 09h, die du zum Ausgeben des Strings auf dem Bildschirm benutzt das so erwartet.
counter schrieb:
1. Wie kann man 3 stellige Zahlen ausgeben lassen ?
Was ist dir denn daran nicht klar?
Das Prinzip ist exakt das Gleiche wie fuer 2stellige Zahlen.
Falls du das Prinzip hinter der Sache nicht verstanden hast, bzw. dir noch nicht klar ist, warum du diese Division durch 10 ueberhaupt machen musst, kann ich dir nur empfehlen, die verlinkten Threads noch einmal aufmerksam durchzulesen.
Warum, wie und weshalb und selbst ein kompletter Beispielcode fuer "beliebig-stellige" Zahlen in C sind dort zu finden.
counter schrieb:
var db 73 , "$"
;.....
mov ax,var ; Fehler: operand type do not match
; wie kann ich z.b. einen wert aus einer variable in ax reinschreiben ?
Klar: Deine Variable ist vom Typ Byte und du versuchst einfach so ein word daraus zu lesen.
Im Grunde hast du jetzt 3 Moeglichkeiten, dieses Problem zu beseitigen:
1. du passt den Typ der Variable an: Mach ein word draus (dw)
2. du liest in ein passendes, 1 Byte breites Register (zB. al).
3. du sagst TASM explizit, dass du nicht mit einer Variablen arbeiten willst, sondern einen 1 word breiten Speicherzugriff beim Label "var" machen willst (zB. mov ax, word ptr [var])
Mal davon ab: Das "$" hinter der 1 byte breiten Integer-Zahl 73 ist dort ziemlich deplatziert. Das brauchtest du bisher allein zum Abschliessen von Strings. Die 73 dort ist aber kein String, muss also auch nicht terminiert werden.
Was du da sonst gebastelt haettest, ist praktisch im Speicher byteweise betrachtet die Zahlen
73, 36
oder wortweise betrachtet die Zahl
9300
counter schrieb:
; das ist ja sowie bei mov ax,@data mov ds,ax da kann ich
; ja auch nicht einfach schreiben: mov as,@data das umgehe ich ja mit dem ds
Das ergibt leider, zumindest fuer mich, ueberhaupt keinen Sinn.