lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7
目录
1 伪指令
2 伪操作
3 C和汇编的混合编程
4 ATPCS协议
1 伪指令
本身不是指令,编译器可以将其替换成若干条等效指令
@ 空指令NOP@ 指令LDR R1, [R2]@ 将R2指向的内存空间中的数据读取到R1寄存器@ 伪指令LDR R1, =0x12345678@ R1 = 0x12345678 @ LDR伪指令可以将任意一个32位的数据放到一个寄存器LDR R1, =STOP@ 将STOP表示的地址写入R1寄存器@ LDR R1, STOP@ 将STOP地址中的内容写入R1寄存器
2 伪操作
不会生成代码,只是在编译之前告诉编译器怎么编译
@ GNU的伪操作一般都以‘.’开头@ .global symbol@ 将symbol声明成全局符号@ .local symbol@ 将symbol声明成局部符号@ .equ DATA, 0xFF@ MOV R1, #DATA@ 相当于define@ .macro FUNC@ MOV R1, #1@ MOV R2, #2@ .endm@ FUNC@ .macro 相当于函数封装@ .if 0@ MOV R1, #1@ MOV R2, #2@ .endif@.rept 3@ MOV R1, #1@ MOV R2, #2@.endr@ .weak symbol@ 弱化一个符号,即告诉编译器即便没有这个符号也不要报错@ .weak func@ B func@ .word VALUE@ 在当前地址申请一个字的空间并将其初始化为VALUE@ MOV R1, #1@ .word 0xFFFFFFFF@ MOV R2, #2@ .byte VALUE @ 在当前地址申请一个字节的空间并将其初始化为VALUE@ MOV R1, #1@ .byte 0xFF@ .align N@ 告诉编译器后续的代码2的N次方对其@ .align 4@ MOV R2, #2@ .arm@ 告诉编译器后续的代码是ARM指令@ .thumb@ 告诉编译器后续的代码是Thumb指令@ .text @ 定义一个代码段@ .data @ 定义一个数据段@ .end 之前的代码都是汇编代码@ .space N, VALUE@ 在当前地址申请N个字节的空间并将其初始化为VALUE@ MOV R1, #1@ .space 12, 0x12@ MOV R2, #2@ 不同的编译器伪操作的语法不同
rept示例

.word示例

.byte示例

.align 2代表对齐,2代表2的2次方对齐,即4的整数倍。如果3代表8的整数倍。

3 C和汇编的混合编程
通用寄存器指令
- 1、数据处理指令
- 2、跳转指令
- 3、内存读写指令load
Arm专用指令,不会有C语言与之对应
- 4、CPSR
- 5、SWI
- 6、协处理器指令
上电的第一段代码都是用汇编写的。
@ C和汇编的混合编程原则:在哪种语言环境下符合哪种语言的语法规则@ 1. 在汇编中将C中的函数当做标号处理@ 2. 在C中将汇编中的标号当做函数处理@ 3. 在C中内联的汇编当做C的语句来处理@ 1. 方式一:汇编语言调用(跳转)C语言@ MOV R1, #1@ MOV R2, #2@ BL func_c @func_c用c写,最后会通过LR跳转回来,不写括号@ MOV R3, #3@ 2. 方式二:C语言调用(跳转)汇编语言@ .global FUNC_ASM @必须加.global否则c文件中不认识
@ FUNC_ASM:@ MOV R4, #4@ MOV R5, #5void func_c(void){int a;a ++;//C语言调用(跳转)汇编语言FUNC_ASM(); //需要括号a --;}@ 3. C内联(内嵌)汇编/*
void func_c(void)
{int a;a ++;//C内联(内嵌)汇编asm("MOV R6, #6\n""MOV R7, #7\n");//C语言调用(跳转)汇编语言FUNC_ASM();a --;
}
*/
4 ATPCS协议
@ ATPCS协议主要内容 @ 1.栈的种类@ 1.1 使用满减栈@ 2.寄存器的使用@ 2.1 R15用作程序计数器,不能作其他用途 @ 2.2 R14用作链接寄存器,不能作其他用途@ 2.3 R13用作栈指针,不能作其他用途@ 2.4 当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递@ 2.5 函数的返回值使用R0传递@ 2.6 其它寄存器主要用于存储局部变量


总结,参数尽量小于3,放在寄存器中效率高一点。
相关文章:
lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7
目录 1 伪指令 2 伪操作 3 C和汇编的混合编程 4 ATPCS协议 1 伪指令 本身不是指令,编译器可以将其替换成若干条等效指令 空指令NOP 指令LDR R1, [R2] 将R2指向的内存空间中的数据读取到R1寄存器 伪指令LDR R1, 0x12345678 R1 0x12345678 LDR伪指令可以将任…...
北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 二.管脚分配 三.实现过程讲解及效…...
麒麟系统安装找不到安装源!!!!设置基础软件仓库时出错
记录--华为RH2288 V3服务器安装麒麟系统遇到的问题 1.遇到的问题--“设置基础软件仓库时出错”报错导致无法继续安装 没办法下一步 先说结论:系统bug 该问题在CentOS、Rocky Linux最新版中均存在 解决: (一)、如果是外网直接配…...
代码随想录算法训练营第三十九天【动态规划part02】 | 62.不同路径、63. 不同路径 II
62.不同路径 题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 求解思路: 动规五部曲 确定dp数组及其下标含义:dp[i][j] 表示从(0,0)出发,到(i,j&#x…...
鸿蒙4.0开发笔记之DevEco Studio如何使用Previewer窗口预览器(一)
一、预览器作用 DevEco Studio预览器概况在HarmonyOS应用开发过程中,通过使用预览器,可以查看应用的UI效果,方便开发者实时查看应用的运行效果,随时调整代码。 二、打开Previewer预览器 1、正常启动 打开预览器的位置在DevEco…...
音视频转换软件Permute mac中文板特点介绍
Permute mac是一款Mac平台上的媒体格式转换软件,由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式,并提供了一些常用工具以便于用户进行编辑和处理。 Permute mac软件特点 - 支持大量格式:支持几乎所…...
前端uniapp列表下拉到底部加载下一页列表【下拉加载页面/带源码/实战】
目录 一. 图片1.2. 二.list.vue三.uni-load-more.vue最后 一. 图片 1. 2. 二.list.vue <template><view><!--列表--><scroll-view scroll-y"true" class"scroll-Y" :style"height: scrollviewHigh px;" lower-threshol…...
超聚变服务器关闭超线程CPU的步骤(完整版)
前言: 笨鸟先飞,好记性不如烂笔头。 我们项目都用不到超线程CPU,所以调测设备的时候都需要关掉,最近新设备换成了超聚变的服务器,这篇记录我关闭(超聚变)服务器超线程CPU的方法步骤。 关闭超线程CPU的步骤…...
智能驾驶汽车虚拟仿真视频数据理解(一)
赛题官网 datawhale 赛题介绍 跑通demo paddle 跑通demo torch 提交的障碍物取最主要的那个?不考虑多物体提交。障碍物,尽可能选择状态发生变化的物体。如果没有明显变化的,则考虑周边的物体。车的状态最后趋于减速、停止,时序…...
事关Django的静态资源目录设置(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)
在Django的setting.py中常见的三句静态资源(static)目录设置语句如下: STATICFILES_DIRS [os.path.join(BASE_DIR, static)] STATIC_ROOT os.path.join(BASE_DIR, static) STATIC_URL /static/下面介绍这三句话的作用。 首先说第1句和第2句: STATI…...
Vue.js2+Cesium1.103.0 十四、绘制视锥,并可实时调整视锥姿态
Vue.js2Cesium1.103.0 十四、绘制视锥,并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"><divclass"control"style"position: absolute;right: 50px;top: 50px…...
批量替换WordPress文章内图片链接
在WordPress使用过程中,如果中途更换了域名,原先文章内的图片使用的是原来的域名,就会造成文章页里面的图片链接无法显示。如果从后台文章挨个修改就比较麻烦。可以通过数据库进行批量替换即可。 使用 PHPMyadmin 打开 数据库,登…...
关于DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC的一些发现
任务在哪 这个是11g以后的自动收集统计信息的后台任务,10g之前是在dba_scheduler_jobs里查看 SQL> SELECT CLIENT_NAME ,STATUS ,MEAN_INCOMING_TASKS_7_DAYS,MEAN_INCOMING_TASKS_30_DAYS FROM DBA_AUTOTASK_CLIENT WHERE…...
MatrixOne 支持多样化生态工具
近日,云原生数据库 MatrixOne 支持多样化生态工具,包括:数据集成工具、BI 工具和数据计算引擎这三类生态工具。 云原生数据库使得传统数据库得以充分结合云服务的免运维、高弹性、高可扩展、高可用、高性价比优势,又顺应了云端应…...
力扣刷题篇之位运算
系列文章目录 目录 系列文章目录 前言 一、位运算的基本运算 二、位运算的技巧 三、布隆过滤器 总结 前言 本系列是个人力扣刷题汇总,本文是数与位。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode࿰…...
asp.net core mvc 控制器使用配置
一、在根目录 添加 mysettings.json 文件 mysettings.json 文件代码如下: {"MySettings": {"Name": "独立配置文件","Site": "lt"} }appsettings.json 文件代码如下: {"Logging": {&quo…...
Hadoop学习总结(MapRdeuce的词频统计)
MapRdeuce编程示例——词频统计 一、MapRdeuce的词频统计的过程 二、编程过程 1、Mapper 组件 WordcountMapper.java package com.itcast.mrdemo;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; …...
PPT基础入门
目录 相关设置快捷键shift 快捷键Ctrl 快捷键Ctrl Shift 组合快捷键快捷键总结 相关设置 设置撤回次数 自动保存 图片压缩 字体嵌入:目的是在不同的电脑上保留已经设置好的字体 多格式导出 (1)可以导出PDF (2)可以导…...
Java 语言关键字有哪些
Java 语言关键字有哪些 分类关键字访问控制privateprotectedpublic类,方法和变量修饰符abstractclassextendsfinalimplementsinterfacenativenewstaticstrictfpsynchronizedtransientvolatileenum程序控制breakcontinuereturndowhileifelseforinstanceofswitchcase…...
Go vs Rust:文件上传性能比较
在本文中,主要测试并比较了Go—Gin和Rust—Actix之间的多部分文件上传性能。 设置 所有测试都在配备16G内存的 MacBook Pro M1 上执行。 软件版本为: Go v1.20.5Rust v1.70.0 测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
