2016-04-05 69 views
1
int X = 0; 
int Y = 1; 
while(X <= 10){ 
    if(X%2 == 0) 
     Y = Y * X; 
    else 
     Y++; 

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

这就是我的Easy68k代码。Easy68k,实现此while循环

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.任何帮助表示赞赏。

回答

1

经过分割和交换,你仍然有结果和d3除法的其余部分。这意味着它永远不会为零,并且比较始终是错误的。您需要用and将零件上部清零或使用仅使用下部零件的cmp

只需注意:当你在做两个幂的余数时,你也可以跳过这个分区,直接使用and的值减1。在这种情况下,除以2的其余部分与and相同,值为1.

+0

谢谢,它现在的作品。我是新来的stackoverflow所以一个简单的问题:我想回答自己的问题与工作代码或编辑我的原始帖子,包括工作代码? – NobodyKnows

+0

@NobodyKnows不,如果一个答案是正确的,你可以用复选标记来选择答案,并且你可以提出有帮助的问题。复选标记表明该答案是解决您的问题的方法。你的问题应该保持原样,因为它显示了原始问题,除非修复是重大的,答案没有明确解释它,但这很少见。 –

0

与使用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

0

接听上“什么是不正确”:68000上

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

divu.wdivs.w命令充分的32位字从第二个参数,并通过在第一个参数指定的16位字划分它。 您的代码在分割之前不打扰清除高位16位的d3。 所以变化是显而易见的:

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