1

我正在使用 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

加载到内存的文件值:

在此处输入图像描述

我被困在必须比较值的部分。我知道如何将单个数字值 0-9(即:减去 30)与十六进制进行比较,但是如何将两位数或更高的数字与十六进制进行比较?就像如何检查十六进制“0B”是否是内存中的 ascii 值(31 31)之一。或者也许我的方法不正确,我不确定。

我是新手,所以如果我遗漏了一些明显的东西,我深表歉意。请帮忙

4

1 回答 1

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)

于 2016-03-26T21:08:50.663 回答