Allgemeine Assemblerfragen

OP #3188417
Lesenswert?
• ▲
▼
Hallo,
ich bin neu hier und will mich mal kurz vorstellen.
Meine Name ist Christoph und ich programmiere auf dem ZX81 einem 
Computer von 1981. Ich beherrsche BASIC und SmallBASIC, sowie AmigaBASIC 
und Assembler. C++ und Forth. Ich glaube auch noch etwas C.
Ich wollte fragen, wie ich in Assembler einen eingegebenen String in 
einzelne Teile zerlegen und dann verarbeiten kann?
Also: Eingabe: Hallo Welt
Ausgabe:
Hallo
Welt
// mache was mit Hallo
// mache was mit Welt
Wenn es möglich wäre, bitte in Z80-Assembler. Es geht auch FASM.
Gruß,
  Christoph
#3188459
Lesenswert?
• ▲
▼
Du musst dir erst mal überlegen, wie und wo du deinen String speichern 
möchtest.
Die einzelnen Zeichen nacheinander abzulegen, sollte klar sein. Dran 
führt sowieso kein Weg vorbei. Die Frage lautet: woher weißt du, wie 
lang denn dieser String ist? Und da gibt es im Grunde 2 generelle 
Möglichkeiten. Entweder du merkst dir irgendwo die Länge explizit oder 
du vereinbarst ein spezielles Zeichen, welches dir anzeigt: hier ist der 
String zu Ende.

Zur Zerlegung.
Na, woran erkennst du denn die einzelnen Wörter eines Strings? Offenbar 
daran, dass ein Leerzeichen (Space) kommt. Das Leerzeichen trennt die 
Wörter. D.h. du gehts den Ursprungssstring Zeichen für Zeichen durch und 
bei einem Leerzeichen weißt du, dass hier ein Wort zu Ende ist. Mit den 
Zeichen bis zum Leerzeichen musst du etwas machen. Das kann jetzt sein, 
dass du sie auf eine 2.te Speicherfläche umkopierst. Das kann sein, dass 
du dir im Ursprungsstring die Positionen merkst, wo ein Wort beginnt und 
wo es endet. Das kann aber auch sein, dass du die einzelnen Zeichen 
jeweils sofort ausgibst.
#3188623
Lesenswert?
• ▲
▼
Christoph P. schrieb:
> Meine Name ist Christoph und ich programmiere auf dem ZX81 einem
> Computer von 1981. Ich beherrsche BASIC und SmallBASIC, sowie AmigaBASIC
> und Assembler. C++ und Forth. Ich glaube auch noch etwas C.
Soso... Du beherrscht Assembler und "glaubst" C! :-D

Ich habe gerade per Zufall dieses Forum entdeckt: 
http://www.sinclairzxworld.com

Vielleicht helfen die bei sehr speziellen Fragen noch weiter.

Gruß Dennis
OP #3189316
Lesenswert?
• ▲
▼
Also ich habe auf dem ZX81 in Assembler ein Programm geschrieben, was 31 
H's ausgeben kann.
1
ld hl,(400C)
2
ld b,20 ; HEX für 30
3
.loop:
4
  inc hl
5
  dec b
6
  ld (hl),2D ; () bedeutet die Speicheradresse beschreiben
7
  jp nz,.loop  ; Heißt soviel wie solange B nicht 0 dann gehe zu loop
8
RET ; Zurück zum BASIC
Als letztes noch 20 RAND USR 16514
Gruß
#3189337
Lesenswert?
• ▲
▼
Christoph P. schrieb:
> Also ich habe auf dem ZX81 in Assembler ein Programm geschrieben, was 31
> H's ausgeben kann.

Sehr schön.
Damit bist du allerdings von deinem ursprünglichen Ziel noch meilenweit 
entfernt. Ungefähr so weit, wie ein Taferlklassler, der gerade mal 
unfallfrei im Zahlenraum bis 100 rechnen kann vom Lösen von Textaufgaben 
die auf quadratischen Gleichungen führen entfernt ist.

Sieh erst mal zu, wie du auf diesen System Speicher für dich zur 
alleinigen Benutzung reservieren kannst um dir da drinnen erst mal eine 
für dich passende Definition von "String" aufzubauen. Ich würde mich 
daran orientieren, wie es das ZX81-System selber macht. Das muss ja auch 
irgendwie Strings abspeichern. Ein abschliessendes 0-Zeichen kann es 
nicht sein, denn das ist im ZX81-Zeichensatz als Leerezeichen definiert. 
Also: wie macht es der ZX81 selber, um Strings abzuspeichern und 
auszugeben?
#3189519
Lesenswert?
• ▲
▼
Christoph P. schrieb:
> Mit was soll ich denn anfangen, um zu wissen wie man einen String
> unterteilt.

Damit, dass du erst mal einen String im Speicher halten und ausgeben 
kannst.

Und erst DANN kannst du dir Gedanken darüber machen, wie du ihn in 2 
Teile unterteilst!


Aber erst mal musst du den String im Speicher haben! 20 zeichen 'G' 
ausgeben zählt noch lange nicht als String.
#3189526
Lesenswert?
• ▲
▼
Christoph P. schrieb:
> Da hat er Recht. Der ZX81 kannte noch nicht ASCII, ich glaub das kam
> erst mit Microsoft

Kleinstweich hat damit nicht das geringste zu tun.
Der ZX81 musste tief in die Trickkiste greifen um mit 1k-RAM überhaupt 
benutzbar zu werden.
Dazu gehört auch ein Zeichensatz, der gleichzeitig Ausgabezeichen als 
auch Basic-Tokens beinhaltet, so dass der Interpreter mit dem 
'Zeichensatz' sowohl Text als auch ganze Programme beschreiben kann und 
bei dem das Videoram neben dem eigentlichen Programm auch noch in diesem 
1k RAM untergebracht wird.

Ich sagte doch: Du hast dir eine denkbar trickreiche Umgebung zum Lernen 
von Z80-Assembler ausgesucht. Da muss man schon ziemlich gut in 
Assembler sein, um damit zurecht zu kommen.
#3189607
Lesenswert?
• ▲
▼
Dachte ichs mir doch, dass das noch irgendwer online hat

http://www.users.waitrose.com/~thunor/mmcoyzx81/index.html


Im Speziellen
http://www.users.waitrose.com/~thunor/mmcoyzx81/chapter07.html

Wobei: mit der Stringrepräsentierung direkt im Code kannst du in deiner 
Aufgabe nicht viel anfangen. Da musst du dir etwas anderes überlegen. 
Zb. einen Speicher, dessen Adresse du dir ins Register HL lädst und dann 
eine Funktion aufrufst, die die Zeichen beginnend ab dieser Adresse in 
HL ausgibt, bis es auf ein FF stösst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren