[英]Implementing while loop in 68k
將以下代碼轉換為匯編語言,並顯示Y的最終值。(2分)。
X = 1; Y = 2; WHILE(X <= 10 ){ IF((X%2) != 0) Y = Y * X; ELSE Y++; X++;} Output Y
如果我做的一切正確,請讓我知道,因為我不確定我的輸出是否正確。 結果是3712
*-----------------------------------------------------------
* Title :
* Written by :
* Date :
* Description:
*-----------------------------------------------------------
ORG $1000
START: ; first instruction of program
* Put program code here
MOVE.W #1,D1 ;PUT 0 IN D1 (X)
MOVE.W #2,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
BNE NOTEQUAL ;If NOT equal, then go to NOT 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
NOTEQUAL
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
* Put variables and constants here
MESSAGE DC.W 'Y is: ',0
END START ; last line of source
如果D3
的高位字包含大於1的數據,將導致意外結果。
LOOP CLR.W D3 ; D3 = [**** 0000]
MOVE.W D1,D3 ; D3 = [**** X]
DIVU #2,D3 ; if D3.h > 1, division overflows and D3 does not change
SWAP D3 ; Lower word is (X%2) or random data
如果您真的想使用DIVU
確保清除長寄存器(使用clr.l d3
或實際上更快的moveq #0,d3
)。 如果稍后覆蓋,則僅清除低位字毫無意義。
但是正如@PeterCordes所說, DIVU
檢查低位的效率非常低(我不會指出您代碼中的其他低效率)。 最好使用btst #0,d1
(如果該位為空,則設置Z
標志)。 替代方法是:
and.w
帶有要測試的值的數字1。 如果最低位為空,也設置Z
標志 C
標志) 當然,您也可以部分展開循環,並利用以下事實: (X%2) != 0
每隔一次迭代就為真。 您可以完全展開循環並將結果直接移到目標中(大多數優化的編譯器都可以這樣做: https : //godbolt.org/z/VGecJ3 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.