Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 8051汇编语言中十六进制数的处理_Assembly_8051 - Fatal编程技术网

Assembly 8051汇编语言中十六进制数的处理

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 --(+

我在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 --(+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
you
ADD 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