我正在使用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)之一。或许我的方法不正确我不确定。
我是新手,所以如果我遗漏了一些显而易见的东西,我会道歉。请帮忙
答案 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)