我在8051汇编程序中有这段代码:
MOV A,#04H
RL A
MOVC A,@A+PC
SJMP Cont
Cont: DB 10H, 20H, 30H, 40H, 50H, 60H, 70H, 80H
问题是执行这些指令后A的价值是多少;答案是A保持值(A)= 70H。
我已经搜索了MOV和RL指令,我理解,但我不清楚,其余指令是什么以及我们如何得到寄存器A的值?
答案 0 :(得分:1)
MOVC A, @A+PC
在 A给出的地址处移动程序存储器中的8位数据( MOVC 代表" MOVe Code"或类似地址) + PC 并将其存储到累加器中
@
的存在是雄辩的,它用于表示register indirect addressing mode,完整表达式@A+PC
指定它实际上是indexed addressing mode。
请注意:
PC
在用于进行内存访问时已经增加了。
由于MOVC A, @A+PC
长度为1个字节,因此其语义为:
PC = PC + 1
A = (A+PC)
在符号表达式@A+PC
中,@
意味着少于优先于+
,因此应将其理解为{ {1}}。
SJMP
是 Short JuMP ,它只是执行到指定为操作数的目标。
MOV A, #04H
将值04h移动到@(A+PC)
这里的符号是#34;#"表示immediate addressing mode。
RL A
只需将A
向右旋转一个位置即可。
我们假设代码从 X 开始,然后
A
简单地说,当执行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
时,将从添加了8的下一条指令的地址(MOVC A, @A+PC
中的值)中读取一个字节。
由于A
,下一条指令长1个字节,就像从SJMP
读取7个字节一样。
Cont
的第七项是70h。