2015-04-19 242 views
0

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

我的代码如下:

 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 

谢谢你, Julius

+1

不知道什么CPU日是为了,还是仅仅是概念上的,但是'SRA'是否通过进位轮换?另外(这不是你问题的原因),你可能应该在开始的时候有'LOAD SC,00'。作为一种效率,当SA'变为零时,您可以终止您的循环。 'SF'中不需要循环计数器。如果你有一个“增加进位”指令,我会用4位数作为乘数而不是8位数,这可能是循环迭代次数的一半。 – lurker

+0

我认为你的循环在完成时也会多次进行产品左移。根据你的循环逻辑,'SRA SB'和'SRA SC'在你决定是否退出循环之前完成。如果是这样的话,你总会看到一款产品(尽管在你的声明中,你说的是你获得了正确的结果)。在决定是否退出循环之前,你可能想要做一次轮班*。 – lurker

+0

嗨Lurker,谢谢你的回应。是的,SRA通过所有位进行旋转,包括进位。 – Julius

回答

0

我会以这种方式重做代码。与旧版本的问题是:

  • 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 
    
+0

谢谢。我会试一试。 – Julius

+0

@Julius我刚刚意识到我的执行过程中出现了问题。请看我更新的答案。你的实现比我想象的更接近正确,因为我没有意识到它是反向运行标准乘法程序。因此需要循环计数器。 – lurker

+0

我发现我的问题,我需要再次乘以第二个字节,并将响应添加到数百个第一个字节。谢谢你的帮助。 – Julius