【问题标题】:4 bit by 8 bit Assembly Multiplication4 位乘 8 位汇编乘法
【发布时间】:2015-04-19 01:59:01
【问题描述】:

我在七段显示器上显示四位数字时遇到问题。我有以下循环,除了 MSB 中的显示外,一切正常。我知道这是因为输入 S9 只有 4 位,所以当我将它乘以 SA(这是七段显示器的当前值)时,结果只给了我 12 位,即使我保持最后一位仍然为 0乘以其他数字溢出到下一个数字。所以我不知道如何在不改变产品的情况下使它成为四位数。请参见下面显示结果的示例。 F乘F给我00E1 E1乘以F给我0D2F D2F 乘以 F 给我 02C1(MSB 中应该已经有一个数字)

我的代码如下:

        LOAD SB, 00
        LOAD SF, 08

        multloop:
        SR0 SA;

        JUMP NC, shiftproduct 

        ADD SB, s9 

        shiftproduct :
        SRA SB
        SRA SC 

        SUB SF, 01
        JUMP NZ, multloop

        OUTPUT sB,05 ; upper byte of seven segment display
        OUTPUT sC,04 ; lower byte of seven segment display

谢谢你, 朱利叶斯

【问题讨论】:

  • 不确定这是用于什么 CPU,或者它是否只是概念性的,但 SRA 是否通过进位旋转?另外(这不是您的问题的原因),您可能应该在开头使用LOAD SC, 00。为了提高效率,您可以在SA 变为零时终止循环。 SF 中不需要循环计数器。如果您有“带进位加法”指令,我会使用 4 位数而不是 8 位数作为乘数,这可能是循环迭代次数的一半。
  • 我认为您的循环在完成时也会多次向产品左移。根据您的循环逻辑,SRA SBSRA SC 在您决定是否退出循环之前就完成了。如果是这样的话,你总是会看到一个偶数的产品(即使在你的陈述中,你说你得到了正确的结果)。您可能希望在 after 决定是否退出循环之后再进行换档。
  • 嗨,Lurker,感谢您的回复。是的,SRA 循环遍历所有位,包括进位。
  • 关于 LOAD SC, 00,这是我的问题,SC 是一个 4 位输入,由我的 fpga 板上的 4 个滑块开关定义。我尝试更改循环顺序但没有成功,但感谢您花时间帮助我。
  • 另外,你的意思是把 S9 换成 SA 吗? SA 是我的 4 位输入。我也试了一下。

标签: assembly multiplication


【解决方案1】:

我会以这种方式重新编写代码。旧版本的问题是:

  • SC 寄存器尚未初始化为 00(也许一开始是 00,但我不想假设它是)
  • 将乘数添加到乘积SC:SB 时,不仅需要将其添加到SB,还需要将任何结果进位添加到SC

        LOAD    SB, 00
        LOAD    SC, 00            ; <-- Needed to init SC
        LOAD    SF, 08            ; Loop counter
    
    multloop:
        SR0     SA
        JUMP    NC, shiftproduct 
    
        ADD     SB, s9
        ADDCY   SC, 00            ; <-- NEEDED and add C here to SC
    
    shiftproduct:
        SRA     SB
        SRA     SC 
    
        SUB     SF, 01
        JUMP    NZ, multloop
    
        OUTPUT  sB,05             ; upper byte of seven segment display
        OUTPUT  sC,04             ; lower byte of seven segment display
    

【讨论】:

  • 谢谢。我试试看。
  • @Julius 我刚刚意识到我在实现中出了点问题。请参阅我更新的答案。您的实现比我想象的更接近正确,因为我没有意识到它是在反向运行标准乘法例程。所以需要循环计数器。
  • 我发现了我的问题,我需要再次乘以第二个字节并将响应添加到第一个字节的数百个。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多