我在8051 Assembler中具有此代码:
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指令,但我理解了,但是我尚不清楚什么指令以及我们如何获得注册的价值?
MOVC A, @A+PC
从程序内存中移动8位数据( movc 代表"移动代码"或类似),该地址由 a pc 并将其存储到累加器中。@
的存在是雄辩的,用于表示寄存器间接地址模式,完整表达式@A+PC
指定它实际上是索引的地址模式。
请注意:
-
PC
在用于进行内存访问的时间已经增加了。
由于MOVC A, @A+PC
是1个字节长,因此其语义为:PC = PC + 1 A = (A+PC)
-
在符号表达式
@A+PC
中,@
的含量要比+
少 的优先级,因此应将其理解为@(A+PC)
。
SJMP
是A 短跳跃,它只是对指定为操作数的目标执行。
MOV A, #04H
将值04H移至A
。
在这里,符号"#"表示即时解决模式。
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
时,从添加的下一个指令的地址读取了一个字节(A
中的值)。
由于SJMP
(下一个指令)是1个字节长,就像从Cont
读取7个字节。Cont
的第七项为70h。