0

以下是 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 开始的地址...现在我的问题是,当我们为什么需要执行 shift s,4.. .当我们接受一次输入时,我们从它的ascii值中找到它的原始值,然后将它发送到'loop'来存储它......从程序看来,只有前半字节的字符被发送到循环,然后其他...如果这是事实,那么首先会有字符的前半字节,因此前半部分的 ascii 操作不会给我们输入的实际值...当程序返回到 'getc ' 获取另一半字节不会读取列表中的其他字符...以下是同一本书中的一行以寻求帮助...

each byte of the code to be loaded is on device F1 as two hexadecimal digits  
4

1 回答 1

0

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

于 2011-08-12T13:23:58.367 回答