在68k中实现while循环

时间:2019-07-07 22:18:28

标签: assembly 68000 easy68k

  

将以下代码翻译成汇编语言并显示   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

1 个答案:

答案 0 :(得分:2)

如果/** * * @param {object} formGroup form group to update * @param {object} formValues the form control name as the key and the value to patch */ public patchMultipleValues(formGroup, formValues) { for (let key in formValues) { let keyToPatch = key; let valueToPatch = formValues[key]; // Patch value formGroup.patchValue({ [keyToPatch]: valueToPatch }); } } 的高位字包含大于1的数据,将导致意外结果。

D3

如果您确实要使用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)。如果您随后将其覆盖,仅清除低位字毫无意义。

但是,正如@PeterCordes所说的那样,moveq #0,d3效率很低,无法检查低位(我不会指出代码中的其他低效率之处)。最好使用DIVU(如果该位为空,则设置btst #0,d1标志)。 替代方法是:

  • Z数字1和您要测试的值。如果最低位为空,还设置and.w标志
  • 将值向右移动(如果设置了最低位,则设置Z标志)

当然,您还可以部分展开循环,并利用C每隔一次迭代为真的事实。并且您可以完全展开循环并将结果直接移到目标中(多数优化的编译器将能够执行此操作:https://godbolt.org/z/VGecJ3)。