【问题标题】:How to perform a circular left shift in LC3如何在 LC3 中执行循环左移
【发布时间】:2023-04-08 12:08:01
【问题描述】:

我们被分配了计算机系统基础课程的作业。该程序的目标是以三种不同的方式显示无符号整数值:二进制、十进制和十六进制。我已经完成了二进制部分,十进制方法只需要除以 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 .STRINGZ "0123456789ABCDEF" ;Digit_String 它将在 4 次旋转后取 [3:0] 的值,并确定要打印出哪个 ascii 字符。

【问题讨论】:

    标签: algorithm bit-shift lc3


    【解决方案1】:

    以前从未听说过 LC3,所以我不知道指令集,但从快速谷歌上你有:

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

    这实际上并不多(它缺少基本说明),因此您必须向后做所有事情。但是,有一些方法可以进行 循环旋转,例如:

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

      如果 MSB 位被设置,则在 2'os 补码中值为 negative。因此,您需要使用一些中性算术运算设置标志并测试N,P 标志。例如add r0,r0,#0

      另一种方法就像您猜到 and MSB 并测试 Z 标志,但我不确定您是否可以将 1000 0000 0000 0000 bin 存储为正数,因为我没有看到两者之间的任何区别有符号和无符号常量我假设它们都是有符号的,并将这个值设为正数会溢出编译器/解释器,使其很可能为零。尝试改用#-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)
    

    【讨论】:

      【解决方案2】:

      我几乎在做同样的任务。我想我实际上有你的同班哈哈。我知道这个网站上的人看不起共享代码,但这是您遇到问题的部分。看看它并尝试适当地附加你的。另外,我在使用掩码时遇到了同样的问题,尝试使用 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] 中的位。尝试识别差异。

      【讨论】:

      • 如果xF000 是十六进制值,那么您将屏蔽 4 位而不是 1,并且很难说在此值溢出到 2'os 补码后编译器/解释器中会留下什么值,所以可能只是3 位 ...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2011-05-18
      • 1970-01-01
      • 2015-08-30
      相关资源
      最近更新 更多