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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宠物空气净化器有用吗?有哪几款吸毛效果好且低噪的推荐

伴随着天气越来越凉,照常来说,猫咪掉毛的频率应该会变少,但是为什么我家的猫咪还在掉很多毛。 现在就连南方地区都要加外套了,但是猫咪掉毛太多,都不敢穿纯棉面料的衣服,还有本来想着顺应天气的变化&#…

100种算法【Python版】第24篇——Bellman-Ford算法

本文目录 1 算法原理2 路径计算的实现步骤3 python代码4 算法应用1 算法原理 Bellman-Ford算法由美国计算机科学家理查德贝尔曼(Richard Bellman)和洛伊德福特(Lloyd Ford)于1958年提出。最初设计用于解决图论中的单源最短路径问题,尤其适用于含有负权边的图。该算法的提…

深入理解C++ Lambda表达式:语法、用法与原理及其包装器的使用

深入理解C Lambda表达式:语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind 🌏个人博客主页: 个人主页 本文深入介绍了…

2024最新Instagram养号攻略!海外社媒起号码住了

Instagram至今仍然是全球顶级的流量平合,不仅在国外是各大网红明星必备app,国内下载量也居高不下,但从2018年下半年开始加大了对新账号的监控和权限限制。新注册的账号会受到诸多限制,稍不慎就会进入安全模式或者被封,…

【vue】10.组件的生命周期-从Vue 2到Vue 3的演变

自Vue 2发布以来,它以其简单易用、灵活高效的特点赢得了众多开发者的喜爱。随着时间的推移,Vue 3在Vue 2的基础上进行了全面升级,其中包括对组件生命周期的调整。本文将首先回顾Vue 2的组件生命周期,然后重点介绍Vue 3组件生命周期…

STM32 HAL 点灯

首先从点灯开始 完整函数如下: #include "led.h" #include "sys.h"//包含了stm32f1xx.h(包含各种寄存器定义、中断向量定义、常量定义等)//初始化GPIO口 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开…

计算合约方法的签名

计算合约方法的签名 通过智能合约实现 // SPDX-License-Identifier: MIT pragma solidity ^0.8.26;contract FunctionSelector {/*"transfer(address,uint256)"0xa9059cbb"transferFrom(address,address,uint256)"0x23b872dd*/function getSelector(stri…

【Java】方法的使用 —— 语法要求、方法的重载和签名、方法递归

目录 1. 方法基础知识 1.1 方法的概念 1.2 语法格式 * 注意事项【与C不同】 1.3 return —— 返回值的严格检查【比C语言严格】 2. 形参与实参的关系 3. 方法重载 3.1 什么是方法重载?为什么要方法重载? 3.2 方法重载的规则 4. 方法签名 5. 递…

鸿蒙开发:arkts Refresh 组件

基本概念 在 ArkTS 5.0 中,Refresh组件是用于实现下拉刷新功能的重要元素。它为用户提供了一种直观的方式来获取最新的数据。当用户在界面上对Refresh组件所在的区域进行下拉操作时,如果满足一定的触发条件,就会触发刷新事件,从而…

ClickHouse 神助攻:纽约城市公共交通管理(MTA)数据应用挑战赛

本文字数:13198;估计阅读时间:33 分钟 作者:The PME Team 本文在公众号【ClickHouseInc】首发 我们一向对开放数据挑战充满热情,所以当发现 MTA(城市交通管理局)在其官网发起了这样的挑战时&…

HarmonyOS开发5.0 net 启动界面设置

第一步、创建我们界面 第二步, 在EntryAbility中配置启动页面,在entry/src/main/ets/entryability/EntryAbility.ets中配置启动页面 配置如下 至此大功告成

算法笔记day10

目录 1.牛牛冲钻五 2.最长无重复子数组_牛客题霸_牛客网 3.重排字符串 1.牛牛冲钻五 算法思路&#xff1a; 特别简单的模拟题&#xff0c;没什么说的。 #include <iostream> #include <vector> #include <string> using namespace std; int main() { …

ETF申购赎回指南:详解注意事项与低费率券商推荐!

​ETF 申购&赎回 ETF申购赎回是个啥业务&#xff1f; 01 ETF申购、赎回是一种交易委托方式&#xff0c;指投资者通过申购方式(买入方向)获得ETF份额&#xff0c;通过赎回的方式&#xff08;卖出方向&#xff09;换掉/卖出ETF份额。ETF申购&#xff0c;通常是通过一篮子成…

LinkedList和链表之刷题课(下)

1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…

近似线性可分支持向量机的原理推导

近似线性可分的意思是训练集中大部分实例点是线性可分的&#xff0c;只是一些特殊实例点的存在使得这种数据集不适用于直接使用线性可分支持向量机进行处理&#xff0c;但也没有到完全线性不可分的程度。所以近似线性可分支持向量机问题的关键就在于这些少数的特殊点。 相较于…

UI 组件的二次封装

UI 组件的二次封装是指&#xff0c;在基础 UI 库的组件上进行自定义封装&#xff0c;以实现更贴合业务需求的功能和样式。通过二次封装&#xff0c;可以增强组件的复用性、便捷性和一致性&#xff0c;简化业务代码&#xff0c;同时降低后续维护成本。 1. 二次封装的原理 二次…

ELK + Filebeat + Spring Boot:日志分析入门与实践(二)

目录 一、环境 1.1 ELKF环境 1.2 版本 1.3 流程 二、Filebeat安装 2.1 安装 2.2 新增配置采集日志 三、logstash 配置 3.1 配置输出日志到es 3.2 Grok 日志格式解析 3.2 启动 logstash ​3.3 启动项目查看索引 一、环境 1.1 ELKF环境 springboot项目&#xff1a;w…

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条&#xff0c;清洗后&#xff0c;90条正确数据在DWD层清洗表&#xff0c;10条错误数据在DWD层清洗数据错误表&#xff0c;所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是&#xff0c;Hive中原本的SQL语句&#xff0c;放在ClickHouse…

Mysql通过zip安装使用

文章目录 MySQL安装步骤‌下载MySQL安装包‌解压并配置‌环境变量‌初始化并启动数据库‌MySQL配置步骤验证安装是否成功‌ MySQL重新启动Linux系统windows系统 MySQL安装步骤‌ 下载MySQL安装包‌ 访问MySQL官方网站&#xff08;https://dev.mysql.com/downloads/&#xff0…

串口读数据无法获取的原因

一般无法读取导数据,通常是读数据时间设定有问题,通过修改设定时间就可以轻松读取数据. BOOL OpenComPort(const int port,int flag) { CString strComCode; strComCode.Format(_T(“COM%d”),port); hComCreateFile(strComCode,//COM1口 GENERIC_READ|GENERIC_WRITE, //允许读…