【问题标题】:Handling of Hexadecimal numbers for 8051 Assembly处理 8051 程序集的十六进制数
【发布时间】:2012-10-28 15:49:26
【问题描述】:

我在循环 8051 程序集中的十六进制数字以进行正确减法时遇到问题,

这里是迭代 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

但是由于减法后没有小数调整,我怎么能达到预期的结果?

想要的输出,

90 89 88 87 86 85....

【问题讨论】:

  • 你的问题没有意义。您已经包含了某种输出,但您的代码不会产生任何输出。您的输出也没有任何意义。十进制的 64 不等于十六进制的 43。
  • 程序在 Keil 上运行良好,我可以看到 'A' 的值在每次迭代时更新,值更新如下,40,41,42,43,44,45,46 ,47,48,49,4a(50)...... 你声明“64十进制不等于43十六进制”。 ...固定的 !对不起
  • “但由于减法后没有任何小数调整”没有意义。 “我怎样才能达到预期的结果?”你想要的结果是什么? DA 似乎工作正常。
  • 对问题进行了一些更改,请立即查看 :)

标签: assembly 8051


【解决方案1】:

你不能减 1,但你可以加 99。

ADD A, #99H
DA A

【讨论】:

  • 它怎么可能解决问题?我想反向打印数字
  • 而不是DEC AADD A, #99H
【解决方案2】:

我从您的问题中了解到的是,您希望显示从初始值 99d 开始并以 00d 结束的 2 位小数向下计数。

我同意 NovaDenizen 的观点。这是解释:

您遇到的限制是 DA A 指令在减法后不起作用。现在,您必须使用替代逻辑,其中减法运算被实现为特殊形式的加法。这个想法的直接含义是利用补码的方法。 10s补码法加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 的输出。)

希望这对您有所帮助。问候

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2014-09-14
    • 1970-01-01
    • 2011-07-07
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多