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,放在寄存器中效率高一点。 

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

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

相关文章

各类语言真实性能比较列表

这篇文章是我所做或将要做的所有真实世界性能比较的索引。如果你对想要看到的其他真实世界案例有建议,请在评论中添加。 用例 1 — JWT 验证 & MySQL 查询 该用例包括: 从授权头部获取 JWT验证 JWT 并从声明中获取电子邮件使用电子邮件执行 MySQL…

AI实践与学习1_Milvus向量数据库实践与原理分析

前言 随着NLP预训练模型(大模型)以及多模态研究领域的发展,向量数据库被使用的越来越多。 在XOP亿级题库业务背景下,对于试题召回搜索单单靠着ES集群已经出现性能瓶颈,因此需要预研其他技术方案提高试题搜索召回率。…

Fibonacci 数列与黄金分割

mapp[1 for item in range(30)] for item in range(3,30):mapp[item]mapp[item-1]mapp[item-2]pass numint(input()) if num>19:print("0.61803399")pass else:anss float((mapp[num]*1.0) / (mapp[num 1]*1.0))print(format(anss,.8f))进行短程的打表就可以看出…

hypermesh常用快捷键

#hypermesh常用快捷键

【Linux】-进程间通信-命名管道文件(没有关系的进程间进行通信),以及写一个日志模板

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

mfc140.dll是什么文件?如何修复mfc140.dll丢失的方法分享

​mfc140.dll丢失的原因 未正确安装Microsoft Visual C Redistributable:mfc140.dll是Visual C库的一部分,如果没有正确安装Visual C Redistributable,可能导致mfc140.dll丢失。 系统文件损坏:由于病毒感染、系统错误或其他原因…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

C语言入门笔记—static、extern、define、指针、结构体

一、static static修饰局部变量的时候,局部变量出了作用域,不销毁。本质上,static修饰局部变量的时候,改变了变量的存储位置。详见下图,当a不被static修饰和被static修饰的时候。 C/C static关键字详解&#xff…

Idea远程debug

Idea远程debug 一、方法 1.1、启动时加参数 java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar remote-debug-0.0.1-SNAPSHOT.jar1.2、运行时加参数 在没有显式-agentlib:jdwp参数的情况下进行远程调试: 首先,确保您的Sprin…

X3DAudio1_7.dll丢失原因,X3DAudio1_7.dll丢失怎样解决分享

X3DAudio1_7.dll是一款由微软公司开发的音频处理库,主要用于实现三维音频效果。这个库主要应用于游戏开发、多媒体应用等领域,它可以使得音频更加真实、自然地表现出空间感。如果在使用过程中遇到X3DAudio1_7.dll丢失的问题,可以尝试以下五个…

【Linux】第十九站:进程替换

文章目录 一、单进程版---最简单的程序替换二、进程替换的原理三、多进程的程序替换1.多进程的程序替换实例2.那么程序在替换时候有没有创建子进程呢3.再谈原理4.一个现象5.我们的CPU如何得知程序的入口地址? 四、各个接口的介绍1.execl2.execlp3.execv4.execvp5.ex…

认识.NET Aspire:高效构建云原生应用的利器

简介 在几天前的.NET 8发布会上,来自微软的Glenn Condron和David Fowler为我们演示了.NET Aspire,在Visual Studio的帮助下,它展现出了惊人的开发效率。 短短的十分钟内,David现场演示了如何轻松创建了一个具有服务发现&#xf…