0

適切な減算のために8051アセンブリの16進数をループするのに問題があります。

これは、30回繰り返し、40から70までの値を示す単純なコードです(40,41,42,43、.... 70)

        MOV A,#40H ;first value of the loop
        MOV R0,#0H

        MOV R1,#30 ;Number of iterations


    LOOP:   

        ADD A,R0
        DA A   ;To Adjust the decimal values after each addition
        INC A

    DJNZ R1,LOOP


    END

これが各値の調整方法です。

; 40H = 64D --(+0D)--> 64D = 40H
; 41H = 65D --(+0D)--> 65D = 41H
; 42H = 66D --(+0D)--> 66D = 42H
; 43H = 67D --(+0D)--> 67D = 43H
; 44H = 68D --(+0D)--> 68D = 44H
; 45H = 69D --(+0D)--> 69D = 45H
; 46H = 70D --(+0D)--> 70D = 46H
; 47H = 71D --(+0D)--> 71D = 47H
; 48H = 72D --(+0D)--> 72D = 48H
; 49H = 73D --(+0D)--> 73D = 49H 
; 4AH = 74D --(+6D)--> 80D = 50H

しかし、ループを逆にしたい場合、つまり出力を70から40(70,69,68,67,66,65,64、..... 40)の逆順にしたい場合

私は何をしなければなりませんか?

これは、最初の数値が90の場合の動作例です。

; 90H = 144D --(+0D)--> 144D = 90H
; 8FH = 143D --(-6D)--> 137D = 89H
; 8EH = 142D --(-6D)--> 136D = 88H
; 8DH = 141D --(-6D)--> 135D = 87H
; 8CH = 140D --(-6D)--> 134D = 86H
; 8BH = 139D --(-6D)--> 133D = 85H
; 8AH = 138D --(-6D)--> 132D = 84H

しかし、減算後の10進調整には何もないので、どうすれば目的の結果を達成できますか?

目的の出力、

90 89 88 87 8685...。

4

2 に答える 2

1

1を引くことはできませんが、99を加えることはできます。

ADD A, #99H
DA A
于 2012-10-28T16:45:34.573 に答える
0

あなたの質問から私が理解しているのは、初期値99dで始まり00dで終わる2桁の10進数のダウンカウントを表示したいということです。

NovaDenizenに同意します。ここに説明があります:

遭遇する制限は、DAA命令が減算後に機能しないことです。次に、減算演算が特殊な形式の加算として実装される代替ロジックを使用する必要があります。このアイデアの直接の意味は、補数の方法を利用することです。10の補数法では、99を加算することは、-01を減算することと同じです。したがって、これはあなたのコードがどうあるべきかです:

ORG 0000H   

MOV  P1,#99H

MOV  A,#99H          ; A=99h

BACK:  ACALL  DELAY  ; Call Delay Routine

       ADD A,#99H    ; Realize count down action by adding 99H 
                       (equivalent to subtracting 01)

       DA  A         ; Decimal Adjust to realize the BCD format representation

       MOV P1,A      ; Display the count on P1

       JNZ BACK      ; Continue till the count ends with 00

       SJMP  $       ; termination of the program


DELAY: MOV R1,#0FFH              ; Delay Routine to generate certain delay.

 DEC1: MOV R2,#0FFH 

 DEC2: MOV R3,#0FFH 

       DJNZ  R3,$

       DJNZ  R2,DEC2   

       DJNZ  R1,DEC1    

       RET  

END

(Keilでプログラムを実行し、ポート1での出力を確認します。)

これがお役に立てば幸いです。よろしく

于 2013-03-28T02:29:42.847 に答える