2016-03-21 6 views
1

Ich benutze Easy68k, um ein Assembly-Programm zu schreiben, wo ich ein Skript zum Suchen einer Zahl in einer Datei mit Zahlen schreiben muss.68K Assembly: Suche Nummer in Zahlen Datei

Datei numbers4.txt:

1 
2 
3 
4 
5 
6 
7 
9 
11 
12 
13 
14 

Mein Code:

ORG $1000 

START:     ; first instruction of program 

*------------File Handling ------------* 

     lea   filename, a1 
     move  #51, d0 
     trap  #15 

     move.l  #filesize, d2 
     lea   buffer, a1 
     move  #53, d0 
     trap  #15 

*------------Save Address in A1------------* 

     movea.l  a1, a3  ; pointer for file values 



*------------Searching Value Loop------------* 

      clr.l d3   ; value at index 
search  move.b (a3)+,d3 
      *-- Compare Here --* 
next  cmpi.b #$FF,d3 
      bne.s search 



* Put program code here 


      SIMHALT    ; halt simulator 

* Put variables and constants here 
    org $2000 

filename dc.b 'numbers4.txt',0 
buffer  ds.w 80 
filesize dc.b 80 


    END START  ; last line of source 

Die Werte-Datei in den Speicher geladen:

enter image description here

ich im Teil steckte, wo Ich muss Werte vergleichen. Ich weiß, wie man die einstelligen Werte 0-9 (dh subtrahiere 30) mit hex vergleicht, aber wie vergleicht man die zweistellige Zahl oder darüber mit hex? wie man überprüft, ob Hexadezimal "0B" einer der Ascii-Werte (31 31) ist, die im Speicher sind. Oder Vielleicht ist mein Ansatz falsch Ich bin mir nicht sicher.

Ich bin ein Neuling so meine Entschuldigung, wenn ich etwas offensichtlich vermisse. Bitte helfen

Antwort

1

Ich würde eine Unterroutine erstellen, um die Zahlen in Speicher/Register zu lesen. Verarbeiten Sie jede Ziffer nacheinander, bis Sie das Ende der Zeile erreichen (Wagenrücklauf usw.). Verarbeiten Sie den Text im Wesentlichen zu einem wahren ganzzahligen Wert, um ihn im Speicher zu speichern. Dann sind die Werte einfach zu handhaben.

Wenn Sie eine Zahl einlesen, laden Sie sie jeweils nacheinander in ein Datenregister. Wenn das nächste Zeichen auch eine Zahl ist, multiplizieren Sie das Datenregister mit 10 und fügen Sie die neue Zahl hinzu. Wenn die Quellennummern in Hex wären, wäre das schöner, da Sie das Datenregister einfach um 4 Bits und/oder in der neuen Ziffer verschieben könnten.

Wenn das nächste Zeichen keine Zahl ist, sollte die Routine zurückkehren.

So einfache Schleife:

loadval: clr.l d0  ; result in d0 
     clr.l d1  ; working reg 
.loop: move.b (a3)+, d1 
     cmpi.b #$30, d1 ; check for numerical digit 
     blt  .done 
     cmpi.b #$39, d1 
     bgt  .done 

     sub.b #$30, d1 ; We have a number, add it 
     mult.w #10, d0 
     add.w d1, d0 
     bra.s .loop 
.done: rts 

Hoffentlich, den Sinn und Arbeiten macht (kritzelte es direkt an der Spitze von meinem Kopf nach unten, so kann ein wenig fehlerhaft sein: D)