ARM嵌入式学习--第三天

ARM常用伪指令分析

    ARM伪指令:为了方便程序员使用,编译器设计的指令,这个指令ARM核无法识别,需要编译器对它翻译成ARM核所识别的指令

-LDR  R1,=0xabcdef分析

总结

    编译器在编译的时候,将ldr  r1,=0xabcdef翻译成了ldr  r1,[pc,#0x0004]这一条读内存的指令,根据PC的值加上偏移量算出0xabcdef这个数据在内存的地址,然后使用ldr指令读取这个地址的数据

-LDR  R1,=label分析

 总结:

    LDR  r1,=label指令表示将lable的地址写入r1label的地址由指定的代码段运行地址来决定

        编译器做法:

            1.首先根据指定的代码段开始的地址,,算出label标签对应的地址值

            2.然后将这个表示的地址值放在一个位置

            3.生成内存访问指令,根据pc+固定偏移量,找到标签对应地址存放的位置

        注意:

           当代码编译结束的时候,标签表示的地址值(根据指定的代码段地址)已经编译死存放在程序文件中了

-LDR  R1,label分析

LDR  R1,label表示读取label表示的地址对应的数据

-ADR  R1,label分析

ADR  R1,label指令表示根据当前的pc的值+/-偏移量,动态获取当前label所表示的内存地址) 

 

-如何判别代码在实际内存中运行的地址?

    ADR  R0,_start可以知道因为他是根据pc的值,动态获取

    LDR  R0,=_start无法知道这条指令不论在哪里运行,R0的值都是固定的取决于指定的链接地址

 

ATPCS标准

    ATPCSARM-Thumb的程序调用标准

    规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的使用规则,有了这些规则之后,单独编译的C语言程序就可以和汇编语言相互调用

 

-寄存器的使用规则

    1.子程序间通过寄存器R0~R3传递参数(可记为:a0~a3

    (被调用的子程序在返回前无需恢复寄存器R0~R3的内容

    2.子程序间通过寄存器R4~R11保存局部变量(可记为:v1~v8

    (如果在子程序中使用了寄存器的值,则子程序进入时必须保存这些寄存器的值,在返回前必须回复这些寄存器的值在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量)     

    3.寄存器R12用作过程调用中间临时寄存器,记作IP

    (常用于子程序之间的链接代码段

    4.寄存器R13用作堆栈指针,记作SP

    (在子程序中寄存器R13不能用作其他用途,寄存器SP在进入子程序时的值和退出子程序的值必须相等

    5.寄存器R14称为连接寄存器,记作LR它用于保存子程序的返回地址

    6.寄存器R15称为程序计数器,记作PC,它不能用作其他用途

 

-参数传递规则

    函数间传递参数的时候,当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,使用堆栈来传递参数

在传递参数时,将所有参数看作是存放在连续的内存单元的子数据,然后,依次将各字数据传递到寄存器R0,R1,R2和R3中,如果参数多于4个,则将剩余的字数据传递到数据栈中入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈

 

-子程序结果返回规则

    1.结果为一个32位整数时,可以通过寄存器R0返回

    2.结果为一个64位整数时,可以通过寄存器R0和R1返回

    3.结果为一个浮点数时,可以通过浮点计算部件的寄存器f0、d0或s0来返回

    4.结果为复合型浮点数(如复数)时,可以通过寄存器f0~fn或d0~dn来返回

 

-栈帧分析

    栈桢概念

        1.栈桢是一块因函数运行而临时开辟的空间

        2.每调用一个函数就会创建一个独立栈桢

        3.栈桢中存放的是函数中的必要信息局部变量,函数传参,返回值

        4.当函数运行完毕栈桢会销毁

 上图描述的是ARM的栈桢布局方式main  stack  frame调用函数的栈桢func  stack  frame为当前函数(被调用者)的栈桢栈底在高地址,栈向下增长

图中FP就是栈基址它指向函数的栈桢起始地址SP则是函数的栈指针它指向栈顶的位置

ARM压栈的顺序依次为当前函数指针PC、返回指针LR、栈指针SP,传入参数个数及指针、本地变量和临时变量

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

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

相关文章

深入拆解TomcatJetty(一)

深入拆解Tomcat&Jetty(一) 专栏地址:https://time.geekbang.org/column/intro/100027701 1、Web容器是什么 早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返…

008、相交链表

0、题目描述 相交链表 1、法1 嵌套循环,从listA的第一个节点开始与listB的每个节点比对,有相同的就返回这个节点。 时间复杂度是n^2 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* pa …

多媒体(1)

多媒体 多媒体的信息结构是【非线性的网状结构】 多媒体技术的基本特征:集成性、交互性、实时性、数字化、多样性 多媒体数据具有【数据量大】、【数据类型多】、【数据类型间区别小】、【输入输 出复杂】的特点 在多媒体数据库中,基于内容检索的关键技术…

智联云采 SRM2.0 testService SQL注入漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案,针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

【AI绘画】Midjourney进阶:引导线构图详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯什么是构图为什么Midjourney要使用构图 💯引导线构图特点使用场景提示词书写技巧测试 💯小结 💯前言 【AI绘画】Midjourney进阶&a…

嵌入式职业规划

嵌入式职业规划 在嵌入式的软件开发中,可以分为: 嵌入式MCU软件开发工程师; 嵌入式Linux底层(BSP)软件开发工程师; 嵌入式Linux应用开发工程师; 嵌入式FPGA算法开发工程师 对于前两个阶段 …

【时间之外】IT人求职和创业应知【9】

目录 1. 云计算ETF领涨,中证云计算与大数据主题指数估值较低 2. 南向资金持有海螺创业市值减少,但仍保持高比例持股 3. 深创赛澳大利亚分站赛落幕,龙岗区与3个意向落地项目签约 认知决定你的赚钱能力。以下是今天可能影响你求职和创业的热点新闻: 今日关键字:数字战争…

ChatGPT官方自带的测试页面 Playground

Playground页面相当于是网页端的大模型调用应用,可以在这里直接选择不同类型模型、选择不同的参数、输入不同的提示测试模型输出结果,并且这个页面还可以查看网页端操作对应的代码,整体操作流程非常便捷,也非常适合初学者进行零代…

UE5 猎户座漂浮小岛 02 模型 地形

UE5 猎户座漂浮小岛 02 模型 地形 1.模型 1.1 导入 1.2 统一模型比例 1.3 添加碰撞体 2.地形 2.1 地 2.2 山体 2.3 海洋 2.4 花草

关于武汉芯景科技有限公司的限流开关芯片XJ6288开发指南(兼容SY6288)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.EN引脚控制IN和OUT引脚的通断 2.OCB引脚指示状态 3.过流自动断开

Java基于SSM框架的教学辅助微信小程序【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本

本文为系列测试文章,拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群(一)、生成自签名证书 构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容…

hdfs的客户端(big data tools插件)

1.下载hadoop的压缩包在Windows,后解压 2.下载hadoop.dll文件和winutil.exe文件(网上自行查找) 下载完把这两个文件放入hadoop的bin目录 3.设置环境变量: $HADOOP_HOME指向hadoop的文件夹 4.在jetbrains公司的软件里下载big data tools插件:(在此展示的idea的) 下载完重启ide…

1.ubuntu下安装noetic

1.首先安装常规手段安装乌班图系统 2.开始ROS 系统安装 1. 设置编码 $ sudo apt update && sudo apt install locales $ sudo locale-gen en_US en_US.UTF-8 $ sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 $ export LANGen_US.UTF-82.添加源 $ sudo ap…

OpenMediaVault安装插件以及重置web控制台密码

常用插件(可根据实际情况选择安装) openmediavault-flashmemory:加载临时文件到内存,保护硬盘;openmediavault-fail2ban :扫描日志文件并禁止显示恶意迹象的IP-太多的密码错误,寻找漏洞等&…

【YOLOv11】制作使用YOLOv11的docker环境

目录 一 安装docker 1 安装依赖 2 添加docker官网 GPG 密钥、设置stable 仓库 3 安装 4 使用 二 环境制作 ① 拉基础镜像 ② 起容器 ③ 安装Anaconda3 ④ 安装YOLO11 ⑤ /root/.bashrc ⑥ 退出容器 ⑦ 保存镜像 ⑧ 镜像的使用 一 安装docker ubuntu:20.04 1 安装…

C语言复习第4章 数组

目录 一、一维数组的创建和初始化1.1数组的创建1.2 变长数组1.3 数组的初始化1.4 全局数组默认初始化为01.5 区分两种字符数组1.6 用sizeof计算数组元素个数1.7 如何访问数组元素1.8 一维数组在内存中的存储(连续存储)1.9 访问数组元素的另一种方式:指针变量1.10 数组越界是运行…

手机淘宝自动下单退货自动化RPA脚本机器人

使用手机集线器连接多个手机并发运行。 脚本分3个部分(读取本地连接下单,退货获取退货地址信息,填写快递单号) 脚本部分图结构看下面的图片 部分数据统计展示

MATLAB支持的字体

listfonts 列出可用的系统字体 {Adobe Devanagari } {Agency FB } {Algerian } {AlienCaret } {AMS } {Arial } {Arial Black …

linux模拟:chrony同步时间

实验材料: 服务器:linux,红帽-9.1 客户端:linux,乌班图-18.4 Server/client; 安装chrony yum install -y chrony 查看chrony的状态: systemctl status chronyd 服务器: 在/etc/chrony.conf文件里面…