Forum: PC-Programmierung Allgemeine Assemblerfragen


von Christoph P. (matrix01)


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

von Karl H. (kbuchegg)


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.

von Dennis S. (eltio)


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

von Robert L. (lrlr)


Lesenswert?

>Ich beherrsche ... und Assembler.

NATÜRLICH ;-)

von Stefan Noack (Gast)


Lesenswert?

Hier ist ein Listing von dem ROM. Da ist bestimmt eine Funktion drin, 
die man einfach verwenden kann:

http://www.wearmouth.demon.co.uk/zx81.htm

von Christoph P. (matrix01)


Lesenswert?

Hi,
lustig aber ich bin auf der Seite des Deutschen ZX-Teams angemeldet.
Ich kann etwas auf dem Z80 Assembler programmieren.
Gruß

von Tobi (Gast)


Lesenswert?

> Ich kann etwas auf dem Z80 Assembler programmieren.

Sehr schön, dann zeig doch mal was du bist jetzt gemacht hast und dann 
kann man dir auch weiter helfen.

Gruss,
Tobi

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Christoph P. schrieb:
> Ich beherrsche ... und Assembler.

> Ich wollte fragen, wie ich in Assembler einen eingegebenen String in
> einzelne Teile zerlegen und dann verarbeiten kann?


Diese Aussagen beissen sich. Entweder kann man mit Strings umgehen, oder 
man kann kein Assembler. Was ist denn nun der Fall?

von Karl H. (kbuchegg)


Lesenswert?

> und ich programmiere auf dem ZX81

Da hast du dir ausgerechnet einen Computer ausgesucht, der das wohl 
ausgefuchsteste, cleverste und trickreichste I/O System im EPROM mit 
hat, das ich je gesehen habe.

Mit ASCII gewinnst du da allerdings keinen Blumentopf :-)

von Christoph P. (matrix01)


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ß

von Karl H. (kbuchegg)


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?

von amateur (Gast)


Lesenswert?

>ld b,20 ; HEX für 30

Bist Du sicher, dass Du da nicht ein bisschen abgerundet hast?

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Jeder Programmierer, der Strings in Assembler verarbeiten will, muss 
Zahlendarstellungen und ASCII-Tabellen kennen.

von Christoph P. (matrix01)


Lesenswert?

Ups falsche Zahl: 30 ist HEX 1E mein Fehler. Ich habe nicht umgerechnet, 
sondern den Zeichensatz übernommen

von Christoph P. (matrix01)


Lesenswert?

Für den ZX81 weiß ich nur, dass der das in einer $-Variable abspeichert.
Aber wie genau das dann von statten geht, das weiß ich nicht.
Gruß

von Karl H. (kbuchegg)


Lesenswert?

Christoph P. schrieb:
> Für den ZX81 weiß ich nur, dass der das in einer $-Variable abspeichert.
> Aber wie genau das dann von statten geht, das weiß ich nicht.

Siehst du.
Und an dieser Stelle beginnt dann das Studium des im EPROM liegenden 
Beriebssystems.

von Karl H. (kbuchegg)


Lesenswert?

Kan asta schrieb:
> Jeder Programmierer, der Strings in Assembler verarbeiten will, muss
> Zahlendarstellungen und ASCII-Tabellen kennen.

Damit kommst du beim ZX81 nicht weit. Da ist alles (ok, also jetzt nicht 
die Zahlendarstellung) ganz anders. ASCII ist für einen ZX81 ein Wort 
mit 5 Buchstaben, mehr aber auch nicht.

von Christoph P. (matrix01)


Lesenswert?

Da hat er Recht. Der ZX81 kannte noch nicht ASCII, ich glaub das kam 
erst mit Microsoft

von amateur (Gast)


Lesenswert?

ASCII war schon alt bevor Billy Boy erschien.

Schon die alten, mechanischen Fernschreiber nutzten 7-ASCII.

von Christoph P. (matrix01)


Lesenswert?

Mit was soll ich denn anfangen, um zu wissen wie man einen String 
unterteilt.

von Mox (Gast)


Lesenswert?

amateur schrieb:
> ASCII war schon alt bevor Billy Boy erschien.

http://www.billy-boy.com/de/produkte/billy-boy-fun/kondome.html
Du meinst die hier? Was hat das damit zu tun?

SCNR

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Christoph P. (matrix01)


Lesenswert?

Ich benutze ja die 16Kb RAM Erweiterung

von Karl H. (kbuchegg)


Lesenswert?

Christoph P. schrieb:
> Ich benutze ja die 16Kb RAM Erweiterung

Das mag schon sein. Spielt aber keine Rolle, wie das Grundprinzip des 
ZX81 funktioniert.

von spontan (Gast)


Lesenswert?

Kann es sein, daß Du nix verstanden hast? Über die komplizierte 
Hardware/Software des ZX?
Was helfen 16kByte Ram, wenn Du nicht weißt wie Du was wo ablegen 
kannst?

Grundlagen lernen.

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.