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。任何帮助都是非常感谢的。
发布于 2016-04-05 05:11:36
在进行除法和交换之后,仍然可以在and中得到除法的结果和剩余部分。这意味着它永远不会是零,并且比较总是错误的。您需要使用and对上面的部分进行归零,或者使用只使用较低部分的form.of cmp。
请注意:当你做剩余的2的幂,你也可以跳过除法,直接使用and值减去1。在这种情况下,除以2的剩余部分与值为1的and相同。
发布于 2016-04-05 20:20:38
与其使用divu,一种与x%2相同的更有效和更快的机制是检查位0的状态。这也会产生更少的代码。这显然只适用于2的mod,任何其他值都需要另一种方法(甚至可能是可怕的divide :)。
将现有代码更改为读(为简洁而修剪):
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
发布于 2016-04-06 14:59:14
回答“什么是不正确的”:
LOOP CLR.W D3 ;Find the remainder
MOVE.W D1,D3
DIVU #2,D368000上的divu.w和divs.w命令从第二个参数中获取完整的32位字,然后除以第一个参数中指定的16位字。在除法之前,您的代码不需要清除高16位的d3。因此,这种变化是显而易见的:
LOOP CLR.L D3 ;Find the remainder
;all the same from here onhttps://stackoverflow.com/questions/36417370
复制相似问题