68K汇编:在数字文件中搜索数字

时间:2016-03-21 02:40:11

标签: assembly 68000 easy68k

我正在使用Easy68k编写汇编程序,我必须编写一个脚本来搜索带有数字的文件中的数字。

文件numbers4.txt:

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)与十六进制进行比较但是如何比较双位或超过十六进制?比如如何检查十六进制“0B”是否是存储器中的ascii值(31 31)之一。或许我的方法不正确我不确定。

我是新手,所以如果我遗漏了一些显而易见的东西,我会道歉。请帮忙

1 个答案:

答案 0 :(得分:1)

我会创建一个子程序来将数字读入内存/寄存器。依次处理每个数字,直到你到达行尾(回车等)。基本上将文本处理为真正的整数值以存储在内存中。然后,这些值将很容易使用。

当读入一个数字时,一次将一个字符加载到数据寄存器中,如果下一个字符也是一个数字,则将数据寄存器中的数字乘以10并添加新数字。如果源数字是十六进制的,那么就可以更好了,因为你可以简单地将数据寄存器左移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)