8051汇编程序中的指令顺序做什么?



我在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指定它实际上是索引的地址模式。
请注意:

  1. PC在用于进行内存访问的时间已经增加了。
    由于MOVC A, @A+PC是1个字节长,因此其语义为:

    PC = PC + 1
    A = (A+PC)
    
  2. 在符号表达式@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。

最新更新