Suche im RAM

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Beitragvon DaHarry » Samstag 3. April 2004, 11:55

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
DaHarry
Newbie
 
Beiträge: 6
Registriert: Samstag 3. April 2004, 11:47

Beitragvon Marwin » Samstag 3. April 2004, 13:23

Poste doch mal bitte den entsprechenden Code, welcher die Probleme bereitet. Im Prinzip brauchst du nur den Wert des Registers inkrementieren, mit welchem die auf die Speicherstellen zugreifst.

Grüße, Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon DaHarry » Samstag 3. April 2004, 17:04

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:

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



es wird alles ohne fehler übernommen, nur dass eben nicht die adresse sondern der inhalt von D0 um 2 hochgezählt wird. :(
DaHarry
Newbie
 
Beiträge: 6
Registriert: Samstag 3. April 2004, 11:47

Beitragvon Marwin » Samstag 3. April 2004, 19:25

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
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon DaHarry » Sonntag 4. April 2004, 11:57

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..
DaHarry
Newbie
 
Beiträge: 6
Registriert: Samstag 3. April 2004, 11:47

Beitragvon Marwin » Dienstag 6. April 2004, 20:45

Wenn ich das richtig verstehe, so sind BEGINA, ENDA und RESULT Konstanten, wobei dann aber eine Wertänderung nicht möglich sein sollte?

Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon DaHarry » Freitag 9. April 2004, 14:06

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:

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          


kannst du mir erklären, warum ich hier nicht die addresse, wo das word gefunden wurde, ausgebe?
DaHarry
Newbie
 
Beiträge: 6
Registriert: Samstag 3. April 2004, 11:47

Beitragvon Marwin » Samstag 10. April 2004, 11:31

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:
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  <===========
    
LOOP


Grüße, Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon DaHarry » Samstag 10. April 2004, 18:45

stimmt 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?

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          



DaHarry
Newbie
 
Beiträge: 6
Registriert: Samstag 3. April 2004, 11:47

Beitragvon Marwin » Samstag 10. April 2004, 18:54

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
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon DaHarry » Mittwoch 14. April 2004, 21:08

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.
DaHarry
Newbie
 
Beiträge: 6
Registriert: Samstag 3. April 2004, 11:47

Beitragvon Marwin » Donnerstag 15. April 2004, 11:47

Schau dir das einmal an, vielleicht bringt es dich etwas weiter:

Link

:) Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron