2016-12-25 75 views
-1

我有这样的代码在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的值?

+0

此代码的处理器是什么? – duskwuff

+0

8051微处理器 – stones

回答

1

MOVC A, @A+PC移动从程序存储器的数据的8位(MOVC代表“移动代码”或类似的)在由 + PC并将其存储给定到累加器的地址。
@的存在是雄辩的,它用于表示register indirect addressing mode,完整表达式@A+PC指定它实际上是indexed addressing mode
需要注意的是:

  1. PC已经被它是用来做内存存取时间递增。
    由于MOVC A, @A+PC是1个字节长,它的语义是:

    PC = PC + 1 
    A = (A+PC) 
    
  2. 在符号表达式@A+PC,将@是为了有+优先,所以它应被理解为@(A+PC)

SJMPSHORT 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。