如何在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

这真的不多(它缺少基本说明)所以你必须向后做所有事情。然而,有一些方法可以实现 循环旋转,例如:

  1. 对于 r0 的左侧旋转,您可以使用 add r0,r0,r0
  2. 为了获得进位你可以在旋转前使用值的符号

    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)