【问题标题】:Easy68k, Implementing this while loopEasy68k,实现这个while循环
【发布时间】:2016-04-05 04:51:43
【问题描述】:
int X = 0;
int Y = 1;
while(X <= 10 ){
    if(X%2 == 0)
        Y = Y * X;
    else 
        Y++;

    X++;
}
cout << "Y is: " << Y;

这就是我的 Easy68k 代码。

ORG    $1000
START:                  ; first instruction of program

MOVE.W  #0,D1           ;PUT 0 IN D1 (X)
MOVE.W  #1,D2           ;PUT 1 IN D2 (Y)

LOOP CLR.W   D3        ;Find the remainder
     MOVE.W  D1,D3
     DIVU    #2,D3
     SWAP    D3

     CMP     #0,D3      ;Compare remainder with 0
     BEQ     EQUAL      ;If equal, then go to equal

     ADD.W   #1,D2      ;Y++
     ADD.W   #1,D1      ;X++

     CMP     #11,D1     ;Compare D1 with 11
     BEQ     DONE       ;If D1 equals 11, break loop.      
     BRA     LOOP


EQUAL MULU.W  D1,D2     ;Multiply D1 and D2 and store it in D2
      ADD.W   #1,D1     ;X++
      CMP     #11,D1    ;Compare D1 with 11
      BEQ     DONE      ;If D1 equals 11, break loop. 
      BRA     LOOP


DONE LEA MESSAGE,A1
     MOVE.W #14,D0
     TRAP #15

     MOVE.W  D2,D1

     MOVE.W #3,D0
     TRAP #15


    SIMHALT             ; halt simulator

MESSAGE DC.W    'Y is: ',0


    END    START        ; last line of source

我不确定我的代码有什么不正确的地方,但我觉得这是循环部分开头的问题。我已经按照代码进行了操作,但我仍然无法弄清楚哪里出了问题。当我运行它时,它会输出 Y 为:10。 D1 和 D2 也是 A 或 10。感谢任何帮助。

【问题讨论】:

    标签: assembly 68000 easy68k


    【解决方案1】:

    在进行除法和交换之后,d3 中仍然有除法的结果和余数。这意味着它永远不会为零,并且比较总是错误的。您需要使用and 将上部归零或使用仅使用下部的cmp 的form.of。

    请注意:当您计算 2 的余数时,您也可以跳过除法并直接使用 and 并将值减一。在这种情况下,除以 2 的余数与 and 相同,值为 1。

    【讨论】:

    • 谢谢,现在可以了。我是stackoverflow的新手,所以一个快速的问题:我想用工作代码回答我自己的问题还是编辑我的原始帖子以包含工作代码?
    • @NobodyKnows 不,如果答案是正确的,您可以用复选标记选择它,您可以投票赞成有帮助的问题。复选标记表明该答案是您问题的解决方案。您的问题应该保持原样,因为它显示了原始问题,除非修复是重大问题并且答案没有清楚地解释它,但这种情况很少见。
    【解决方案2】:

    与使用divu 相比,更有效、更快速的机制来执行与 x%2 相同的操作只是检查位 0 的状态。这也会产生更少的代码。这显然只适用于 2 的 mod,任何其他值都需要另一种方法(甚至可能是可怕的鸿沟 :))

    更改现有代码以读取(为简洁起见):

    LOOP CLR.W   D3        ;Find the remainder
         MOVE.W  D1,D3
         btst    #0,d3     ; Test bit 0
         BEQ     EQUAL      ;If equal, then go to equal
         ...
    

    将显着加快执行速度(在真实硬件上)。您可能不会注意到 :)

    之所以有效,是因为 mod 2 本质上会告诉您一个数字是偶数还是奇数,只需查看是否设置了位 0 就可以非常便宜地完成此操作

    HTH

    【讨论】:

      【解决方案3】:

      回答“什么是不正确的”:

      LOOP CLR.W   D3        ;Find the remainder
           MOVE.W  D1,D3
           DIVU    #2,D3
      

      divu.wdivs.w 68000 上的命令从第二个参数中获取完整的 32 位字,然后除以第一个参数中指定的 16 位字。 您的代码不会在除法之前清除 d3 的高 16 位。 所以变化很明显:

      LOOP CLR.L   D3        ;Find the remainder
           ;all the same from here on
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        相关资源
        最近更新 更多