Lc3 分裂如何工作
How does Lc3 division work
我一直在努力弄清楚减法除法是如何工作的,但是没有在线资源可以清楚地说明这一点。我还需要一个很好的例子来说明子程序在语法方面应该是什么样子。
在 LC3 中有两种方法可以进行除法。如果您正在寻找有关如何通过减法进行除法的示例,请查看此 post:
How do i do a bitshift right in binary
但如果你不必使用减法,我建议向左移动 15 位。它效率更高,因为它需要更少的 运行 时间,而且它的速度不受我们想要移位的数字的影响。
下面的代码向您展示了如何通过向左移动 15 位来执行向右移动:
.ORIG x3000
LD R0, VALUE
SHIFT_RIGHT
AND R2, R2, #0 ; Clear R2, used as the loop counter
SR_LOOP
ADD R3, R2, #-15 ; check to see how many times we've looped
BRzp SR_END ; If R2 - 15 = 0 then exit
LD R3, BIT_15 ; load BIT_15 into R3
AND R3, R3, R0 ; check to see if we'll have a carry
BRz #3 ; If no carry, skip the next 3 lines
ADD R0, R0, R0 ; bit shift left once
ADD R0, R0, #1 ; add 1 for the carry
BRnzp #1 ; skip the next line of code
ADD R0, R0, R0 ; bit shift left
ADD R2, R2, #1 ; increment our loop counter
BRnzp SR_LOOP ; start the loop over again
SR_END
ST R0, ANSWER ; we've finished looping 15 times, store R0
HALT
BIT_15 .FILL b1000000000000000
VALUE .FILL x3BBC ; some random number we want to bit shift right
ANSWER .BLKW 1
.END
举个例子:23/8,我们期望return2余7.
Set NUM=23 and DIVISOR=8, initializing DIVIDEND=0 and REMAINDER=0
Loop as long as NUM > DIVISOR:
NUM = NUM - DIVISOR decreases the overall number
DIVIDEND = DIVIDEND + 1 because we've discovered that it fits once more
最后,REMAINDER = NUM,因为这是在循环终止时不能再从中减去另一个 DIVISOR 的数字
那么,让我们一次完成一次迭代:
0) NUM=23, DIVIDEND=0
1) (23 > 8, continue) NUM=23-8=15, DIVIDEND=0+1=1
2) (15 > 8, continue) NUM=15-8=7, DIVIDEND=1+1=2
3) (8 < 7, stop)
最终答案,REMAINDER=NUM=7,DIVIDEND=2
我一直在努力弄清楚减法除法是如何工作的,但是没有在线资源可以清楚地说明这一点。我还需要一个很好的例子来说明子程序在语法方面应该是什么样子。
在 LC3 中有两种方法可以进行除法。如果您正在寻找有关如何通过减法进行除法的示例,请查看此 post:
How do i do a bitshift right in binary
但如果你不必使用减法,我建议向左移动 15 位。它效率更高,因为它需要更少的 运行 时间,而且它的速度不受我们想要移位的数字的影响。
下面的代码向您展示了如何通过向左移动 15 位来执行向右移动:
.ORIG x3000
LD R0, VALUE
SHIFT_RIGHT
AND R2, R2, #0 ; Clear R2, used as the loop counter
SR_LOOP
ADD R3, R2, #-15 ; check to see how many times we've looped
BRzp SR_END ; If R2 - 15 = 0 then exit
LD R3, BIT_15 ; load BIT_15 into R3
AND R3, R3, R0 ; check to see if we'll have a carry
BRz #3 ; If no carry, skip the next 3 lines
ADD R0, R0, R0 ; bit shift left once
ADD R0, R0, #1 ; add 1 for the carry
BRnzp #1 ; skip the next line of code
ADD R0, R0, R0 ; bit shift left
ADD R2, R2, #1 ; increment our loop counter
BRnzp SR_LOOP ; start the loop over again
SR_END
ST R0, ANSWER ; we've finished looping 15 times, store R0
HALT
BIT_15 .FILL b1000000000000000
VALUE .FILL x3BBC ; some random number we want to bit shift right
ANSWER .BLKW 1
.END
举个例子:23/8,我们期望return2余7.
Set NUM=23 and DIVISOR=8, initializing DIVIDEND=0 and REMAINDER=0
Loop as long as NUM > DIVISOR:
NUM = NUM - DIVISOR decreases the overall number
DIVIDEND = DIVIDEND + 1 because we've discovered that it fits once more
最后,REMAINDER = NUM,因为这是在循环终止时不能再从中减去另一个 DIVISOR 的数字
那么,让我们一次完成一次迭代:
0) NUM=23, DIVIDEND=0
1) (23 > 8, continue) NUM=23-8=15, DIVIDEND=0+1=1
2) (15 > 8, continue) NUM=15-8=7, DIVIDEND=1+1=2
3) (8 < 7, stop)
最终答案,REMAINDER=NUM=7,DIVIDEND=2