如何在LC3中执行圆形左移

时间:2016-05-02 01:27:28

标签: algorithm bit-shift lc3

我们已获得计算机系统基础课程的作业。该程序的目标是以三种不同的方式显示无符号整数值:二进制,十进制和十六进制。我已经完成了二进制的部分,十进制方法只需要除以10并打印结果。但是,对于十六进制,教授希望我们使用圆形左移来实现它(为了执行左旋转)。

IE。

  0010 1111 0000 1001
+ 0010 1111 0000 1001
  --------------------
  0101 1110 0001 0010

我们必须这样做4x然后应用一个掩码来清除[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字符。

2 个答案:

答案 0 :(得分:0)

我几乎做同样的任务。我想我实际上有同一类lol。我知道这个网站上的人看不起共享代码,但是你看到的是你遇到麻烦的部分。看看它并尝试适当地追加你的。此外,我遇到了与掩码相同的问题,尝试使用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个掩码用于右移MSB,1用于获得MSB,1用于最后获得B [3:0]中的位。尝试识别差异。

答案 1 :(得分:0)

之前从未听说过 LC3 所以我不知道指令集,但是你从快速谷歌那里得知:

  • and,add,not说明
  • N,Z,P标志
  • 2'os补充ALU

哪个真的不多(它缺乏基本说明)所以你必须向后做所有事情。但是,有很多方法可以做循环旋转,例如:

  1. 对于r0左侧的轮播,您可以使用add r0,r0,r0
  2. 获取进位可以在旋转前使用值符号

    如果设置了 MSB 位,则

    in 2' os补码为负数。因此,您需要使用一些中性算术运算和测试N,P标志来设置标志。例如add r0,r0,#0

    另一种方式是您猜到and MSB 和测试Z标志,但我不确定您是否可以将1000 0000 0000 0000 bin存储为正数没有看到有符号和无符号常量之间有任何区别我认为它们都是有符号的,并且将此值设置为正值将溢出编译器/解释器使其很可能为零。尝试使用#-32768代替。

  3. 当放在一起时,请让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)