80C51单片机的寻址方式(汇编语言)

一、立即寻址

1010H:MOV A,#55H

指令解析

地址 1010H:

  • 1010H 是这条指令存储在程序存储器中的地址。汇编语言程序由指令组成,每条指令都有一个对应的内存地址。

指令 MOV A, #55H:

  • MOV 是一个数据传送指令,用于将数据从一个位置移动到另一个位置。
  • A 是累加器寄存器,它用于算术运算和数据处理。
  • #55H 是一个立即数,代表值为 55H 的常数。

执行过程

当程序执行到地址 1010H 时,以下操作会被执行:

  • 将立即数加载到累加器:

    • 将常数 55H 直接加载到 A 寄存器中。
  • 结果:

    • 指令执行后,累加器 A 的内容将为 55H。在此之后,你可以使用 A 寄存器进行各种运算或输出。

实际代码示例

以下是一个简单的80C51汇编程序示例,其中包含 MOV A, #55H 指令:

ORG 1010H          ; 程序起始地址为1010H
START:             ; 程序标签
    MOV A, #55H   ; 将立即数55H加载到累加器A
    MOV P1, A     ; 将A的值输出到端口P1
    SJMP $        ; 无限循环,程序在此处停留

二、直接寻址

2000H:MOV A,55H

指令解析

  • 这里的 55H 是一个地址,指向内存中的一个具体位置。该指令的作用是将内存地址 55H 中存储的内容加载到累加器 A 中。

实际代码示例

ORG 2000H
START:
    MOV 55H, #0AH  ; 将立即数0AH存储到内存地址55H
    MOV A, 55H     ; 将内存地址55H中的内容(即0AH)加载到累加器A
  • 执行 MOV 55H, #0AH:将立即数 0AH 存储到内存地址 55H
  • 执行 MOV A, 55H:将内存地址 55H 中的内容(即 0AH)加载到累加器 A。

采用直接寻址的储存空间

1、内部RAM

  • 内部RAM的地址范围通常为00H到7FH,共128个字节。这部分存储空间可以直接通过地址进行寻址,例如MOV A, 30H,表示将内部RAM地址30H的内容加载到累加器A中。

2、特殊功能寄存器(SFRs)

  • 80C51有一些特殊功能寄存器,用于控制单片机的各个功能,比如定时器、串口、I/O端口等。这些寄存器的地址范围通常为80H到FFH。例如,MOV A, P1可以直接访问端口P1。

需要注意的是,直接寻址不适用于外部RAM,因为外部RAM的地址需要通过间接寻址或使用数据指针寄存器(DPTR)来访问。

三、立即寻址与间接寻址

  • MOV A, 55H 将 内存地址 55H 中的内容加载到累加器 A。
  • MOV A, #55H 将 立即数 55H 直接加载到累加器 A。

四、寄存器寻址

MOV A, R0   ; 将寄存器R0中的数据加载到累加器A中

 指令将 R0 中的值传送到累加器 A 中。

MOV R1, A   ; 将累加器A中的数据存储到寄存器R1中

 指令将累加器 A 的值存储到寄存器 R1 中。

MOV R2, R1  ; 将寄存器R1中的数据传送到寄存器R2

指令将寄存器 R1 中的值复制到寄存器 R2 中。

 实际代码示例

ORG 0000H          ; 程序起始地址
START:             ; 程序标签
    MOV R0, #55H   ; 将立即数55H加载到寄存器R0中
    MOV A, R0      ; 将寄存器R0中的数据加载到累加器A中
    MOV R1, A      ; 将累加器A中的数据存储到寄存器R1中
    MOV P1, R1     ; 将寄存器R1的值输出到端口P1
    SJMP $         ; 无限循环,程序在此处停留

说明

  • ORG 0000H: 指示汇编器从地址 0000H 开始放置代码。
  • MOV R0, #55H: 将立即数 55H 加载到寄存器 R0。
  • MOV A, R0: 从寄存器 R0 中加载数据到累加器 A。
  • MOV R1, A: 将累加器 A 的数据存储到寄存器 R1。
  • MOV P1, R1: 将寄存器 R1 的值输出到端口 P1。
  • SJMP $: 使程序无限循环,防止继续执行未定义的代码。

五、寄存器间接寻址

MOV DPTR, #2000H  ; 将数据指针(DPTR)设置为内存地址2000H
MOVX A, @DPTR     ; 从内存地址(DPTR指向的地址)加载数据到累加器A
  • DPTR 是一个数据指针寄存器,它指向内存地址 2000H
  • MOVX A, @DPTR 指令将 DPTR 指向的内存地址的内容加载到累加器 A 中。
MOV DPTR, #2000H  ; 将数据指针(DPTR)设置为内存地址2000H
MOVX @DPTR, A     ; 将累加器A的值存储到DPTR指向的内存地址
  • MOVX @DPTR, A 指令将累加器 A 中的内容存储到 DPTR 指向的内存地址 2000H
ORG 0000H          ; 程序起始地址
START:             ; 程序标签
    MOV DPTR, #2000H  ; 将数据指针DPTR设置为2000H
    MOV A, #55H        ; 将立即数55H加载到累加器A
    MOVX @DPTR, A      ; 将累加器A的值存储到DPTR指向的内存地址2000H
    MOVX A, @DPTR      ; 从内存地址2000H加载数据到累加器A
    MOV P1, A          ; 将累加器A的值输出到端口P1
    SJMP $             ; 无限循环,程序在此处停留
  • ORG 0000H: 指示汇编器从地址 0000H 开始放置代码。
  • MOV DPTR, #2000H: 将数据指针 DPTR 指向内存地址 2000H
  • MOV A, #55H: 将立即数 55H 加载到累加器 A 中。
  • MOVX @DPTR, A: 将累加器 A 中的值存储到内存地址 2000H
  • MOVX A, @DPTR: 从内存地址 2000H 加载数据到累加器 A 中。
  • MOV P1, A: 将累加器 A 的值输出到 P1 端口。
  • SJMP $: 无限循环,程序停在此处,防止执行未定义的代码。

MOV与MOVX的区别

六、寄存器寻址和寄存器间接寻址

  • 寄存器寻址(Register Addressing):

    • 在这种寻址模式下,操作数直接存储在寄存器中,指令指定一个寄存器,处理器直接从这个寄存器中读取数据或将数据写入该寄存器。
    • 例子:MOV A, R0,将寄存器 R0 中的数据加载到累加器 A 中。
  • 寄存器间接寻址(Register Indirect Addressing):

    • 在这种寻址模式下,寄存器的内容被视为一个内存地址,指令指定一个寄存器,该寄存器的值指向要访问的数据的内存地址。
    • 例子:MOV A, @R0,从寄存器 R0 指向的内存地址加载数据到累加器 A 中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有名字的鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值