簡體   English   中英

在68k中實現while循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM