ARM裸机-9

news2024/11/15 12:23:10

1、ARM汇编指令集

1.1、两个概念:指令与伪指令

        (汇编) 指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。

        (汇编)伪指令本质上不是指令 (只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。

1.2、两种不同风格的ARM指令

        ARM官方的ARM汇编风格::指令一般用大写、Windows中IDE开发环境 (如ADS、MDK等) 常用。如:LDR RO,[R1]。

        GNU风格的ARM汇编::指令一般用小写字母、linux中常用。如::ldr ro,[r1]。

1.3、ARM汇编特点

1.3.1、LDR/STR架构

        ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。

        ldr (load register) 指令将内存内容加载入通用寄存器。

        str (store register) 指令将寄存器内容存入内存空间中。

        ldr/str组合用来实现 ARM CPU和内存数据交换。

1.3.2、8种寻址方式

        寄存器寻址                                                                mov r1, r2

        立即寻址                                                                   mov r0,#OxFF00

        寄存器移位寻址                                                        mov r0, r1, Isl #3

        寄存器间接寻址                                                        ldr r1, [r2]

        基址变址寻址                                                            ldr r1, [r2, #4]

        多寄存器寻址                                                            ldmia r1!, {r2-r7, r12}

        堆栈寻址                                                                   stmfd sp!, {r2-r7, lr}

        相对寻址                                                                   flag:beq flag

1.3.3、指令后缀

同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:

        B (byte) 功能不变,操作长度变为8位

        H (half word)功能不变,长度变为16位

        S(signed)功能不变,操作数变为有符号

        例如:ldr ldrb ldrh ldrsb ldrsh

        S(S标志)功能不变,影响CPSR标志位。

        例如:mov和movs

1.3.4、条件执行后缀

1.3.5、多级指令流水线

        为增加处理器指令流的速度,ARM使用多级流水线,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级)

        - 允许多个操作同时处理,而非顺序执行。

        PC指向正被取指的指令,而非正在执行的指令。 

1.4数据传输和跳转指令集

1.4.1、数据处理指令

        数据传输指令                                         mov mvn

        对比:mov是原封不动的传递,而mvn是按位取反后传递

        算术指令                                                add sub rsb adc sbc rsc

        逻辑指令                                                and orr eor bic

        比较指令                                                cmp cmn tst teq

        对比:比较指令用来比较两个寄存器中的数;比较指令不用后加s后缀就可以影像CPSR中的标志位。

        乘法指令                                                mvl mla umull umlal smull smla  

        前导零计数                                            clz

1.4.2、CPSR访问指令

        mrs&msr

        mrs用来读psr,msr用来写。

        CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

1.4.3、跳转(分支)指令

        b & bl & bx

        b 直接跳转 (就没打开算返回)

        bl(branch and link),跳转前把返回地址放入lr中,以便返回,以便用于函数调用

        bx跳转同时切换到ARM模式,一般用于异常处理的跳转

1.4.4、访存指令

        ldr/str & ldm/stm & swp

        单个字/半字/字节访问 ldr/str

        多字批量访问 Idm/stm

        swp r1, r2, [r0]

        swp r1, r1, [r0]

1.4.5、立即数

        在数字之前要加#,机器才知道这是个数字

        合法立即数与非法立即数

        ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分。

        合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数。

1.4.6、软中断指令

        swi(software interrupt)

        软中断指令用来实现操作系统中系统调用

1.5、协处理器和协处理器指令

1.5.1、什么是协处理器

        SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。

        ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15(cp:coprocessor)。

        协处理器和MMU、cache、TLB等处理有关功能上和操作系统的虚拟地址映射、cache管理等有关。

1.5.2、协处理器cp15操作指令

        mcr & mrc

        mrc用于读取CP15中的寄存器

        mcr用于写入CP15中的寄存器

1.5.3、mrc & mcr的使用方法

mcr{<cond>} p15,<opcode_1>,<Rd>,<Crn>,<Crm>,{<opcode_2>}
//opcode_1:对于cp15永远为0
//Rd:ARM的普通寄存器
//Crn: cp15的寄存器,合法值是c0~c15
//Crm: cp15的寄存器,一般均设为c0
//opcode_2:一般省略或为0

1.5.4、协处理器学习要点

        不必深究,将uboot中和kernel中起始代码中的一般操作搞明白即可。

        只看一般用法,不详细区分参数细节,否则会陷入很多复杂未知中。

        关键在于理解,而不在于记住。

1.6、ldm/stm与栈的处理

1.6.1、为什么需要多寄存器访问指令

        ldr/str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢,解决方案是stm/ldm。

        ldm(load register mutiple)

        stm(store register mutiple)

1.6.2、八种后缀

        ia (increase after) 先传输,再地址+4

        ib (decrease before) 先地址+4,再传输

        da (decrease after) 先传输,再地址-4

        db (decrease before) 先地址-4,再传输

        fd (full decrease) 满递减堆栈

        ed (empty decrease) 空递减堆栈

        fa (......) 满递增堆栈

        ea (......) 空递增堆栈

1.6.3、四种栈

        空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出。

        满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针。

        增栈:栈指针移动时向地址增加的方向移动的栈。

        减栈:栈指针移动时向地址减小的方向移动的栈。

1.6.4、!的作用

ldmia r0, {r2-r3}
ldmia ro!, {r2-r3}

        感叹号的作用就是r0的值在ldm过程中发生的增加或者减少最后写回到r0去,也就是说ldm时会改变r0的值。

1.6.5、^的作用

ldmfd sp!, {r0-r6,pc}
ldmfd sp!, {r0-r6,pc}^

        在目标寄存器中有pc时,会同时将spsr写入cpsr,一般用于异常模式返回。

1.6.6、总结

        批量读取或写入内存时要用ldm/stm指令。

        各种后缀以理解为主,不需记忆,最常见的是stmia和stmfd。

        谨记:操作栈时使用相同的后缀就不会出错,不管是满栈还是空栈、增栈还是减栈。

1.7、伪指令

1.7.1、伪指令的意义

        伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。

        伪指令的意义在于指导编译过程。

        伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。

1.7.2、gnu汇编中的一些符号

        @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似。

        # 做注释,一般放在行首,表示这一行都是注释而不是代码。

        : 以冒号结尾的是标号。

        . 点号在gnu汇编中表示当前指令的地址。

        # 立即数前面要加#或$,表示这是个立即数。

1.7.3、常用伪指令

.global _start    @ 给_start声明外部链接属性
.section .text    @ 指定当前段为代码段
.ascii .byte .short .long .word .quad .float .string @ 定义变量数据
.align 4    @ 以16字节对齐
.balignl 16 0xabcdefgh @ 16字节对齐填充
@b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xabcdefgh是用来填充的原料。
.equ     @ 类似于C中宏定义

1.7.4、偶尔会用到的gpu伪指令

.end                @标识文件结束
.include            @头文件包含
.arm/.code32        @声明以下为arm指令
.thumb/.code16      @声明以下为thubm指令

1.7.5、最重要的几个伪指令

ldr            大范围的地址加载指令
adr            小范围的地址加载指令
adrl           中等范围的地址加载指令
nop            空操作

        ARM中有一个ldr指令,还有一个ldr伪指令,一般都是用ldr伪指令而不是ldr指令。

ldr r0, #0xff        @ldr指令
ldr r0, =0xff        @伪指令

1.7.6、adr与ldr

        adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理。

        adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里。

        ldr加载的地址和链接时给定的地址有关,由链接脚本决定。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新版CleanMyMac X4.14.1苹果电脑系统数据清理工具

最新版CleanMyMac X 让您的Mac焕然一新&#xff0c;时刻保持安全CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff…

【Git系列】了解什么是版本控制

&#x1f433;了解什么是版本控制 &#x1f9ca;1. 什么是版本控制&#x1f9ca;2. 为什么要有版本控制&#x1f9ca;3. 常见的版本控制工具&#x1f9ca;4. 版本控制分类&#x1fa9f;4.1 本地版本控制&#x1fa9f;4.2 集中版本控制&#x1fa9f;4.3 分布式版本控制 学习git之…

socket 基础

Socket是什么呢&#xff1f; ① Socket通常也称作“套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。 ② Socket是连接运行在网络上的两个程序间的双向通信的端点。 ③ 网络通讯其实指…

1.1.2 SpringCloud 版本问题

目录 版本标识 版本类型 查看对应版本 版本兼容的权威——官网&#xff1a; 具体的版本匹配支持信息可以查看 总结 在将Spring Cloud集成到Spring Boot项目中时&#xff0c;确保选择正确的Spring Cloud版本和兼容性是非常重要的。由于Spring Cloud存在多个版本&#xff0c;因此…

Vulnhub: shenron: 3靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.171 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.171 修改hosts后访问目标80端口&#xff0c;发现是wordpress wpscan收集目标用户&#xff0c;爆破出密码&#xff1a;ilov…

台灯头灯手电筒UL153亚马逊美国站测试要求

在将台灯、头灯或手电筒上架到亚马逊美国站之前&#xff0c;UL153测试是必不可少的一项认证。UL153是美国安全实验室&#xff08;Underwriters Laboratories&#xff09;颁布的一项标准&#xff0c;旨在确保产品的安全性和可靠性。那么&#xff0c;我们应该如何办理UL153测试报…

亚马逊调整数据存档政策:超两年的订单将从9月起存档!

2023年9月起&#xff0c;亚马逊美国站和欧洲站宣布对订单数据存档政策进行调整。该调整意味着自2023年9月起&#xff0c;所有历时两年以上的订单将按月存档。此举是为了确保客户的个人隐私和数据安全&#xff0c;存档订单将不再包含买家的个人身份信息&#xff0c;如姓名、电话…

git操作:修改本地的地址

Windows下git如何修改本地默认下载仓库地址 - 简书 (jianshu.com) 详细解释&#xff1a; 打开终端拉取git时&#xff0c;会默认在git安装的地方&#xff0c;也就是终端前面的地址。 需要将代码 拉取到D盘的话&#xff0c;现在D盘创建好需要安放代码的文件夹&#xff0c;然后…

Linux系统管理:虚拟机Rocky Linux安装

目录 一、理论 1.Rocky Linux 2.NetworkManager配置 3.ipaddress 配置文件 4.nmtui 配置 ipaddress 二、实验 1.虚拟机Rocky Linux安装准备阶段 2.安装Rocky Linux 3.进入系统 三、问题 1.网络配置文件权限不够 一、理论 1.Rocky Linux &#xff08;1&#xff0…

《2023数字化采购发展报告》发布,北京筑龙采购供应链数字化实践成功入选

近日&#xff0c;由亿邦智库联合中国物流采购与联合会公共采购分会共同编制的《2023数字化采购发展报告》&#xff08;下文称《报告》&#xff09;在第四届国有企业数智化采购与智慧供应链高峰论坛上重磅发布。作为一家服务30行业超大型及大中型国有企业的采购供应链数字化产品…

基于linux下的高并发服务器开发(第四章)- 多进程实现并发服务器(回射服务器)

1. socket // 套接字通信分两部分&#xff1a; - 服务器端&#xff1a;被动接受连接&#xff0c;一般不会主动发起连接 - 客户端&#xff1a;主动向服务器发起连接 2.字节序转换函数 当格式化的数据在两台使用不同字节序的主机之间直接传递时&#xff0c;接收端必然错误…

螺旋矩阵 II——力扣59

文章目录 题目描述法一 模拟 题目描述 法一 模拟 初始化一个二维向量&#xff0c;名为matrix&#xff0c;它有n行和n列。向量的每个元素都是一个整数&#xff0c;初始化为0。初始化二维向量的语法如下&#xff1a;vector<vector<int>> matrix(n, vector<int>…

unity 添加动画步骤

动画中不能有这俩组件会冲突 1.创建动画控制器 2.在需要做动画的节点添加动画组件 Animatr 3.把动画器拉到Animatr组件控制器中去 4.创建动画&#xff0c;把创建的动画推拽到动画器中。 5.点击绑定Animatr的节点把动画拖拽到动画播放器中。 6.点击动画可以调节速度 7. 配置参数…

Linux操作系统学习,Linux基础命令大全

目录 第一章、Linux简介和安装1.1&#xff09;Linux简介和分类1.2&#xff09;安装VMware虚拟机&#xff0c;在虚拟机中安装CentOS 7 第二章、虚拟机中Linux的IP地址配置详解2.1&#xff09;什么是IP地址&#xff0c;如何查看2.2&#xff09;虚拟机NAT模式中Linux的IP地址设置有…

上海亚商投顾:沪指冲高回落 两市成交重回万亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日冲高回落&#xff0c;盘初一度集体涨超1%&#xff0c;随后涨幅明显回落&#xff0c;上证50午后一度翻…

蓝桥杯2018省赛全球变暖dfs

全球变暖 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序 问题描述 格式输入 格式输出 输出一个整数 样例输入 样例输出 1 评测用例规模与约定 最大运行时间&#xff1a;1s最大运行内存: 256M 解析 采用dfs的方式进行搜索&#xff0c;首先输入地…

python和java哪个更有前景,python和java哪个更有前途

大家好&#xff0c;小编为大家解答python和java哪个好学,零基础的问题。很多人还不知道python和java哪个更容易入门&#xff0c;现在让我们一起来看看吧&#xff01; 进入编程行业是很多人的梦想&#xff0c;现在越来越多的人都想要通过培训的方式进入IT行业中&#xff0c;但是…

Redis - 缓存的双写一致性

概念&#xff1a; 当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 那为什么会有不一致的情况呢&#xff1f; 如果不追求一致性&#xff0c;正常有两种做法 先修改数据库 后删除旧的缓存先删除旧的缓存 再修改数据库 我们以先删除旧的…

「教程」如何使用一套代码在多种程序中接入天气预警API

引言 天气预警的重要性不言而喻&#xff0c;在遭受自然灾害和极端天气时&#xff0c;及时获得预警信息可以拯救生命和减少财产损失。如今&#xff0c;随着科技的进步&#xff0c;开发者和企业可以借助天气预警 API 这款强大的服务&#xff0c;将实时预警信息集成到自己的应用中…

深刻理解python特性-列表推导式和生成器表达式

哈喽大家好&#xff0c;今天给大家介绍两个Python中特性-列表推导式和生成器表达式 今天我想向你介绍python语言的两个非常有用的特性&#xff1a;列表推导式和生成器表达式。这两个特性都可以让你用一行简洁的代码来创建一个序列&#xff0c;而不需要写循环或者函数。但是它们…