以下是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'
这是一个引导程序加载器...此程序的目的是从设备F1读取并将输入存储在从80开始的地址中...现在我的问题是,为什么我们需要移位s,4 ...当我们接受一次输入时,我们从其ascii值中找到其原始值,然后将其发送到“循环”以进行存储...从程序看来,只有前半字节的聊天对象被发送至循环,并且然后是另一个...如果这是事实,那么在第一个字符中将有charcter的前半个字节,因此前半部分的ascii操作将不会为我们提供输入的真实值...同样在程序返回到'getc'获取另一半字节将不会读取列表中的其他字符...下面是同一本书的一行以寻求帮助...
each byte of the code to be loaded is on device F1 as two hexadecimal digits
该代码将以ASCII字符串编码的数字转换为字节值。
因此,给定字符串“ A5”,它将把数字165存储到内存中的一个字节中。
它需要对每个字节值进行两次读取。 (如您所见,字符串“ A5”中有两个字符,分别是“ A”和“ 5”。
getc例程读取第一个字符。在我的示例中,这是“ A”,其ASCII值为65(十六进制41)。例程先减去48,然后再减去7。 65-48-7 = 10,它是十六进制数字A的十进制表示法。
然后,该循环将该值移位4位,结果为160'。这是因为我们读取的第一个字符是两字节字符串的高位字节。
下次调用getc时,它读取字符'5',其代码为53。53-48为5。
然后,循环将5与先前存储的值160相加,得出正确的总数165。
同样,该代码段将一个ascii编码的十六进制数字转换为一个字节值。您需要两个字符来组成一个字节值。