ARM指令后缀与常用读取指令

ARM基础系列——ARM指令 ARM指令指令系统: 指令是指示计算机某种操作的命令,指令的集合称为指令系统。指令系统的功能强弱很大程度上决定了这类计算机智能的高低,它集中地反应了微处理器的硬件功能和属性。 ARM指令在机器中的表示格式是用32位的二进制数表示。如ARM中有一条指令为 ADDEQS  R0,R1,#8; 其二进制代码形式为: 31~28 | 27~25 | 24~21 | 20 | 阅读详情

一:指令可选后缀

“S”后缀:指令中使用“S”后缀,指令执行后状态寄存器的条件标志位将被刷新;不使用“S”后缀时,指令执行后状态寄存器的条件标志位不会发生变化。此标志经常用于对条件进行测试,例如:是否溢出,是否进位等;根据这些变化,就可以进行一些判断,是否大于,是否相等,从而可能影响指令执行顺序。

“!”后缀

如果指令地址表达式中不含“!”后缀,则基址寄存器中的地址不会发生变化,指令中含有则变化,变化结果如下:

基址寄存器中的值(指令执行后)=指令执行前的值+地址偏移量

注意:

“!”后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。

“!”后缀不能用于R15(PC)的后面

当用于单个寄存器后面时,必须确性这个寄存器有隐性的偏移量,eg:“STMDB SP!,{R3,R5,R7}”此时地址基址寄存器SP的隐性偏移量是4.

二:具体的指令

LDR/STR       字数据加载/存储指令

LDRB/STRB   字节数据加载/存储指令

LDRH/STRH  半字数据加载/存储指令

Eg:LDR R4,START                   ;将存储地址为START的字数据读入R4

       LDR R0,[R1]                      ;将存储地址为R1的字数据读入R0

       LDR R0,[R1,R2]                    ;将存储地址为R1+R2的字数据读入R0

       LDR R0,[R1,#8]                     ;将存储地址为R1+8的字数据读入R0

       LDR R0,[R1,R2,LSL#2]           ;将存储地址为R1+R2<<2的字数据读入R0

       STR R5,DATA1                   ;将R5存入存储地址为DATA1中

       同理可以判断出其他STR的形式所表达的意思。

数据加载与存储(Load-store)指令用于存储器和处理器的寄存器之间数据传输。

Load用于把内存中的数据装载到寄存器中去。

Store用于把寄存器的数据存储到内存中去。

注意:LDRR5,[R6,#0x04]!   是先把R6+4作为地址,把数据传输结束后,在把R6=R6+4.

     LDR R5,[R6],#0x04    是先把R6作为地址,把数据传输结束后,把R6=R6+4

 

STMFDSP!,{R0-R4}         将R0-R4中的数据压入堆栈,R13为堆栈指针。

LDMFDSP!,{R0-R4}         将数据出栈,恢复R0-R4的值。

 

DCD用于分配一段字内存单元,并用伪指令中的expr初始化.DCD伪指令分配的内存需要字对齐,一般可用来定义数据表格或其它常数。

Eg:DATA DCD 4,5,6                DATA指向这块内存起始地址,内存为3个单元,并且内容为4,5,6.

注意,,标号相当与一个常数,所以在 LDR R0,DATA,时,R0中内容就是DATA的值。

 

LR就是ARM中R14,子程序链接寄存器,SP就是ARM中R13栈指针寄存器,R15就是PC,程序计数器。

当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。

读状态寄存器指令.在 ARM 处理器中,只有 MRS 指令可以状态寄存器CPSR或SPSR读出到通用寄存器中.指令格式如下;


写状态寄存器指令.在 ARM 处理器中.只有 MSR 指令可以直接设置状态寄存器 CPSR或 SPSR.指令格式如下




SPSR是用来备份CPSR的寄存器,当异常发生时,SPSR自动将上一个状态的CPSR备份出来,便于在后面恢复上一个状态。

嵌入式系统(三):ARM 指令汇编(4) (2)(3)中介绍了ARM处理区的存储访问指令,数据处理指令,分支指令,协处理器指令等,本文对其余的指令及注意事项做一补充 文章结构(5)杂项指令① 软中断指令“SWI”i.参数传递ii.执行过程② 状态寄存器读指令“MRS”③ 状态寄存器写指令状态寄存器写指令“MSR”(6)伪指令① ADR伪指令② 中等范围地址读取③ 大范围地址读取④ 空操作伪指令“NOP”3.地址对准4.位段操作5.地址的前... 阅读详情

相关推荐

ARM汇编指令指令中s后缀的作用、N、Z、C、V位有什么作用、ARM汇编启动代码

学习arm汇编的主要目的是为了编写,启动代码启动以后,引导程序到c语言环境下允许。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。首先我们先学一些指令

m0_61988812的博客 1540

ARM的命名规则中后缀变量及其含义

ARM产品通常以ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}的形式出现。下图显示了ARM的命名规则中这些后缀的具体含义。

CodeAllen嵌入式 949

24、ARM汇编中的条件执行指令后缀

本文详细解析了ARM汇编中条件执行指令和带S后缀指令,包括逻辑移位、乘法、比较、位测试和条件选择指令的工作原理标志设置规则。重点介绍了这些指令在逆向工程中的分析方法和应用场景,帮助读者准确理解程序逻辑并进行高效开发逆向分析。

tt34567的博客 264

ARM 指令

http://wenku.baidu.com/view/7efbd1116edb6f1aff001fc9.html 文章转载于该网页,留下记号,以后供参考~谢谢作者! ARM指令集详解 ARM可以用两套指令集:ARM指令集和Thumb指令集。本文介绍ARM指令集。在介绍ARM指令集之前,先介绍指令的格式。 1  指令格式         (1)基本格式         {}{S},{

digent的专栏 3298

嵌入式知识-ARM裸机-学习笔记(1):ARM汇编指令指令

嵌入式知识-学习笔记(2):ARM汇编指令指令 首先说明一下指令和伪指令的区别: 指令:是CPU机器指令的助记符,经过编译后会得到一串由1、0组成的机器码,可以由 CPU读取执行。(是一种内容) 伪指令:本质上不是指令,是编译环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。(是一种工具) 一.ARM汇编的特点 ARM采用RISC架构,CPU本身不能直接读取内存(需要借...

qq_42826337的博客 5550

嵌入式1-ARM学习(五)—ARM汇编指令

汇编指令汇编指令指令指令•(汇编指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。•(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。

weixin_67553865的博客 1310

ARM汇编指令

arm体系采用的方案是满减,但是在进行操作之前,我们必须告诉2440栈底的位置,这里我们把栈底设置为0x40001000,从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位。如果结果为0,则Z=1;

qq_65747669的博客 2552

ARM学习-ARM指令集详解

详解六大类ARM指令

闪耀大叔的博客 1万+

ARM汇编指令(详细)整理附实例快速掌握

本文主要整理了arm常用汇编指令,同时通过实例进一步讲述语句的用法。通用寄存器是一组用于存储数据和地址的寄存器。在 ARM 架构的不同版本中,这些寄存器的数量和命名有所不同。在 ARMv7 和之前的版本中,有 16 个通用寄存器,编号从 R0 到 R15。R0 到 R14 用于存储数据和地址。R15 通常被称为程序计数器(PC),用于存储下一条指令的地址。在 ARMv8 和之后的版本中,有 31 个通用寄存器,编号从 X0 到 X30。X0 到 X28 用于存储数据和地址。

Luckiers的博客 3万+

arm汇编中mov、movs、movw、movl、movb解析

arm汇编 mov

深耕安全技术研究 1万+

ldm/stm栈的处理 来自于朱有鹏嵌入式

为什么需要多寄存器访问指令 ldr/str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢,解决方案是stm/ldm ldm(load register mutiple) stm(store register mutiple) 举例(uboot start.S 537行) stmia sp, {r0 - r12} 将r0存入sp指向的内存处(假设为0x

Arthur_Holmes的博客 1597

ARM汇编指令的分类移位操作简介

由上述例子所示,每调用一级子函数,我们都把返回地址存入到未分组寄存器中,但是未分组寄存器毕竟是有限的,像Linux内核函数的调用层次往往很深,通用寄存器根本不够用,要想保存返回地址,就需要对数据进行压栈,那我们就要为每个模式的栈设置空间,那如何设置栈空间呢?BL是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC当前值,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

czy8787475的博客 2651

gcc -S xx

编译器的核心任务是把C程序翻译成机器的汇编语言(assembly language)。汇编语言是人类可以阅读的编程语言,也是相当接近实际机器码的语言。由此导致每种 CPU 架构都有不同的汇编语言。 实际上,GCC 是一个适合多种 CPU 架构的编译器,不会把C程序语句直接翻译成目标机器的汇编语言,而是在输入语言和输出汇编语言之间,利用一个中间语言,称为 RegisterTransfer Lan...

weixin_30853329的博客 662

嵌入式学习(Day 51:ARM指令/汇编c语言函数相互调用)

1.Supervisor模式SVC模式 所以,Supervisor模式和SVC模式在ARM处理器中是不同的概念,但它们之间有密切的关联。SVC模式使用Supervisor模式的功能来提供系统服务。2.指令+s的作用,影响N,Z,C,V位 ARM指令中的“S”后缀用于指示该指令执行后是否更新程序状态寄存器(CPSR)的条件标志位。这些标志位可以用于后续的条件判断或分支操作,从而影响指令的执行顺序。以下是具体功能和详细解释:条件标志位更新:当ARM指令后带有“S”后缀时,该指令执行

weixin_43687188的博客 2751
上一篇: __vet_atags
下一篇: __create_page_tables
coldsnow33
博客等级 码龄15年 48粉丝 42原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值