当前位置: 首页 > news >正文

《嵌入式硬件(六):ARM汇编核心内容总结》

一、ARM汇编指令

        1.move 

                move{s}<c> <rd>, <rm>

        2.add

                1)add{s}<c><rd>, <rn>,#<const>

add r0, r1, #1

                2)add{s}<c><rd>, <rn>, <rm> {,<shift>}

add r0, r1, r2

               3)add{s}<c><rd>, <rn>, <rm> , <type> <rs>

add r0, r0, r1, lsl, r1

        3.sub

                

           1)sub{s}<c><rd>, <rn>,#<const>

sub r0, r1, #1

            2)sub{s}<c><rd>, <rn>, <rm> {,<shift>}

sub r0, r1, r2

            3)sub{s}<c><rd>, <rn>, <rm> , <type> <rs>

sub r0, r0, r1, lsl, r1

tips:立即数(immediate)

        定义:指令中可以直接包含的常数

        1)数值范围在0~0xFF之间,这个数一定是立即数

        2)把数展开为二进制数,最高位及最低位之间的位数不能超过8

        3)把数展开位二进制数,右边0的个数,必须是偶数

110011111010

        在arm中存取数据,一个数占12个比特,但是arm为了让存的数字更大,将前四位设置为旋转位,现在后八位是0xFA,如果要存0xFA00,就要将当前的数字循环右移24次,旋转位填循环次数的1/2。

        当不是立即数时,但是又用到mov,此时编译器会自动调用mvn,mvn的存取方式是先对操作数按位取反再进行存取

        4.ldr

                ldr的作用是从ram或指定的地址加载数据到通用寄存器中

                ldr<c><rt>, [<rn>{,#+/-<imm12>}]

ldr r1, [r0]

                这行代码的作用是将r0寄存器的内容放到r1

tips:ram对内存的划分

0xFFFFFFFF-1
0x40001000
0x40000FFF
0x40000000
0x20000
0x1FFFF
0x00000000

0x00000000~0x1FFFF:代码区(nor flash)

0x40000000~0x40000FFF:片上RAM(变量存放)

其他空白空间:外设寄存器

        5.str

                str的作用是把通用寄存器中的数据加载到ram或指定的地址

str r1, [r0]

                这行代码的作用是将r1的内容写到r0中

        6.bic

                作用:指定位清零

                bic{s}<c> <rd>, <rn>, #<const>

        7.orr

                作用:指定位置一

                orr{s}<c> <rd>, <rn>, #<const>

        8.跳转

                b:跳转到标识符,不改变链接寄存器

                bl:跳转到标识符,改变链接寄存器

                bx:后面跟寄存器地址,作用是将这个地址装入pc

        9.stmfd

                入栈,保护现场 

                stmd<c> <rn> {!}, <registers>

                加上感叹号表示sp栈指针可变,registers表示用列表的形式写要保存的寄存器地址

        10.ldmfd

                出栈,恢复现场                

                ldmd<c> <rn> {!}, <registers>

                加上感叹号表示sp栈指针可变,registers表示用列表的形式写要保存的寄存器地址

        11.mrs

                读取某个特殊寄存器

                mrs<c> <rd>, <spec_reg>

        12.msr

                读取通用寄存器

                msr<c> <spec_reg>, <rd>

二、汇编模拟

        1.cpsr

nzcv

有符号时,结果为负的情况

下置一,正置零

结果为零,置一

无符号的情况下

进位置一,借位置零

有符号的情况下,俩个最高位位0的数相加结果为1,最高位为1相加0,置一

        作用:可以根据这四位实现c语言中if else的作用

        

加上后缀就可以实现    

三、函数调用

tips:栈

        空栈:入栈时,先入栈再挪

        满栈:入栈时,先挪再入栈

        增栈:入栈地址由低到高

        减栈:入栈地址由高到低

在keil中,

汇编调c

        1)保护现场

        2)import声明

        3)用r0~r3或者栈来传参

        4)bl跳转

        5)恢复现场        

c调汇编

        1)用extern声明

        2)函数调用(在keil下,需要在汇编里加export 函数名,来声明函数)

        3)靠r0把结果返回c,需要在汇编里面把结果写入r0

谁调用,谁保护恢复现场

四、代码

ldr pc, =_start_asm_maxmov r0, #0mov r1, #1stmfd sp!, {r0-r12, lr}bl _asm_minldmfd sp!, {r0-r12, lr}cmp r0, r1movge r2, r0movge r2, r1bx lr_asm_mincmp r0, r1movge r2, r1movge r2, r0mov r0, r2bx lr_startldr sp, =0x40001000
//调用汇编;stmfd sp!, {r0-r12, lr};bl _asm_max;ldmfd sp!, {r0-r12, lr}
//调用c程序import c_max	mov r0, #1mov r1, #2bl c_maxldr sp, =0x40001000sub sp, sp, #1024finishedb finishedend

sp需要布局,因为每个模式都有自己独立的sp


文章转载自:

http://8aMk8wWN.tqpds.cn
http://UrwNefrm.tqpds.cn
http://dNAqvQkn.tqpds.cn
http://e7KZyj1d.tqpds.cn
http://RqaFWwPE.tqpds.cn
http://Oo209he4.tqpds.cn
http://1OgCtwos.tqpds.cn
http://rKnbIj4t.tqpds.cn
http://lXVJX0Yb.tqpds.cn
http://aGdxFGxS.tqpds.cn
http://93D3S7c1.tqpds.cn
http://1DZskSSf.tqpds.cn
http://Re4WvuXd.tqpds.cn
http://ScW9ZKDq.tqpds.cn
http://wQq7GHmG.tqpds.cn
http://MfShyZuH.tqpds.cn
http://vZHYI3NK.tqpds.cn
http://shCmjTxX.tqpds.cn
http://kSM1RbmT.tqpds.cn
http://zke4GsMb.tqpds.cn
http://lx4x3h4Q.tqpds.cn
http://hKCv4ta1.tqpds.cn
http://UP6QWOcR.tqpds.cn
http://anAMSCg1.tqpds.cn
http://wYHXSC2T.tqpds.cn
http://52G6DtnR.tqpds.cn
http://hJk8naEY.tqpds.cn
http://hWNaRuxD.tqpds.cn
http://wyHkcfre.tqpds.cn
http://7iwKFiBx.tqpds.cn
http://www.dtcms.com/a/376310.html

相关文章:

  • 力扣刷题笔记-三数之和
  • WPF WriteableBitmap 高性能双缓冲图片显示方案
  • 如何优化WordPress中的图片提升网站性能
  • Word添加图/表题注
  • 十八、从0开始卷出一个新项目之瑞萨RZN2L使用ADC+DMA接收数据流
  • 日志文件-输出宏的实现
  • AI 帮我写单测:pytest 覆盖率提升 40% 的协作日志
  • RL【7-2】:Temporal-difference Learning
  • 50条常用的MySQL命令汇总
  • 宝塔SSL自动续签
  • Nginx SSL/TLS 配置
  • 剧本杀小程序系统开发:开启沉浸式社交娱乐新纪元
  • Nginx SSL 获取 SSL/TLS 证书(仅用于测试)
  • 激光频率梳 3D 轮廓测量 -- 平晶干涉法观察高精度平面度
  • HTTP快速入门
  • 【Unity UGUI 交互组件——Slider(7)】
  • Vue 3 实战:从零到一用 vue-pdf-embed 打造功能齐全的 PDF 查看器
  • Redis超详细入门教程
  • 单例模式(C++)详解(2)
  • 卷发棒/卷发梳MCU方案分析
  • vue3+TS项目配置unocss
  • 恒拓高科BeeWorks亮相鸿蒙 HEC 生态大会,重构数字化协作免费新体验
  • 抖音矩阵号管理+视频剪辑+智能体开发接入 SaaS源码
  • HarmonyOS 应用开发深度解析:驾驭 ArkTS 声明式 UI 与现代化状态管理
  • HarmonyOS之UIAbilityContext详解
  • HarmonyOS 应用开发深度解析:基于 Stage 模型的 ArkUI 声明式开发实践
  • 数学建模常用算法-模拟退火算法
  • 数据分析之Pandas入门小结
  • Maya绑定:变形器、高级复制、晶格
  • infinityfree 网页连接内网穿透 localtunnel会换 还是用frp成功了