Assembly 8051汇编语言中十六进制数的处理
我在8051汇编中循环使用十六进制数进行正确减法时遇到问题 下面是一个简单的代码,它迭代30次,显示40到70之间的值(40,41,42,43,.70) 这就是它调整每个值的方式Assembly 8051汇编语言中十六进制数的处理,assembly,8051,Assembly,8051,我在8051汇编中循环使用十六进制数进行正确减法时遇到问题 下面是一个简单的代码,它迭代30次,显示40到70之间的值(40,41,42,43,.70) 这就是它调整每个值的方式 ; 40H = 64D --(+0D)--> 64D = 40H ; 41H = 65D --(+0D)--> 65D = 41H ; 42H = 66D --(+0D)--> 66D = 42H ; 43H = 67D --(+0D)--> 67D = 43H ; 44H = 68D --(+
; 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
但既然减法后没有十进制调整,我怎么能达到预期的结果呢 期望的输出 九十 89 88 87 86
85….你不能减去1,但可以加99
ADD A, #99H
DA A
我从您的问题中了解到的是,您希望显示一个2位数的十进制倒计时,从初始值99d开始,以00d结束 我同意NovaDenizen的观点。解释如下: 您遇到的限制是DA A指令在减法后不起作用。现在,您必须使用替代逻辑,其中减法运算作为特殊形式的加法实现。这个想法的直接含义是使用补语的方法在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上的输出。)
希望这对你有帮助。你的问题毫无意义。您已经包含了某种输出,但您的代码不会生成任何输出。您的输出也没有任何意义。64位十进制不等于43位十六进制。程序在Keil上运行良好,我可以看到每次迭代时“A”的值都会更新,值更新如下,40,41,42,43,44,45,46,47,48,49,4a(50)。。。。。。你说“64位十进制不等于43位十六进制”…修正了!对不起,“因为减法后没有小数调整”没有意义。“我怎样才能达到期望的结果?”你期望的结果是什么?DA似乎工作正常。在问题中做了一些更改,现在请看一看:)它怎么可能解决这个问题?我想以相反的方式打印数字,而不是
DEC A
youADD A,#99H
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