Suche im RAM
Moderatoren: crack, Krüsty, Marwin
hi @ll,
ich hab noch nicht arg viel mit assembler gemacht und hätt da ne für mich wichtige frage:
sie klingt bestimmt arg newbiehaft aber übers suchen konnte ich nichts finden..
wie stelle ich es an, einen string im hauptspeicher zu finden?
ich kann lediglich den inhalt einer addresse hochzählen möchte aber die adresse selbst inkrementieren, um zur nächsten addresse zu springen, damit ich dort comparen kann, ob der suchstring dort vorhanden ist..
BIG THX schon mal..
gr33tz,
DaHarry
ich hab noch nicht arg viel mit assembler gemacht und hätt da ne für mich wichtige frage:
sie klingt bestimmt arg newbiehaft aber übers suchen konnte ich nichts finden..
wie stelle ich es an, einen string im hauptspeicher zu finden?
ich kann lediglich den inhalt einer addresse hochzählen möchte aber die adresse selbst inkrementieren, um zur nächsten addresse zu springen, damit ich dort comparen kann, ob der suchstring dort vorhanden ist..
BIG THX schon mal..
gr33tz,
DaHarry
das problem ist, dass es um den 68k microprozessor mit seinen 8 Daten- (D0 - D7) und 8 Adressregister (A0 - A7) geht.
mit dem windows-assembler kann ich ja einfach INC [AX] machen.. ich kenn aber keine INC-funktion für den 68k -assembler.
der gesamte code sieht so aus:
es wird alles ohne fehler übernommen, nur dass eben nicht die adresse sondern der inhalt von D0 um 2 hochgezählt wird. 
mit dem windows-assembler kann ich ja einfach INC [AX] machen.. ich kenn aber keine INC-funktion für den 68k -assembler.
der gesamte code sieht so aus:
Code: Alles auswählen
org $400
* address-distance
BEGINA equ $10000 minimum=$10010
ENDA equ $10100 maximum=$3ffff
RESULT equ $1010
* program begins here
start
move.W #$1234,$10010 to find in memory
move.W #$1234,$10040
move.W #$1234,$10080
move.w BEGINA,D0 move current register to D0<---
move.w #$1234,D1
CMP D1,D0 compare D0 with Searchstring , (equ: CMPI.W SEARCH,BEGINA)
BEQ SAVER if D0 equals searchstring go to saving
ADD #2,BEGINA increment Searchaddress <---
bra start else jump to start
SAVER *move.w BEGINA,D3
*CMP D3,RESULT maximum counts?
*BEQ EXIT
move.w BEGINA,RESULT
ADD #2,BEGINA increment searchaddress
ADD #2,RESULT increment resultaddress
ADD #1,D2 increment counter
BRA start
EXIT
end start or stop #$2700
- Marwin
- Moderator
- Beiträge: 307
- Registriert: Donnerstag 8. Mai 2003, 21:19
- Wohnort: Seelow, Deutschland
- Kontaktdaten:
Hallo DaHarry,
in welcher Zeile erhöhst du denn das Register (bzw. eben nicht). Ich kenne mich mit den Prozessoren außerhalb der x86-Familie nicht aus
, aber vielleich erhöht sich der Wert in der Speicherzelle, weil du den Wert des Datenregisters erhöhen möchtest. Geht das auch mit dem Adressregister, vielleicht tritt der vermeintliche Fehler dort nicht auf?
Grüße, Marwin
in welcher Zeile erhöhst du denn das Register (bzw. eben nicht). Ich kenne mich mit den Prozessoren außerhalb der x86-Familie nicht aus
Grüße, Marwin
hi marwin,
ich hab beim hochzählen einen pfeil reineditiert. beim ersten pfeil wird die BEGINA incrementiert in das datenregister D0 kopiert.
beim zweiten pfeil incrementiere ich BEGINA um die zahl 2 (2, um ein register weiterzukommen, nicht 1, weil in ein register 2 worte hineinpassen)
BIG THX für deine hilfe..
ich hab beim hochzählen einen pfeil reineditiert. beim ersten pfeil wird die BEGINA incrementiert in das datenregister D0 kopiert.
beim zweiten pfeil incrementiere ich BEGINA um die zahl 2 (2, um ein register weiterzukommen, nicht 1, weil in ein register 2 worte hineinpassen)
BIG THX für deine hilfe..
ja, stimmt das ging so nicht. aber der eigentliche fehler war, daß vor der konstante die # gefehlt hat. damit war die konstante immer 0!
jetzt geht alles, bis auf die ausgabe der gefundenen register:
kannst du mir erklären, warum ich hier nicht die addresse, wo das word gefunden wurde, ausgebe?
jetzt geht alles, bis auf die ausgabe der gefundenen register:
Code: Alles auswählen
ORG $400
* address-distance
BEGINA EQU $10000 minimum=$10010
ENDA EQU $103ff maximum=$3ffff
RESULT EQU $1010
SEARCH EQU $1234
* program begins here
start
MOVE.W #SEARCH,$10010
MOVE.W #SEARCH,$10012
MOVE.W #SEARCH,$10014
MOVE.L #BEGINA,A0 BEGINA nach A0
MOVE.L #RESULT,A1 RESULT Speicheraddresse nach A1
BRA LOOP
LOOP
CMP.L #ENDA,A0 ENDA mit A0 maximum counts?
BGT EXIT branch grater than avoiding endless loop caused by odd ending-adress
MOVE.W (A0),D0 move current register to D0
MOVE.W #SEARCH,D1 SEARCH Searchstring nach D1
CMP D1,D0 compare D0 with Searchstring , (equ: CMPI.W SEARCH,BEGINA)
BEQ SAVER if D0 equals searchstring go to saving
ADD #2,A0 increment Searchaddress
BRA LOOP else jump to LOOP
SAVER
MOVE.L A0,(A1) move Searchaddress to Results-addr
ADD #4,A1 increment resultaddr
ADD #2,A0 increment searchaddress
ADD #1,D2 increment counter
BRA LOOP
AUSG CMP #RESULT,A1
BEQ EXIT
lea (A1),A0
TRAP #15
DC.W 7
SUB #4,A1
BRA AUSG
EXIT stop #$2700
END start
- Marwin
- Moderator
- Beiträge: 307
- Registriert: Donnerstag 8. Mai 2003, 21:19
- Wohnort: Seelow, Deutschland
- Kontaktdaten:
Hallo DaHarry,
das Problem liegt darin, dass du nirgednswo zum Label AUSG verzweigst, sondern immer nur zu LOOP, SAVER und EXIT.
Ich bin weiterhin der Meinung, dass die Verzweigung zu LOOP hier nicht nötig ist:
Grüße, Marwin
das Problem liegt darin, dass du nirgednswo zum Label AUSG verzweigst, sondern immer nur zu LOOP, SAVER und EXIT.
Ich bin weiterhin der Meinung, dass die Verzweigung zu LOOP hier nicht nötig ist:
Code: Alles auswählen
start
MOVE.W #SEARCH,$10010
MOVE.W #SEARCH,$10012
MOVE.W #SEARCH,$10014
MOVE.L #BEGINA,A0 BEGINA nach A0
MOVE.L #RESULT,A1 RESULT Speicheraddresse nach A1
BRA LOOP <===========
LOOPstimmt marwin, hast recht
habs jetzt geändert, der sprung zu loop war wirklich überflüssig, danke
das problem ist aber immer noch das gleiche (bin gleich zu exit gesprungen, weil ausg ned ging, sorry)
aber wieso gibt der einfach nix aus, wenn ausg abgearbeitet wird?
habs jetzt geändert, der sprung zu loop war wirklich überflüssig, danke
das problem ist aber immer noch das gleiche (bin gleich zu exit gesprungen, weil ausg ned ging, sorry)
aber wieso gibt der einfach nix aus, wenn ausg abgearbeitet wird?
Code: Alles auswählen
ORG $400
* address-distance
BEGINA EQU $10000 minimum=$10010
ENDA EQU $103ff maximum=$3ffff
RESULT EQU $1010
SEARCH EQU $1234
* program begins here
start
MOVE.W #SEARCH,$10010
MOVE.W #SEARCH,$10012
MOVE.W #SEARCH,$10014
MOVE.L #BEGINA,A0 BEGINA nach A0
MOVE.L #RESULT,A1 RESULT Speicheraddresse nach A1
LOOP
CMP.L #ENDA,A0 ENDA mit A0 maximum counts?
BGT AUSG *!EXIT**branch grater than avoiding endless loop caused by odd ending-adress
MOVE.W (A0),D0 move current register to D0
MOVE.W #SEARCH,D1 SEARCH Searchstring nach D1
CMP D1,D0 compare D0 with Searchstring , (equ: CMPI.W SEARCH,BEGINA)
BEQ SAVER if D0 equals searchstring go to saving
ADD #2,A0 increment Searchaddress
BRA LOOP else jump to LOOP
SAVER
MOVE.L A0,(A1) move Searchaddress to Results-addr
ADD #4,A1 increment resultaddr
ADD #2,A0 increment searchaddress
ADD #1,D2 increment counter
BRA LOOP
AUSG
CMP #RESULT,A1
BEQ EXIT
lea (A1),A0
TRAP #15
DC.W 7
SUB #4,A1
BRA AUSG
EXIT
stop #$2700
END start
- Marwin
- Moderator
- Beiträge: 307
- Registriert: Donnerstag 8. Mai 2003, 21:19
- Wohnort: Seelow, Deutschland
- Kontaktdaten:
Kannst du mir schreiben, wozu die Befehle DC.W und TRAP sind?
Zur Ausgabe müsstest du doch zum Beispiel Daten in den Videopuffer/Videospeicher (wenn es sowas bei der eingesetzten Hardware gibt) schreiben bzw. etwas ähnliches. Wenn DC.W oder TRAP nicht dafür zuständig ist, dann kann keine Änderung der Anzeige erwirkt werden. Wie schon gesagt, mit dem 68k kenne ich mich nicht aus.
Was dient denn überhaupt als Ausgabegerät?
Marwin
Zur Ausgabe müsstest du doch zum Beispiel Daten in den Videopuffer/Videospeicher (wenn es sowas bei der eingesetzten Hardware gibt) schreiben bzw. etwas ähnliches. Wenn DC.W oder TRAP nicht dafür zuständig ist, dann kann keine Änderung der Anzeige erwirkt werden. Wie schon gesagt, mit dem 68k kenne ich mich nicht aus.
Was dient denn überhaupt als Ausgabegerät?
Marwin
hm also ich hab das für den ide68k geproggt. das ist ein simulator, der unter windoze läuft.
dort hab ich das dc.w und das trap aus einem funktionierendem beispiel verwendet. ich hoffte eigentlich hier mehr über die beiden befehle erfahren zu können. ich weiss nämlich auch nicht genau was die machen.. dann such ich mal intensiver.. trotzdem danke.
dort hab ich das dc.w und das trap aus einem funktionierendem beispiel verwendet. ich hoffte eigentlich hier mehr über die beiden befehle erfahren zu können. ich weiss nämlich auch nicht genau was die machen.. dann such ich mal intensiver.. trotzdem danke.