【问题标题】:What do the sequence of instructions in 8051 assembler do?8051汇编器中的指令序列是做什么的?
【发布时间】:2016-12-25 21:13:16
【问题描述】:

我在 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 的值?

【问题讨论】:

  • 这段代码用于什么处理器?
  • 8051 微处理器

标签: assembly 8051


【解决方案1】:

MOVC A, @A+PC 将 8 位数据从程序存储器(MOVC 代表“MOVe 代码”或类似的)移动到 A+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)

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多