单片机(学习)2024.10.9

 

目录

汇编整体分类

1.指令

2.伪操作

3.伪指令

汇编代码

汇编初始化

数据搬运指令

算术运算指令

加法

减法

乘法

比较指令

跳转指令

逻辑运算指令

与或,异或

左移右移

内存操作 LOAD/STORE 指令

CPU的栈机制

栈的概念

栈的种类

1.空栈(Empty)

2.满栈(Full)

栈的基本操作

PUSH/POP

栈的应用

叶子函数

非叶子函数


汇编整体分类

1.指令

        编译完生成一条机器码存储在内存单元当中,CPU执行时能完成对应的操作(类似于C中的语句)

2.伪操作

        伪操作(相当于c中的#的内容,告诉编译器怎么编译),不会生成机器码也不会占用内存,其作用是告诉编译器怎样编译(类似于C中的预处理指令)

3.伪指令

        伪指令不是指令,编译器在编译时将其替换成等效的指令 (如:cpu中没有乘法器,对应没有乘法指令,3*3 ---》用加法器实现3+3+3,替换实现)

汇编代码

汇编初始化

 AREA    STACK, NOINIT, READWRITE
__initial_spAREA    RESET, DATA, READONLY
__Vectors       DCD     __initial_spDCD     main              AREA    |.text|, CODE, READONLYENTRY
mainloopB loop                  END

1.AREA STACK, NOINIT, READWRITE: 这一行指定了一个名为STACK的内存区域,它用于存储堆栈。NOINIT表示这个内存区域在程序启动时不需要初始化,READWRITE表示这个内存区域可以被读取和写入。
2.__initial_sp: 这一行定义了一个名为`__initial_sp`的符号,它表示堆栈指针的初始值。在这里,它被定义为堆栈的起始地址。通常,这个符号会在链接脚本中进一步定义为实际的堆栈内存区域的起始地址。
3.AREA RESET, DATA, READONLY: 这一行指定了一个名为RESET的内存区域,用于存储重置向量表。DATA表示这个区域包含数据,READONLY表示这个区域只能被读取。
4.__Vectors DCD __initial_sp: 这一行定义了一个重置向量表,用于指示程序启动时应该执行的操作。`DCD`表示存储一个双字(32位)的数据。在这里,第一个双字存储的是堆栈指针的初始值,即__initial_sp。
5.DCD main: 这一行将程序的入口地址(main函数)添加到重置向量表中。这意味着程序在启动时将跳转到main函数开始执行。
6.AREA |.text|, CODE, READONLY: 这一行指定了一个名为.text的内存区域,用于存储代码。CODE表示这个区域包含代码,READONLY表示这个区域只能被读取。
7.ENTRY main: 这一行指定了程序的入口点为main函数。这意味着程序将从`main`函数开始执行。
8.loop B loop: 这一行是一个无限循环,它会不断地跳转到`loop`标签所在的位置,导致程序永远循环执行这条指令。
9.END: 这一行表示程序的结束。

数据搬运指令

改变PC的值实现程序跳转

 AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
main  
MOVS R0,#2
MOVS R1,R0
;改变PC的值实现程序跳转,0x08000008
;先把地址给一个寄存器,再把这个寄存器的值赋给PC
LDR R2,=0x08000008
MOV PC,R2
loop                 B loop                                   
END

算术运算指令

加法

    AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
main  
MOVS R0,#2
MOVS R1,R0
ADDS R3,R0,R1  ;R3=0X04
LDR R8,=0X01
ADD R8,R8,R3   ;R8=R8+R3 =0X05
loop                 B loop                                   
END

减法

    AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
main  
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
SUBS R2,R0,R1  ;R2=R0-R1
loop                 B loop                                   
END

乘法

    AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
main  
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
MULS R2,R0,R2  ;R2=R0*R2
loop                 B loop                                   
END

比较指令

跳转指令

    AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
JUMP
MOVS R0,#1
MOVS R2,#1
LDR R3,=0X0800001A
MOV PC,R3main  
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
CMP R0,R2  ;if(a==b)
BEQ JUMP  
MOVS R0,#3
loop                 B loop                                   
END
    AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
JUMP
MOVS R0,#1
MOVS R2,#1
MOV PC,LRmain  
MOVS R0,#2
MOVS R2,#2
MOVS R1,R0
BL JUMP
MOVS R0,#3
loop                 B loop                                   
END

逻辑运算指令

与或,异或

    AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRYmain  
MOVS R0,#2   ;R0:0010
MOVS R1,#1 ;R1:0001
ANDS R1,R1,R0   ;R1=R1&R0 R1=0000
EORS R1,R1,R0   ; 0010  0000  0010
loop                 B loop    END

左移右移

  AREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRYmain  
MOVS R0,#2   ;R0:0010  左移1位  0100--4
MOVS R1,#1 ;R1:1
LSLS R0,R0,R1
loop                 B loop    END

内存操作 LOAD/STORE 指令

CPU的栈机制

栈的概念

栈是一种具有特殊的访问方式的存储空间,特殊性就在于后进先出

栈的种类

1.空栈(Empty)

栈指针指向的地址是空的,在栈中存储数据时,可以直接存储,存储完成之后需要将栈指针再次指向空的位置。

EA:Empty Ascending 空增栈

ED:Empty Descending 空减栈

2.满栈(Full)

栈指针指向的地址有数据,在栈中存储数据时,需要先将栈指针,指向一个空的位置,然后在存储数据。

增栈(Ascending)

        栈指针向高地址方向移动

减栈(Descending)

        栈指针向低地址方向移动

FA:Full Ascending 满增

FD:Full Descending 满减

ARM默认采用的是满减栈

栈指针指向有数据的顶,接收数据时,栈指针先移动,再放数据。指针的移动是地址的降低

栈的基本操作

栈有两种基本的操作:入栈和出栈

1.入栈:将一个新的元素放到栈顶

2.出栈:从栈顶取出一个元素

栈顶元素总是最后一个入栈的,需要出的时候,又会是第一个被取出的

操作规则:LIFO后进先出

PUSH/POP

PUSH 入栈,压栈

POP 出栈,弹栈

//主程序给R1,R2,R3,R4分别存入:0x11111111 0x22222222 0x33333333 0x44444444然后跳入函数JUMP
//2.写一个函数JUMP,函数内修改R1为0x20000001 R3为0x00000000
//3.修改结束后返回主函数
//4.主函数再使R1和R3相加后存入R1跳出主程序进入死循环
//子程序返回主程序时,不可以使用MOV指令和B BL BX BXLAREA    STACK, NOINIT, READWRITE
__initial_sp                 AREA                 RESET, DATA, READONLY
__Vectors       DCD     __initial_sp                  DCD     main                               AREA    |.text|, CODE, READONLY                 ENTRY
main  ADD SP,SP,#0X100;上调栈指针LDR R1,=0X11111111;LDR R2,=0X22222222;LDR R3,=0X33333333;LDR R4,=0X44444444;BL JUMPADD R1,R1,R3B loop
JUMPPUSH {R0-R4,LR} ;保护现场LDR R1,=0X44324302;LDR R3,=0X33222055;POP{R0-R4,PC} ;恢复现场
loop                 B loop    
END

栈的应用

叶子函数

        叶子函数是指一个函数内部没有调用其他函数的函数,也就是说,它是程序调用树的末端节点,不依赖于其他函数。

非叶子函数

        非叶子函数是指一个函数内部调用了其他函数的函数,也就是说,它不是程序调用树的末端节点,可以被其他函数调用。

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

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

相关文章

Java生成Excel_低内存占用_更快

EasyExcel:高效Java Excel工具,解决大文件读写难题 EasyExcel是一个基于Java的、快速简洁且能有效解决大文件内存溢出问题的Excel处理工具。它使得用户可以在无需过多关注性能和内存消耗的情况下,轻松实现Excel文件的读写功能。相较于传统的…

无头浏览器测试:如何使用 Puppeteer 和 Browserless?

什么是无头浏览器测试? 无头浏览器测试通常指没有头的物体或东西,在浏览器的语境中,它指的是没有 UI 的浏览器模拟。无头浏览器自动化使用 Web 浏览器进行端到端测试,而无需加载浏览器的 UI。 无头模式是一个功能,它…

Canvas:AI协作的新维度

在人工智能的浪潮中,OpenAI的最新力作Canvas,不仅是一款新工具,它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面,让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…

Android targetSdkVersion 升级为34 问题处理

原因是发布到GooglePlay遭到拒绝,需要最低API level为34。之前为31,感觉还挺高的,但是GooglePlay需要的更高。 记录下处理问题: 1.升级gradle版本为8.0.2 之前是: classpath com.android.tools.build:gradle:7.1.0-…

sql注入第8关

手工注入麻烦 目录 判断闭合方式 判断注入类型 手工注入 1、获取数据库名 2、爆破数据库的名字(security) 3、爆破表的数量 4、判断表名的长度 5、判断表的列名数量 6、判断表的列名的名字 7、获取表的数据 8、判断数据的长度 9、判断数据的…

Golang | Leetcode Golang题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; func canIWin(maxChoosableInteger, desiredTotal int) bool {if (1maxChoosableInteger)*maxChoosableInteger/2 < desiredTotal {return false}dp : make([]int8, 1<<maxChoosableInteger)for i : range dp {dp[i] -1}var dfs …

点云深度学习模型PointNet

随着3D传感器&#xff08;如激光雷达、深度相机&#xff09;的广泛应用&#xff0c;点云数据已成为计算机视觉和机器人领域的重要数据形式。点云是一组在三维空间中具有 (x, y, z) 坐标的离散点的集合&#xff0c;用于表示物体的形状或场景。然而&#xff0c;由于点云的无序性、…

pycharm生成的exe执行后报错

元素 application 显示为元素 urn:schemas-microsoft-com:asm.v1^dependentAssembly (此版本的 Windows 不支持)的子元素。 日志名称: Application 来源: SideBySide 日期: 2024/10/8 14:14:12 事件 ID: 72 任务类别: 无 级别…

docker升级mysql

一、首选备份原数据库所有数据 二、在Docker中查看正在运行的MySQL容器名称&#xff0c;可以使用以下命令&#xff1a; docker ps --filter "namemysql" 三、查看当前docker中正在运行mysql的版本 docker exec -it qgz-mysql mysql -V 可以看到当前运行的版本是8.…

[C++]使用纯opencv部署yolov8-cls图像分类onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv8-cls图像分类ONNX模型涉及几个关键步骤。 首先&#xff0c;你需要将YOLOv8-cls模型从PyTorch格式转换为ONNX格式&#xff0c;这是为了确保模型在不同深度学习框架之间的互操作性。这个转换过程通常是通过ultralytics框架中的model.export…

大数据-158 Apache Kylin 安装配置详解 集群模式启动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

C++刷怪笼(7)string类

目录 1.前言 2.正文 2.1标准库中的string类 2.1.1string类 2.1.2auto和范围for 2.1.3string类的常用接口说明 2.2string类的模拟实现 2.2.1经典的string类问题 2.2.2浅拷贝 2.2.3深拷贝 ​编辑 2.2.4写时拷贝 3.小结 1.前言 前面我们对C的封装这一大特性进行了详细…

【Flutter、H5、Web?前端个人总结】分享从业经历经验、自我规范准则,纯干货

前言 hi&#xff0c;正式接触web前端已经经过了两年的时间&#xff0c;从大学的java后端转型到web前端&#xff0c;再到后续转战Flutter&#xff0c;逐渐对前端有了一些心得体会&#xff0c;其实在当下前端的呈现形式一直在变化&#xff0c;无论你是用原生、还是web还是混编的…

吸毛效果好的宠物空气净化器分享,希喂、霍尼韦尔、米家实测

说起宠物空气净化器&#xff0c;几年前我可能会一脸鄙夷&#xff1a;为啥要花这种智商税冤枉钱&#xff1f; 直到之前养了一只猫&#xff0c;被家中乱飞的浮毛和滂臭的异味搞到头晕&#xff0c;于是作为i一个养宠的家电测评博主&#xff0c;索性对宠物空气净化器这玩意做了超级…

如何在银河麒麟服务器中获取关键日志信息

如何在银河麒麟服务器中获取关键日志信息 1、获取messages日志2、获取dmesg输出 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟服务器中&#xff0c;获取messages和dmesg日志是排查问题的重要步骤。 1、dmesg命令用于显示或控制…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统&#xff0c;其架构具有以下特点&#xff1a; 一、客户端/服务器架构 客户端 客户端可以是各种应用程序&#xff0c;如 Web 应用、桌面应用等&#xff0c;它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

学习 PostgreSQL + Spring Boot 3 +mybatisplus整合过程中的报错记录

今天计划学习 PostgreSQL&#xff0c;并顺便尝试使用 Spring Boot 3.x 框架&#xff0c;打算整合 Spring Boot 3、PostgreSQL 和 MyBatis-Plus。整合后一直出现以下报错&#xff1a; 去AI上面搜了讲的是sqlSessionFactory 或 sqlSessionTemplate 没有正确配置 初始分析&#…

03 django管理系统 - 部门管理 - 部门列表

部门管理 首先我们需要在models里定义Dept类 # 创建部门表 class Dept(models.Model):name models.CharField(max_length100)head models.CharField(max_length100)phone models.CharField(max_length15)email models.EmailField()address models.CharField(max_length2…

【2024年10月测试通过】conda下使用虚拟环境安装最新版pytorch2.4+cuda12.4

开头先说重点&#xff1a; 1.采用conda的虚拟环境&#xff0c;会在沙盒环境下安装好所有所需包&#xff0c;而且该虚拟环境拷贝给其他人员可以直接用&#xff0c;很方便。 2.pytorch官网访问不了&#xff0c;有一个国内镜像推荐&#xff0c;地址为PyTorch - PyTorch 中文 3.…

怎么ping网络ip地址通不通

怎么Ping网络IP地址通不通&#xff1f;要检查网络中的IP地址是否连通&#xff0c;可以使用‌Ping命令。Ping命令通过发送ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制消息协议&#xff09;Echo请求报文并等待回应&#xff0c;来判断目标主机是否可…