欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 80C51单片机的寻址方式(汇编语言)

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

2025/2/24 10:22:28 来源:https://blog.csdn.net/Ljt030608/article/details/143372007  浏览:    关键词: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加载到累加器AMOV P1, A     ; 将A的值输出到端口P1SJMP $        ; 无限循环,程序在此处停留

二、直接寻址

2000H:MOV A,55H

指令解析

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

实际代码示例

ORG 2000H
START:MOV 55H, #0AH  ; 将立即数0AH存储到内存地址55HMOV 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的值输出到端口P1SJMP $         ; 无限循环,程序在此处停留

说明

  • 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设置为2000HMOV A, #55H        ; 将立即数55H加载到累加器AMOVX @DPTR, A      ; 将累加器A的值存储到DPTR指向的内存地址2000HMOVX A, @DPTR      ; 从内存地址2000H加载数据到累加器AMOV P1, A          ; 将累加器A的值输出到端口P1SJMP $             ; 无限循环,程序在此处停留
  • 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 中。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词