首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Easy68k,实现这个this循环

Easy68k,实现这个this循环
EN

Stack Overflow用户
提问于 2016-04-05 04:51:43
回答 3查看 1.5K关注 0票数 1
代码语言:javascript
复制
int X = 0;
int Y = 1;
while(X <= 10 ){
    if(X%2 == 0)
        Y = Y * X;
    else 
        Y++;

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

这就是我的Easy68k代码的内容。

代码语言:javascript
复制
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。任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-05 05:11:36

在进行除法和交换之后,仍然可以在and中得到除法的结果和剩余部分。这意味着它永远不会是零,并且比较总是错误的。您需要使用and对上面的部分进行归零,或者使用只使用较低部分的form.of cmp

请注意:当你做剩余的2的幂,你也可以跳过除法,直接使用and值减去1。在这种情况下,除以2的剩余部分与值为1的and相同。

票数 1
EN

Stack Overflow用户

发布于 2016-04-05 20:20:38

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

将现有代码更改为读(为简洁而修剪):

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2016-04-06 14:59:14

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

代码语言:javascript
复制
LOOP CLR.W   D3        ;Find the remainder
     MOVE.W  D1,D3
     DIVU    #2,D3

68000上的divu.wdivs.w命令从第二个参数中获取完整的32位字,然后除以第一个参数中指定的16位字。在除法之前,您的代码不需要清除高16位的d3。因此,这种变化是显而易见的:

代码语言:javascript
复制
LOOP CLR.L   D3        ;Find the remainder
     ;all the same from here on
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36417370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档