汇编(一)——ARM指令格式

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

ARM指令格式

ARM采用的是32位架构

ARM约定:

  • Byte(字节):8 bits
  • Halfword(半字):16bits (2 bytes)
  • Word(字):32 bits (4 byte)

大部分ARM core提供:

  • ARM指令集(32-bits)
  • Thumb 指令集(T变种)(16-bit)

ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应不同功能实现的二进制位。

  • 每条指令的多功能
  • ARM指令一个·重要的特点是它所有的指令都带有条件,例如用户可以测试某个寄存器的值,但是,直到下一次使用同一条件进行测试时,才能有条件的执行这些指令。
  • ARM指令另一个重要的特点是具有灵活的第二操作数,既可以是立即数,也可以是逻辑运算数,使得ARM指令可以在读取数值的同时进行算术和移位操作。它可以在几种模式下操作,包括通过使用SWI(软件中断)指令从用户模式进入系统模式

ARM指令集——条件码

ARM指令的基本格式如下:

<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}

使用条件码“cond”可以实现高效的逻辑操作,提高代码效率。

所有的ARM指令都可以条件执行,而Thumb指令只有B(跳转)指令具有条件执行功能,如果指令不标明条件代码,将默认为无条件(AL)执行。

指令条件码表

操作码条件助记符标志含义
0000EQZ=1相等
0001NEZ=0不相等
0010CS/HSC=1无符号数大于或等于
0011CC/LOC=0无符号数小于
0100MIN=1负数
0101PLN=0正数或0
0110VSV=1溢出
0111VCV=0没有溢出
1000HIC=1,Z=0无符号数大于
1001LSC=0,Z=1无符号数小于或等于
1010GEN=V有符号数大于或等于
1011LTN!= V有符号数小于或等于
1100GTZ=0,N=V有符号数大于
1101LEZ=1, N!=V有符号数小于或等于
1110AL任何无条件执行(指令默认条件)
1111NV任何从不执行

示例1:

C代码:				对应的汇编代码如下,其R0为a,R1为b
if(a > b)			CMP R0, R1     ;R0与R1比较
	a++;			ADDHI R0,R0,#1 ;若R0>R1,则R0 = R0+1
else
	b++;			ADDLS R1,R1,#1 ;若R0<=R1,则R1 = R1+1

示例2:

C代码:
if((a!=10) && (b!=20))

a=a+b

对应的汇编代码如下,其R0为a,R1为b

CMP R0, #10 ;比较R0是否为10

CMPNE R1,#20 ;若R0不为10,则比较R1是否为20

ADDNE R0,R0,R1 ;若R0不为10且R1不为20,则执行R0=R0+R1

——从这里我们发现条件码需要上一条指令满足条件才执行

ARM基本格式成员说明

ARM指令的基本格式如下:

<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}

其中<>号内的项是必须的,{}号内的项是可选的。

各项的说明如下:

  1. opcode:指令助记符
  2. cond:执行条件
  3. S:是否影响CPSR寄存器的值
  4. Rd:目标寄存器
  5. Rn:第一个操作数的寄存器
  6. operand2:第2个操作数

ARM指令格式举例

LDR R0, [R1] ;读取R1地址上的存储单元内容,执行条件AL;

BEQ DATAEVEN ;条件执行分支指令,执行条件EQ,即相等则跳转到DATAEVEN;

ADDS R2, R1, #1 ;加法指令,R2<-R1+1,影响CPSR寄存器;

SUBNES R2, R1,#0x20 ;条件执行的减法运算,执行条件NE,R1-0x20->R2,影响CPSR寄存器

ARM指令集——第2个操作数

ARM指令的基本格式如下:

<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}

灵活的使用第2个操作数"operand2"能够提高代码效率。

它有如下的形式:

  • #immed_8r——常数表达式
  • Rm————— 寄存器方式(操作数即为寄存器的数值)
  • Rm,shift——寄存器位移方式

#immed_8r——常数表达式

该常数必须对应8位位图(pattern),即一个8位的常数通过循环右移偶数位得到,为合法常量。

例如:

MOV R0,#1 ;R0 = 1

AND R1,R2,#0X0F ;R2与0X0F,结果保存在R1中

LDR R0,[R1], #-4;读取R1地址上的存储单元内容,且R1=R1-4

合法常量:

0xFF、0x104、0xFF0、0xFF000、0xFF000000、0xF000000F

0xFF0等于0xFF左移4位,相当于右移28位

非法常量:

0x101、0x102、0xFF1、0xFF04、0xFF003、0xFFFFFFFF

Rm,shift——寄存器移位方式

将寄存器的位移结果作为操作数,但Rm值保持不变,位移方法如下:

操作码说明操作码说明
LSL #n逻辑左移n位(1<=n<=31)ASR #n算术右移n位(1<=n<=32)
LSR #n逻辑右移n位(1<=n<=32)ROR #n循环右移n位(1<=n<=31)
ASL #n算术左移n位(与LSL同义)RRX带扩展的循环右移1位

逻辑左移n位,就等于*2的n次方

例如:

ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8 = 9R1

SUB R11,R12,R3,LSL #32 ; 32超出了LSL范围

MOVS R4,R4,RRX #3 ; RRX不需要指定移位量,RRX总是右移一位

·

4.ARM指令 ARM指令 阅读详情

相关推荐

ARM编程模型-常用指令

由上述例子所示,每调用级子函数,我们都把返回地址存入到未分组寄存器中,但是未分组寄存器毕竟是有限的,像Linux内核函数的调用层次往往很深,通用寄存器根本不够用,要想保存返回地址,就需要对数据进行压栈,那我们就要为每个模式的栈设置空间。操作数1应是个寄存器,操作数2可以是个寄存器,被移位的寄存器,或个立即数。未设置的掩码位保持不变。对大多数的Thumb指令而言,没有使用条件执行(标志直都是置位的),源寄存器和目标寄存器是相同的,只使用了低端寄存器,常量有大小的限制,没有使用内嵌桶形移位器。

weixin_43586667的博客 6112

万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!

见到汇编就害怕?读完这篇,扫除汇编拦路虎!!(示例丰富,可做手册,随手查阅!)

车载系统攻城狮 1万+

汇编语言学习笔记(ARM指令

汇编语言学习笔记(ARM指令集 文章目录汇编语言学习笔记(ARM指令集前言、数据处理指令类型二、跳转指令类型:三、控制指令类型:四、存储器访问指令类型:总结 前言 杂事太多,浪费我10多天的时间。ARM指令集,我感觉还是“复杂”了;功能虽全,但记忆量也多。其实,编写OS所用到的只是100多条ARM指令集中的约30多条吧。以下是对ARM指令集的第次简单整理,有错难免、仅供参考。 有多种指令集架构(Instruction Set Architecture),如RISC类(RISC-V、Open

weixin_53295593的博客 3505

ARM指令格式

CPSR (Current Program Status Register)特殊的寄存器,用于存储当前的程序状态信息。

cc486gank的博客 2000

ARM汇编指令1 - 指令格式和寻址方式

ARM汇编指令

to_be_better_wen的博客 1792

ARM处理器中常量的理解

ARM处理器的汇编语言中,对指令语法格式中的的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由个8位的常数循环移位偶数位得到的。”对于这句话,我开始学ARM时不理解,到了后来为了做设计,去看BootLoader源码时,才认真地在网上查找相关资料,理解了这句话。   首先从ARM指令系统的语法格式说起。   条典型的ARM指令语法格式分为如下几个部分:{}{S} ,{,}   其中,内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用

gaoyuanLinkconcept的专栏 1852

ARM处理器中“8位位图”

ARM处理器的汇编语言中,对指令语法格式中的的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由个8位的常数循环移位偶数位得到的。” 首先从ARM指令系统的语法格式说起。ARM指令语法格式分为如下几个部分: {}{S} ,{,}其中,内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。Opcode   指令助记符,如LDR,STR 等Cond       执行条件,如EQ,NE 等        S    

Smile 7423

ARM汇编指令以及伪指令

文章目录ARM寄存器ARM寻址方式数据处理指令转移指令程序状态寄存器访问指令加载/存储指令异常指令指令ARM的存储系统ATPCS介绍异常中断处理ARM链接器 ARM寄存器 R13:栈指针寄存器(SP) R14:连接寄存器(LR) R15:程序计数器(PC) 由于ARM指令是字对齐,PC值的第0位和第1位总为0 ARM寻址方式 数据处理指令 转移指令 程序状态寄存器访问指令 加载/存储指令 异常指令指令 ARM的存储系统 ATPCS介绍 异常中断处理 ARM链接器 ...

qq_24601427的博客 1万+

ARM官方汇编指令

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 1万+

ARM汇编指令

ARM指令是通用指令,指的是所有的ARM芯片都支持。 1.ARM汇编程序 ARM汇编程序,大体是由下列的三类指令组成: 1)ARM汇编指令 ARM汇编指令ARM公司定的。 汇编语言是CPU执行效率最高的门语言。 汇编指令是唯对应条机器指令(二进制码)汇编指令由两个部分组成: 汇编指令 = 操作码 + 操作数 操作码:表示种操作,种运算 比如: ADD 表示加法运算 MOV 表示移动(赋值) SUB 表示减法运算 操作数:表示要操作

m0_60265426的博客 8893

ARM汇编与机器码、汇编指令

ARM芯片属于精简指令集计算机(RISC)

TENET123的博客 2980

汇编语言--ARM汇编

ARM汇编指令总结目的总结目的是为了看懂ARM汇编程序含义。如果是抱着来看这篇blog的盆友,希望可以帮到你们;如果有错误,请多指出。谢谢!#ARM指令格式arm指令字长为固定的32位。条典型的arm指令编码格式如下:条典型的ARM指令语法格式如下所示: 参数 opcode:指令操作符编码cond:决定指令的操作是否影响CPSR的值S:决定指令操作是否影响CPSR的值Rd:目标寄存器

Abe的学习之路 7866

ARM常用的汇编指令

ARM属于RSIC指令集,不能自己对内存里的数据进行直接操作, 只能通过Load/Store的指令来实现, 所以当我们要对内存中的数据进行操作时, 先要将内存中的数据加载到寄存器中, 然后在寄存器中对数据进行处理,最后将结果重新存储在内存中。为了能在C程序中内嵌汇编代码,不同的编译器基于ANSI C标准扩展了不同的关键字,使用的汇编格式可能也可能不太样,如GUN ARM编译器提供了个__asm__ 关键字,它的使用方法如下.SUB {cond} {S} Rd, Rn, operand2;

u010268337的博客 2051

ARM 汇编指令

ARM 汇编指令 转自: http://blog.chinaunix.net/uid-23193900-id-3251565.html ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指

kasalyn的专栏 3万+

ARM汇编指令学习

arm基础指令

m0_69124108的博客 1881

ARM汇编指令

ARM汇编语言程序里,有些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成 的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,汇编结束,伪指令的使命就完成。 在ARM汇编程序中,有如下几种伪指令: 符号定义伪指令 数据定义伪指令 汇编控制伪指令 宏伪指令 其他伪指令 符号定义(Symbol Definition)伪指令 符号定义伪指令用于定义ARM汇编程序中的变量、对

ching的专栏 3651

arm 常用汇编指令

说到汇编般操作的是处理器内部的寄存器,所以我们先来看看ARM cortex-A系列的寄存器组对于Cortex-A系列寄存器组,ARM 架构提供了 16 个 32 位的通用寄存器(R0~R15)供软件使用,前 15 个(R0~R14)可以用作通用的数据存储,R15 是程序计数器 PC,用来保存将要执行的指令ARM 还提供了个当前程序状态寄存器 CPSR 和个备份程序状态寄存器 SPSR,SPSR 寄存器就是 CPSR 寄存器的备份。以前的ARM处理器有7中运行模型:UserFIQ。

weixin_39995288的博客 2044

ARM汇编汇编指令,伪指令汇编程序格式

ARM 汇编指令

Afra 3599
上一篇: Linux新增API:eventfd
下一篇: 汇编(二)——ARM数据处理指令——算术运算、数据传送
Joker......
博客等级 码龄5年 83粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值