andere möglichkeit als ein schieberegister??

gorden

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,

hab ne frage :)

ich hab ein datenbaustein (db 10) im dem sind 10 datenwörter beschreiben und wie kan ich es machen, das wenn im datenwort 1 eine 0 steht das programm aus dem datenwort 2 den wert ins datenwort 1 schreibt und das immer weiter solange bis das programm am ende den wert aus dem datenwort 10 ins datenwort 1 schreibt und da ganze ohne ein schieberegister...
schieberister in dem sinn:
[ code ]
l dw 2
t dw 1
l dw 3
t dw 2
usw.

das alles in s5-100u cpu 103
 
Irgendwas hast du durcheinander: soll nun der Wert von DW2 nach DW1 oder der von DW10?

LOOP:
L KF10
T MW 200 // Schmiermerker, zählt Quelladressen
L KF9
T MW 202 // Schmiermerker, zählt Zieladressen


B MW 200 // mach die nächste Operation mit der Adresse aus MW200
L DW0 // nein, lädt NICHT DW0 sondern DW10, wenn MW200 10 enthält.
B MW 202 // mach die nächste Operation mit der Adresse aus MW202
T DW0 // nein, speichert NICHT nach DW0 sondern nach DW9, wenn MW202 9 enthält.

jetzt kannst du beide Adressen um eins runterzählen und zum Anfang springen, wenn MW200 >0 ist.

Das ist zwar weiger Code, aber deine CPU führt mehr Anweisungen aus. Zykluszeit beachten!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
thx für die antwort als erstes mal so ählich mein ich es, ich erklärs mal mit 3 datenwörter...

also in dw1 dw2 dw 3 stehen beliebige werte drin, jetzt transferiere ich ins dw1 eine 0 und sobald im dw 1 eine 0 steht soll das programm den wert aus dem dw 2 ins dw 1 schreiben. dann transferiere ich wieder eine 0 ins dw 1 und nun soll der wert aus dem dw 3 ins dw 1 geschrieben werden.

das kan man durch ein schieberegister machen, das halt dann den wert immer weiter schiebt:
L DW 2
T DW 1
L DW 3
T DW 2

und diese will ich ohne so ein schieberegister machen.
da der DB bis dw 245 beschrieben ist, und dann ist mir diese möglichkeit zu groß.
 
MW 200 habe den Anfangswert 2
Immer wenn 0 im DW1 steht zählst du MW 200 hoch und machst damit:

B MW200
L DW 0
T DW 1


Also:

LDW1
LKF0
<>F
BEB // nix tun wenn keine 0
L MW200
add kf 1
T MW200
B MW200
L DW 0
T DW 1


Jetzt fehlt nur noch, daß du MW200 irgendwo initialisierst und irgendwas wirst du tun wollen, wenn MW200>245 ist, sonst geht dir die CPU in STOP wergen Zugriff auf nicht existierendes Datenwort.
 
ein schieberegister ist etwas anderes als das was du beschreibst.

du meinst ein fifo bei dem die daten direkt geschoben werden...


bei so vielen datenwörtern würde ich eben ein schieberegister verwenden!
du schiebst nicht alle daten durch den speicher, sondern du änderst nur die stelle an der du aus dem register (db) liest oder an der du schreibst.

indirekte adressierung
 
ich hätte da noch mal ne frage zu deinem Problem
soll jetzt wenn ins dw1 eine null geschrieben wird folgendes passieren
dw1 = dw2
dw2 = dw3
dw3 = dw4
.
.
.

oder soll nur bei einem erneuten schreiben einer null ins dw 1 geschrieben wird
dw1 = 0?
dw1 = dw2
dw1 = 0?
dw1 = dw3

weil im ersten post würde ich die erste möglichkeit rauslesen und im zweiten von dir dann die zweite möglichkeit
 
hallo,

ich meinte

dw2 = dw1
dw3 = dw2
dw4 = dw3
.
.
.

und mit der 0 meinte ich, das dieser vorgang gestartet wird, wenn eine 0 im dw1 steht...

mfg
 
gibt es eine möglichkeit, z.b. ein befehl oder so, der die werte in allen dws in einem db um 1 dw nach oben schiebt?

z.b.

dw 1 = 3
dw 2 = 7
dw 3 = 4

und nach der operation...

dw 1 = 7
dw 2 = 4
 
Nein.
Gab es nicht einen Blockverschiebebefehl?. Dieser konnte aber nicht mit überschneidendem Quell- und Zielbereich arbeiten? Dann geht es so:
Alles in einen gleichgroßen Puffer kopieren, entweder im anderen DB (ging das?) oder im selben DB hinter den Daten. Dann alles zurückkopieren, aber eine Adresse weiter.
 
Zurück
Oben