2016-03-21 15 views
1

Я использую Easy68k для записи программы сборки, где мне нужно написать скрипт для поиска номера внутри файла с числами. numbers4.txt68K Сборка: номер поиска в номерах

Файл:

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

Мой код:

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 

Значения файлов загружаются в память:

enter image description here

Я застрял в той части, где Мне нужно сравнивать значения. Я знаю, как сравнивать однозначные значения 0-9 (т.е.: вычесть 30) в шестнадцатеричные, но как сравнить двойную цифру или с шестнадцатеричным значением? например, как проверить, является ли hex «0B» одним из значений ascii (31 31), которое находится в памяти. Или, может быть, мой подход неверен. Я не уверен.

Я новичок, поэтому приношу свои извинения, если мне не хватает чего-то очевидного. Пожалуйста, помогите

ответ

1

Я бы создал подпрограмму для чтения чисел в память/регистр. Обработайте каждую цифру поочередно, пока не нажмете конец линии (возврат каретки и т. Д.). По существу обрабатывать текст в истинное целочисленное значение для хранения в памяти. Тогда значения будут просты в работе.

При чтении в номере загружайте символ в регистр данных, если следующий символ также является числом, а затем умножьте то, что у вас есть в регистре данных, на 10 и добавьте новый номер. Если исходные номера были в Hex, это было бы лучше, так как вы могли просто сдвинуть регистр данных, оставшийся на 4 бита и или в новую цифру.

Если следующий символ не является числом, процедура должна затем вернуться.

Так просто петля:

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 

Надеется, что имеет смысл и работу (просто набросала его вниз с верхней частью моей головы, так может быть немного багги: D)

 Смежные вопросы

  • Нет связанных вопросов^_^