我有这样的代码在8051汇编:8051汇编程序的指令序列是做什么的?
MOV A,#04H
RL A
MOVC A,@A+PC
SJMP Cont
Cont: DB 10H, 20H, 30H, 40H, 50H, 60H, 70H, 80H
的问题是,这些指令执行后,什么是有价值的;答案是A保持值(A)= 70H。
我已经搜索了关于MOV和RL的指令,并且我明白了,但是我不清楚,剩下的指令和我们如何得到寄存器A的值?
我有这样的代码在8051汇编:8051汇编程序的指令序列是做什么的?
MOV A,#04H
RL A
MOVC A,@A+PC
SJMP Cont
Cont: DB 10H, 20H, 30H, 40H, 50H, 60H, 70H, 80H
的问题是,这些指令执行后,什么是有价值的;答案是A保持值(A)= 70H。
我已经搜索了关于MOV和RL的指令,并且我明白了,但是我不清楚,剩下的指令和我们如何得到寄存器A的值?
MOVC A, @A+PC
移动从程序存储器的数据的8位(MOVC代表“移动代码”或类似的)在由甲 + PC并将其存储给定到累加器的地址。
@
的存在是雄辩的,它用于表示register indirect addressing mode,完整表达式@A+PC
指定它实际上是indexed addressing mode。
需要注意的是:
的PC
已经被它是用来做内存存取时间递增。
由于MOVC A, @A+PC
是1个字节长,它的语义是:
PC = PC + 1
A = (A+PC)
在符号表达式@A+PC
,将@
是为了有比+
少优先,所以它应被理解为@(A+PC)
。
SJMP
是SHORT JUMP和它简单地执行被指定为操作数的目标。
MOV A, #04H
将值04h移动到A
。
这里符号“#”表示immediate addressing mode。
RL A
只需将一个位置右转A
即可。
假设代码开始于X,然后
Address Data Instruction State before State after Description
X + 00 : 74 04 : MOV A, #04 : A = ? PC = X : A = 4 PC = X + 02 Set A to 4
X + 02 : 23 : RL A : A = 4 PC = X + 02 : A = 8 PC = X + 03 Rotate left 4 = 0000 0100 -> 0000 1000 = 8, now A is 8
X + 03 : 83 : MOVC A, @A+PC : A = 8 PC = X + 03 : A = 70 PC = X + 04 Read from memory A+PC, A = MEM[A + PC after] = MEM[8 + X + 04] = MEM[X + 0C] = 70
X + 04 : 80 00 : SJMP X + 06 : A = 70 PC = X + 04 : A = 70 PC = X + 06 Goto X + 06, PC <- X + 06
X + 06 : 10
X + 07 : 20
X + 08 : 30
X + 09 : 40
X + 0A : 50
X + 0B : 60
X + 0C : 70
X + 0D : 80
简单地说,在执行时MOVC A, @A+PC
,一个字节由8添加的下一个指令(地址值读取在A
)。
由于SJMP
,下一条指令的长度为1个字节,就像从Cont
读取7个字节。
Cont
的第七项是70h。
此代码的处理器是什么? – duskwuff
8051微处理器 – stones