[英]Easy68k, Implementing this while loop
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。任何幫助表示贊賞。
在進行除法和交換之后,您仍然可以在d3
中獲得除法的結果和余數。 這意味着它永遠不會為零,並且比較總是錯誤的。 您需要使用and
或使用僅使用下部的 form.of cmp
將上部歸零。
請注意:當您計算 2 的冪的余數時,您也可以跳過除法and
直接使用and
值減去一。 在這種情況下除以兩個余數是一樣的and
與值1。
與使用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
回答“什么是不正確的”:
LOOP CLR.W D3 ;Find the remainder
MOVE.W D1,D3
DIVU #2,D3
68000 上的divu.w
和divs.w
命令從第二個參數中獲取完整的 32 位字,並將其除以第一個參數中指定的 16 位字。 您的代碼不會在除法之前清除d3
高 16 位。 所以變化很明顯:
LOOP CLR.L D3 ;Find the remainder
;all the same from here on
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.