如何在LC3中执行循环左移
How to perform a circular left shift in LC3
我们的计算机系统基础知识分配给我们 class。该程序的目标是以三种不同的方式显示无符号整数值:二进制、十进制和十六进制。我已经完成了二进制部分,十进制方法只需要除以 10 并打印结果。但是,对于十六进制,教授希望我们使用循环左移来实现它(以便执行左旋转)。
IE.
0010 1111 0000 1001
+ 0010 1111 0000 1001
--------------------
0101 1110 0001 0010
我们必须执行此操作 4 次,然后应用掩码清除 [15:4] 中的所有位,以便打印出位 [3:0] 的 ascii 值。
这是我解决这个程序的算法。
;Loop 4 times -->initialization of for loop
;Begin For Loop
;Perform the left shift
;If the value after the left shift is performed has a carry of 1
;then add 1 to this value (the rotation)
;Otherwise if the value after the left shift is performed has a carry of 0
;Continue the value is already rotated
;Get the value of the number after the loop has completed
;Create a new loop that will go through the Digits
;Load R0 with the value of the digit that we land on
;Print that value to the screen
我 运行 遇到的问题是我不知道如何找到被移位的数字的进位位。
例如:0000 0000 0001 1011 ----> bit[4] is the carry bit after the left shift
我不知道如何跟踪它以执行循环移位。
我试了
的面膜
1000 0000 0000 0000
但我不这么认为
跟踪未出现在位 [15] 上的任何进位位。
不胜感激,这本书没有提供示例,而且我在网上找不到任何资源,我知道回答作业问题通常是不受欢迎的,但我束手无策!现在是周末,所以我无法联系教授,而且作业很快就要到期了(不是最后一刻,我从周五开始就一直在做这个-_-)。
谢谢!
编辑:更多信息
DIGITS 是这样的:DIGITS .STRINGZ "0123456789ABCDEF" ;Digit_String
它将在 4 次旋转后取 [3:0] 的值,并将确定打印出哪个 ascii 字符。
我几乎在做同样的作业。我想我实际上和你一样 class 哈哈。我知道这个站点上的人看不起共享代码,但这是您遇到麻烦的部分。看看它并尝试适当地附加你的。另外,我在掩码方面遇到了同样的问题,尝试使用 xF000 作为掩码来获取 MSB(大多数 sig 字节)。
ST R1, HEX1
ST R7, HEX7
AND R1, R1, 0
AND R7, R7, 0
AND R2, R2, 0
ADD R1, R0, #0
LD R4, HEXMASK
ADD R6, R6, #4; counter 2
OUTERROT
LD R3, INMASK
LD R5, OUTMASK
ST R5, HEXSAVE
LD R5, HEXMASK2
AND R7, R1, R5; R7=MSB
LD R5, HEXSAVE
ADD R2, R2, #4
SHIFT
ADD R1, R1, R1
ADD R2, R2, #-1
BRz EXITSHF
BR SHIFT
EXITSHF
AND R0, R0, 0
ADD R0, R1, 0
AND R1, R1, 0
SHFTR
ST R4, HEXSAVE
AND R4, R4, 0
AND R4, R7, R3
BRz DONOTHING
NOT R1, R1
NOT R5, R5
AND R4, R1, R5
NOT R4, R4
NOT R1, R1
NOT R5, R5
ADD R1, R4, 0
BRz SHFTREX
DONOTHING
LD R4, HEXSAVE
ADD R5, R5, R5
ADD R3, R3, R3
BRz SHFTREX
BR SHFTR
SHFTREX
ADD R0, R1, R0
AND R1, R1, 0
ADD R1, R0, 0
ST R0, HEXSAVE
ST R1, HEXSAVE1
AND R0, R0, 0
AND R0, R1, R4
ST R3, CONV3
AND R3, R3, #0
LEA R3, DIGITS
START
ADD R3, R3, 1
ADD R0, R0, #-1
BRnp START
LDR R0, R3, 0
LD R3, CONV3
TRAP x21
LD R0, HEXSAVE
ADD R6, R6, #-1
BRz HEXEXIT
BR OUTERROT
HEXEXIT
LD R1, HEX1
LD R7, HEX7
RET
;Save Area
HEXMASK .FILL x000F
HEXMASK2 .FILL XF000
INMASK .FILL x1000
OUTMASK .FILL x0001
ASCII .FILL X0030
HEX1 .BLKW 1
HEX7 .BLKW 1
HEXSAVE1 .BLKW 1
HEXSAVE .BLKW 1
CONV3 .BLKW 1
之前从未指定过哪个掩码。实际上有4个掩码要使用,2个用于右移MSB,1个用于获取MSB,1个用于获取B[3:0]中末尾的位。尝试识别差异。
之前从未听说过 LC3,所以我不知道指令集,但是从快速 google 你有:
and,add,not
说明
N,Z,P
旗帜
2'os
补 ALU
这真的不多(它缺少基本说明)所以你必须向后做所有事情。然而,有一些方法可以实现 循环旋转,例如:
- 对于
r0
的左侧旋转,您可以使用 add r0,r0,r0
为了获得进位你可以在旋转前使用值的符号
in 2'os 如果 MSB 位被设置则值是 negative。因此,您需要使用一些中性算术运算来设置标志并测试 N,P
标志。例如add r0,r0,#0
另一种方法就像您猜测的那样 and
MSB 并测试 Z
标志,但我不确定您是否可以存储 1000 0000 0000 0000 bin
作为 positive 数字,因为我没有看到有符号和无符号常量之间的任何区别,我假设它们都是有符号的,并将此值作为 positive 将溢出 compiler/interpreter 使其成为 most 可能为零。尝试使用 #-32768
代替。
放在一起时让 r0
中有值,所以:
LD R0,#your value
; extract MSB bit to R1
LD R1,#0 ; hope this is load
ADD R0,R0,#0 ; MSB -> N/P flags
BRp REL0 ; hope this is conditional jump if positive
LD R1,#1 ; carry was set
REL0
; shift
ADD R0,R0,R0 ; shift left (arithmetic)
ADD R0,R0,R1 ; shift left (cyclic)
我们的计算机系统基础知识分配给我们 class。该程序的目标是以三种不同的方式显示无符号整数值:二进制、十进制和十六进制。我已经完成了二进制部分,十进制方法只需要除以 10 并打印结果。但是,对于十六进制,教授希望我们使用循环左移来实现它(以便执行左旋转)。
IE.
0010 1111 0000 1001
+ 0010 1111 0000 1001
--------------------
0101 1110 0001 0010
我们必须执行此操作 4 次,然后应用掩码清除 [15:4] 中的所有位,以便打印出位 [3:0] 的 ascii 值。
这是我解决这个程序的算法。
;Loop 4 times -->initialization of for loop
;Begin For Loop
;Perform the left shift
;If the value after the left shift is performed has a carry of 1
;then add 1 to this value (the rotation)
;Otherwise if the value after the left shift is performed has a carry of 0
;Continue the value is already rotated
;Get the value of the number after the loop has completed
;Create a new loop that will go through the Digits
;Load R0 with the value of the digit that we land on
;Print that value to the screen
我 运行 遇到的问题是我不知道如何找到被移位的数字的进位位。
例如:0000 0000 0001 1011 ----> bit[4] is the carry bit after the left shift
我不知道如何跟踪它以执行循环移位。 我试了
的面膜1000 0000 0000 0000
但我不这么认为 跟踪未出现在位 [15] 上的任何进位位。
不胜感激,这本书没有提供示例,而且我在网上找不到任何资源,我知道回答作业问题通常是不受欢迎的,但我束手无策!现在是周末,所以我无法联系教授,而且作业很快就要到期了(不是最后一刻,我从周五开始就一直在做这个-_-)。
谢谢!
编辑:更多信息
DIGITS 是这样的:DIGITS .STRINGZ "0123456789ABCDEF" ;Digit_String
它将在 4 次旋转后取 [3:0] 的值,并将确定打印出哪个 ascii 字符。
我几乎在做同样的作业。我想我实际上和你一样 class 哈哈。我知道这个站点上的人看不起共享代码,但这是您遇到麻烦的部分。看看它并尝试适当地附加你的。另外,我在掩码方面遇到了同样的问题,尝试使用 xF000 作为掩码来获取 MSB(大多数 sig 字节)。
ST R1, HEX1
ST R7, HEX7
AND R1, R1, 0
AND R7, R7, 0
AND R2, R2, 0
ADD R1, R0, #0
LD R4, HEXMASK
ADD R6, R6, #4; counter 2
OUTERROT
LD R3, INMASK
LD R5, OUTMASK
ST R5, HEXSAVE
LD R5, HEXMASK2
AND R7, R1, R5; R7=MSB
LD R5, HEXSAVE
ADD R2, R2, #4
SHIFT
ADD R1, R1, R1
ADD R2, R2, #-1
BRz EXITSHF
BR SHIFT
EXITSHF
AND R0, R0, 0
ADD R0, R1, 0
AND R1, R1, 0
SHFTR
ST R4, HEXSAVE
AND R4, R4, 0
AND R4, R7, R3
BRz DONOTHING
NOT R1, R1
NOT R5, R5
AND R4, R1, R5
NOT R4, R4
NOT R1, R1
NOT R5, R5
ADD R1, R4, 0
BRz SHFTREX
DONOTHING
LD R4, HEXSAVE
ADD R5, R5, R5
ADD R3, R3, R3
BRz SHFTREX
BR SHFTR
SHFTREX
ADD R0, R1, R0
AND R1, R1, 0
ADD R1, R0, 0
ST R0, HEXSAVE
ST R1, HEXSAVE1
AND R0, R0, 0
AND R0, R1, R4
ST R3, CONV3
AND R3, R3, #0
LEA R3, DIGITS
START
ADD R3, R3, 1
ADD R0, R0, #-1
BRnp START
LDR R0, R3, 0
LD R3, CONV3
TRAP x21
LD R0, HEXSAVE
ADD R6, R6, #-1
BRz HEXEXIT
BR OUTERROT
HEXEXIT
LD R1, HEX1
LD R7, HEX7
RET
;Save Area
HEXMASK .FILL x000F
HEXMASK2 .FILL XF000
INMASK .FILL x1000
OUTMASK .FILL x0001
ASCII .FILL X0030
HEX1 .BLKW 1
HEX7 .BLKW 1
HEXSAVE1 .BLKW 1
HEXSAVE .BLKW 1
CONV3 .BLKW 1
之前从未指定过哪个掩码。实际上有4个掩码要使用,2个用于右移MSB,1个用于获取MSB,1个用于获取B[3:0]中末尾的位。尝试识别差异。
之前从未听说过 LC3,所以我不知道指令集,但是从快速 google 你有:
and,add,not
说明N,Z,P
旗帜2'os
补 ALU
这真的不多(它缺少基本说明)所以你必须向后做所有事情。然而,有一些方法可以实现 循环旋转,例如:
- 对于
r0
的左侧旋转,您可以使用add r0,r0,r0
为了获得进位你可以在旋转前使用值的符号
in 2'os 如果 MSB 位被设置则值是 negative。因此,您需要使用一些中性算术运算来设置标志并测试
N,P
标志。例如add r0,r0,#0
另一种方法就像您猜测的那样
and
MSB 并测试Z
标志,但我不确定您是否可以存储1000 0000 0000 0000 bin
作为 positive 数字,因为我没有看到有符号和无符号常量之间的任何区别,我假设它们都是有符号的,并将此值作为 positive 将溢出 compiler/interpreter 使其成为 most 可能为零。尝试使用#-32768
代替。
放在一起时让 r0
中有值,所以:
LD R0,#your value
; extract MSB bit to R1
LD R1,#0 ; hope this is load
ADD R0,R0,#0 ; MSB -> N/P flags
BRp REL0 ; hope this is conditional jump if positive
LD R1,#1 ; carry was set
REL0
; shift
ADD R0,R0,R0 ; shift left (arithmetic)
ADD R0,R0,R1 ; shift left (cyclic)