以下是sic / xe机器的汇编语言代码....
clear a
ldx #128
loop jsub getc
rmo a,s
shift s,4
jsub getc
addr s,a
stch 0,x
tixr x,x
j loop
getc td input
jeq getc
rd input
comp #4 ;if input is 4 then eof
jeq 80 ;jump to start of program
comp #48 ; compare to charcter 0
jlt getc ;skip charcters less than 0
sub #48
comp #10 ;if result is less than 10, conversion is complete
jlt return
sub #7 ;for hex digits A through F
return rsub
input byte x'F1'
这是一个bootstrap加载器...这个程序的目的是从设备F1读取并将输入存储在从80开始的地址...现在我的问题是,当我们为什么需要做shift时, 4 ...当我们输入一次输入时,我们从其ascii值中找到它的原始值,然后将其发送到'loop'来存储它...从程序看来,首先只有半字节的chatacter被发送到循环然后是另一个...如果这是事实,那么在第一个将有charcter的前半个字节,所以上半部分的ascii操作不会给我们输入的真正价值...当程序返回时要'getc'来获取另一半字节,将不会读取列表中的其他字符......以下是同一本书中的一行求助...
each byte of the code to be loaded is on device F1 as two hexadecimal digits
答案 0 :(得分:0)
该代码将ASCII字符串中编码的数字转换为字节值。
因此,给定字符串'A5',它会将数字165存储到内存中的一个字节中。
每个字节值需要进行两次读取。 (如您所见,字符串'A5'中有两个字符,分别是'A'和'5'。
getc例程读取第一个字符。在我的例子中,这是'A',其ASCII值为65(41 hex)。例程减去48,然后再减去7。 65-48-7 = 10,这是十六进制数字A的十进制表示法。
然后循环将此值移动4位,产生值160'。那是因为我们读取的第一个字符是双字节字符串的高位字节。
下次调用getc时,它会读取字符'5',其代码为53. 53-48为5。
循环然后将先前存储的值160加5,得到正确的总数165。
再次,该代码片段将ascii编码的十六进制数转换为字节值。您需要两个字符来组成一个字节值。