sicxe汇编语言编程

时间:2011-08-12 13:08:21

标签: assembly bootloader

以下是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  

1 个答案:

答案 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编码的十六进制数转换为字节值。您需要两个字符来组成一个字节值。