为什么 MOV data, data 会重置目标寄存器?
Why does MOV data, data reset the destination register?
我编写了以下汇编代码(用于 8052 软处理器)以在我的 Altera DE-2 的 8 个 7 段显示器上显示一个数字:
mov HEX0, #0x98 ; show 9
mov HEX1, #0xC0 ; show 0
mov HEX2, #0xF9 ; show 1
mov HEX3, #0xF8 ; show 7
mov HEX4, #0x92 ; show 5
mov HEX5, #0x92 ; show 5
mov HEX6, #0x92 ; show 5
mov HEX7, #0xA4 ; show 2
十六进制定义如下:
HEX0 DATA 091H ; Zero turns the segment on
HEX1 DATA 092H ;
HEX2 DATA 093H ;
HEX3 DATA 094H ;
HEX4 DATA 08EH ;
HEX5 DATA 08FH ;
HEX6 DATA 096H ;
HEX7 DATA 097H ;
上面的代码本身工作得很好,但是当我尝试使用下面的代码旋转数字时,所有 7 段显示输出就像 HEXn 寄存器设置为 0x00 一样。
M0:
wait(2)
mov A, HEX0 ; store HEX0 in the accumulator
mov HEX0, HEX1
mov HEX1, HEX2
mov HEX2, HEX3
mov HEX3, HEX4
mov HEX4, HEX5
mov HEX5, HEX6
mov HEX6, HEX7
mov HEX7, A
ljmp M0
END
这里wait(2)
是一个宏,它用掉了大约两秒的时钟周期。有人能告诉我(甚至推测)为什么 HEXn 被写入 0 吗?
这是我的教授 Jesus Calvino-Fraga 的回答:
HEX0 到 HEX7 是只写寄存器。它们无法被回读。克服此限制的传统方法是使用变量(或寄存器,如果有足够的可用)。首先让我们定义八字节变量。这样的事情会做:
dseg at 30H
shex0: ds 1
shex1: ds 1
shex2: ds 1
shex3: ds 1
shex4: ds 1
shex5: ds 1
shex6: ds 1
shex7: ds 1
cseg
然后用数字初始化变量:
mov shex0, #0x98 ; show 9
.
.
.
mov shex7, #0xA4 ; show 2
最后是循环,其中变量被发送到显示器并旋转:
M0:
; Send to displays
mov hex0, shex0
.
.
mov hex7, shex7
;Rotate
mov A, shex0; store HEX0 in the accumulator
mov shex0, shex1
.
.
.
mov shex6, shex7
mov shex7, A
sjmp M0
我编写了以下汇编代码(用于 8052 软处理器)以在我的 Altera DE-2 的 8 个 7 段显示器上显示一个数字:
mov HEX0, #0x98 ; show 9
mov HEX1, #0xC0 ; show 0
mov HEX2, #0xF9 ; show 1
mov HEX3, #0xF8 ; show 7
mov HEX4, #0x92 ; show 5
mov HEX5, #0x92 ; show 5
mov HEX6, #0x92 ; show 5
mov HEX7, #0xA4 ; show 2
十六进制定义如下:
HEX0 DATA 091H ; Zero turns the segment on
HEX1 DATA 092H ;
HEX2 DATA 093H ;
HEX3 DATA 094H ;
HEX4 DATA 08EH ;
HEX5 DATA 08FH ;
HEX6 DATA 096H ;
HEX7 DATA 097H ;
上面的代码本身工作得很好,但是当我尝试使用下面的代码旋转数字时,所有 7 段显示输出就像 HEXn 寄存器设置为 0x00 一样。
M0:
wait(2)
mov A, HEX0 ; store HEX0 in the accumulator
mov HEX0, HEX1
mov HEX1, HEX2
mov HEX2, HEX3
mov HEX3, HEX4
mov HEX4, HEX5
mov HEX5, HEX6
mov HEX6, HEX7
mov HEX7, A
ljmp M0
END
这里wait(2)
是一个宏,它用掉了大约两秒的时钟周期。有人能告诉我(甚至推测)为什么 HEXn 被写入 0 吗?
这是我的教授 Jesus Calvino-Fraga 的回答:
HEX0 到 HEX7 是只写寄存器。它们无法被回读。克服此限制的传统方法是使用变量(或寄存器,如果有足够的可用)。首先让我们定义八字节变量。这样的事情会做:
dseg at 30H
shex0: ds 1
shex1: ds 1
shex2: ds 1
shex3: ds 1
shex4: ds 1
shex5: ds 1
shex6: ds 1
shex7: ds 1
cseg
然后用数字初始化变量:
mov shex0, #0x98 ; show 9
.
.
.
mov shex7, #0xA4 ; show 2
最后是循环,其中变量被发送到显示器并旋转:
M0:
; Send to displays
mov hex0, shex0
.
.
mov hex7, shex7
;Rotate
mov A, shex0; store HEX0 in the accumulator
mov shex0, shex1
.
.
.
mov shex6, shex7
mov shex7, A
sjmp M0