可以立即将程序计数器移动到远端存储器地址吗?

时间:2017-11-18 19:52:55

标签: binary hex lc3 machine-language

我试图调整一个计算文件中char出现次数的程序来存储匹配发生在远端内存位置的十六进制地址列表。代码:

011 0000 0000 0000 ;Codes x3000 as Load-address of program
0101 010 010 1 00000 ;R2 <- 0
0010 011 000010000 ;R3 <- M[x3012]
1111 0000 0010 0011 ;TRAP x23 (Loads INPUT into R0)
0110 001 011 000000 ;R1 <- M[R3]
;LOOP BEGINS HERE
0001 100 001 1 11100 ;R4 <- R1 - EOT
0000 010 000001000 ;If above = 0, exit loop
1001 001 001 111111 ;R1 <- NOT R1
0001 001 001 1 00001 ;R1 <- R1 + 1
0001 001 001 0 00 000 ;R1 <- R1 + R0
0000 101 000000001 ;If above != 0, do NOT increment counter
0001 010 010 1 00001 ;R2 <- R2 + 1 (increment counter)
0001 011 011 1 00001 ;R3 <- R3 + 1 (increments pointer to next char in file)
0110 001 011 000000 ;R1 <- M[R3] (loads next char into R1)
0000 111 111110110 ;BRnzp x3004 (unconditionally RETURN to loop start)
;LOOP ENDS HERE
0010 000 000000100 ;R0 <- M[x3013]
0001 000 000 0 00 010 ;R0 <- R0 + R2
1111 0000 0010 0001 ;TRAP x21 (OUTPUT)
1111 0000 0010 0101 ;TRAP x25 (HALT)
0011 0001 0000 0000 ;Codes x3100 for the starting address of the file
0000 000 000110000 ;ASCII template

所以我的程序从内存地址x3000开始。我想开始处理x300B列表的指令集(低于&#34;增量R2和#34;指令)。麻烦的是,我想在x3500开始列表,而且我不知道有效的&#34;到达那里的方式。

我最初的计划是使用加载间接(LDI)指令,但由于符号扩展,9位偏移仅允许偏移量至多为x00FF = 0000 0000 1111 1111,这只需要我从x 300C( x300B,程序计数器递增)到x310B。

唯一真实的&#34;解决方法&#34;我想出的是使用加载有效地址(LEA)指令将地址x310B存储在寄存器(比如R5)中,然后将值x00FF存储在R6中,并重复将R6加到R5直到我到达x3408(需要3条ADD指令),此时我将值x0092存储在R6中,将其添加到R5,我最后在R5中使用x3500。

此时,其余部分是微不足道的(将R3存储在(R5 +计数器)中,这会将当前匹配的地址放入列表中相应的&#34;点&#34;)

我还没有真正做到这一点,因为我上面介绍的x3500的整个方法看起来非常麻烦和笨拙。我不能动摇这种感觉,即必须有更好,更快的方式同时移动那么多内存地址。

是否可以在一条指令中从x300C移动到x3500?即使是两个也会比我目前得到的更好。

1 个答案:

答案 0 :(得分:1)

您不希望这样做,这是可能的,但更简单的方法是使用LD(操作码0010)和LDR(操作码0110)来执行此操作。无需将PC跳转到x3500(这将开始执行数组中的数据,这是不好的)

地址包含位0011 0101 0000 0000 操作码0010将允许您将x3500拉入寄存器。然后,操作码0110将允许您从阵列中加载值。