ARM汇编语言(2)

news/2025/2/21 4:49:08/

ARM汇编语言

一、引言

ARM汇编语言是一种低级别的计算机指令集架构(ISA)语言,它是ARM处理器上的一种指令集架构,用于编写底层的系统软件,例如操作系统、驱动程序和嵌入式系统应用程序。

ARM汇编语言使用基于寄存器的指令集,其中指令操作的数据通常存储在处理器的寄存器中,而不是内存中。ARM汇编语言使用汇编指令来控制计算机的操作,例如数据传输、算术和逻辑操作、分支和跳转指令等等。

ARM汇编语言的语法通常是简单直观的,并且与其他汇编语言相似,但是具体的语法规则会因不同的ARM处理器型号而有所不同。编写ARM汇编语言代码需要对底层计算机硬件和指令集架构的工作原理有深入的理解。

二、ARM处理器的寻址方式

1.寄存器寻址

将一个寄存器的值传送到另一个寄存器的操作。

MOV R1,R2      ;R2→R1,将寄存器R2的值传送到寄存器R1

指令执行时对寄存器中的值直接取出进行操作。

2.立即寻址

立即寻址方式的目的就是将操作数紧跟在操作码后面,与操作码一起放在指令代码段中,在程序运行时,程序直接调用该操作数,而不需要到其他地址单元中去取相应的操作数,上述的写在指令中的操作数也称作立即数。
MOV R0,#0x1234
MOV为操作码,R0为第一操作数,0x1234为立即数

立即数(immediate)是指在指令中直接指定的数据值,必须对应8位常数通过循环右移偶数位的得到,立即数通常被用于指令中的常量、地址、偏移量。

如何判断快速判断这个立即数合法:

  • (1)首先把这个数用二进制表示出来,顺着看和循环看数中“1”的最大间隔是否都大于8(包含首尾的两个1),如果大于8,那这个数肯定是非法的。如果有一次小于等于8则有可能是合法的。
    例如:
    0x1101的二进制为:0000 0000 0000 0000 0001 0001 0000 0001,无论顺着看和循环看,两个1的最大间隔都大于8,所以不是立即数。

  • (2)方法1:
    如果两个1的最大间隔都大于8,一定不是立即数。
    如果顺序看时1的最大间隔等于8,此时可以看看,这个数最高位1的前面或者最低位1的后面是否有偶数个0,只要一种情况下有,这个数就是合法的。
    如果循环看时1的最大间隔小于等于8,此时可以看看,循环看时,两端得到的间隔个数是否有一个为偶数,如果有一个是偶数,这个数就是合法的。

  • (3)方法2:
    1.把数据转换成二进制形式,从低位到高位写成4位1组的形 式,高位一组不够四位的,在高位前面补0。
    2.数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。
    3.如果数据中间有连续的大于等于24个0,循环左移4的倍数,使高位全为0。
    4.找到高位的1,去掉前面大偶数个0。
    5.找到低位的1,去掉后面大偶数个0。
    6.数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。

总结:判断立即数时,先把它化成二进制,然后取八位数,看左右移动偶数位是否能还原。
例如:
1、判断 0X20000018 是不是立即数:
把数据转换成二进制 0010 0000 0000 0000 0000 0000 0001 1000 循环右移32-3=29次得到原来的数,所以不是立即数。
2、判断0x104是不是立即数:
把数据转化为二进制0000 0000 0000 0000 0000 0001 0000 0100如果取01000001循环32-2=30次得到原数,如果取10000010,循环32-1=31次得到原数。

在ARM汇编语言中,立即数可以使用前缀“#”来表示,表示16进制数值时用“0x”表示,注意“#”后面一定是一个合法的立即数。例如,下面的指令中:

ADD R0, R0, #10   ;R0+10→R0 ,将立即数10加到寄存器R0中
MOV R0,#0x1234   ;0x1234→R0

3.寄存器移位寻址

3.1 LSL:逻辑左移(logical shift left)

MOV R0,#0xff0000f0    ;#0xff0000f0 →R0
MOV R0,R0,LSL #4     ;R0+R*2^4→R0

例:0xff0000f0逻辑左移4位后为0xf0000f00,进位输出为0xf。
寄存器中字的低端空出的位补0。

3.2 LSR:逻辑右移(logical shift right)

MOV R0,R0,LSR #4     ;R0+R/2^4→R0

例:0xff0000f0逻辑右移4位后为0x0ff0000f,进位输出为0x0。
寄存器中字的高端空出的位补0。

3.3 ASR:算数右移(arithmetic shift right)

MOV R0,R0,ASR #4     ;R0+R/2^4→R0

例:0xff0000f0算数右移4位后为0xfff0000f,进位输出为0x0。
移位过程中保持符号位(最高位)不变,即源操作数为正数,字的高端空位补0,否则补1。

3.4 ROR:循环右移(rotate right)

MOV R0,R0,ROR #4     ;R0+R/2^4→R0

例:0xff0000f0循环右移4位后为0x0ff0000f,进位输出为0x0。
由字低端移出的位填到高端空出的位。

4.寄存器间接寻址

寄存器为操作数的地址指针,操作数存放在存储器中。

LDR   R0,[R1]   ;[R1]→R0    取
STR   R0,[R1]    ;R0→[R1]    存

第一条指令将R1的值为地址的存储器的数据传送到R0中,第二条指令是将R0的值传送到以R1为地址的存储器中。
LDR也可以作为伪指令,例如:

LDR r0, =0xFFF0 @伪指令
LDR r0, 0xFFFF @指令

即可以直接传入一个任意的数,不必在意立即数,因为在编译时被解析,作为加载指令。

5.基址加偏址寻址

将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址,通常用来访问基址附近的地址的单元。
(1)前变址模式
LDR R0,[R1,#4] ;[R1+4]→R0
(2)自动变址模式
LDR R0,[R1,#4]! ;[R1+4]→R0,R1+4→R1,"!"为更新地址
(3)后变址模式
LDR R0,[R1],#4 ;[R1]→R0,R1+4→R1


http://www.ppmy.cn/news/59913.html

相关文章

牛客网HJ31 单词倒排

HJ31 单词倒排 描述示例解题思路以及代码 描述 对字符串中的所有单词进行倒排。 说明: 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果…

应用层开发想转Android framework开发要从何开始

前言 现如今,由于市面上应用App的更新逐渐变少,很多Android移动应用开发者都开始转型做系统开发,这比开发应用有趣多了,因为你可以探索系统模块的运行原理,从框架层面去了解它。 在应用层,你只需要配置好…

老王的自动驾驶决策和规划第一章

文章目录 自动驾驶决策规划算法序章第一章(1) 细说五次多项式(2) 凸优化与非凸优化(3) 直角坐标与自然坐标转换(上, 下) 自动驾驶决策规划算法 序章 课程链接:序章 第一章 (1) 细说五次多项…

shell脚本

expr命令 优点:可以直接输出 缺点:计算表达式里面引用变量使用$,特数字符需要转义 只能计算一个表达式 计算 expr \( 10 10 \) \* 2 100 计算字符串长度 expr length 字符串 截取字符串 expr substr 字符…

线上FullGC问题排查实践——手把手教你排查线上问题 | 京东云技术团队

作者:京东科技 韩国凯 一、问题发现与排查 1.1 找到问题原因 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型&#xff0c…

[Leetcode] 0697.数组的度

697. 数组的度 点击上方标题跳转至leetcode 题目描述 给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1&…

【三十天精通Vue 3】第二十四天 Vue3 移动端适配和响应式布局

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、 移动端适配概述1.1 为什么需要移动端适配?1.2 移动端适配方案比较1.3 常用的移动端适配方案二、 响应式布局概述2.1 …

【LocalMapping】

这段代码中,LocalMapping类是ORB_SLAM2算法中的局部地图构建模块。局部地图构建的任务包括处理新的关键帧、创建新的地图点、地图点筛选、关键帧筛选以及与相邻关键帧的地图点搜索。LocalMapping类在SLAM系统中与跟踪(Tracking)、闭环检测(LoopClosing)等其他模块共同工作…