ARM指令第二操作数#immed_8r常量问题

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

ARM处理器的汇编语言中,对指令语法格式中的<shifter_operand>的常数表达式有这样的规定:该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。

首先从ARM指令系统的语法格式说起。

一条ARM指令语法格式分为如下几个部分:

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

其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)

Opcode   指令助记符,如LDRSTR

Cond       执行条件,如EQNE

       S           是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响

       Rd          目标寄存器

Rn          第一个操作数的寄存器

shifter_operand      第二个操作数

 

其指令编码格式如下:

31-28

27-25

24-21

20  

19-16

15-12

11-0 12位)

cond

001

opcode

S

Rn

Rd

shifter_operand

 

当第2 个操作数的形式为:#immed_8r常数表达式时该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。

其意思是这样:#immed_8r在芯片处理时表示一个32位数,但是它是由一个8位数(比如:01011010,即0x5A)通过循环移位偶数位得到(1000 0000 0000 0000 0000 0000 0001 0110,就是0x5A通过循环右移2位(偶数位)的到的)。

1010 0000 0000 0000 0000 0000 0001 0110,就不符合这样的规定,编译时一定出错。因为你可能通过将1011 0101循环右移位得到它,但是不可能通过循环移位偶数位得到。

1011 0000 0000 0000 0000 0000 0001 0110,也不符合这样的规定,很明显:1 0110 1011 9位。

为什么要有这样的规定?

那位大哥的理解是(小呆:这个的确是很有道理):

要从指令编码格式来解释(这就是我为什么一开始讲的是指令编码格式),仔细看表格中的shifter_operand所占的位数:12位。要用一个12位的编码来表示任意的32位数是绝对不可能的(12位数有2^12种可能,而32位数有2^32种)。

但是又要用12位的编码来表示32位数,怎么办?

只有在表示数的数量上做限制。通过编码来实现用12位的编码来表示32位数。

12位的shifter_operand中:8位存数据,4位存移位的次数。

8位存数据:解释了该常数必须对应8位位图

4位存移位的次数:解释了为什么只能移偶数位。4位只有16种可能值,而32位数可以循环移位32次(32种可能),那就只好限制:只能移偶数位(两位两位地移,好像一个16位数在移位,16种移位可能)。这样就解决了能表示的情况是实际情况一半的矛盾。

所以对#immed_8r常数表达式的限制是解决指令编码的第二个操作数位数不足以表示32位操作数的无奈之举,但在我看来:这个可以说是聪明的做法。因为如果直接用12位数来表示32位操作数,只能表示0 到(2^12-1)。大于(2^12-1)的数就没办法表示了。而且细细想来“8位存数据,4位存移位的次数,应该是最好的组合了(我并未想过所有的组合,只是顺便试了几个)。

 

ARM指令第二操作数#immed_8r详解

大多数ARM通用数据处理指令有一个灵活的第2操作数(flexible second operand),这里这解释一下其中的一种格式,#immed_8r常量的表达式。常量必须对应于8位位图(pattern)。该位图在32位字中,被循环移位偶数位(0,2,4,...28,30)。合法常量0xff,0xff000,0xf000000f。非法常量:0x101,0xff04

ARM 32位模式下,一条指令长度为32位,在上述数据处理指令中,操作数212位。所以像0x7f02这样的数,要两条指令才能完成。

MOV     R3, #0x7F00    E3 A0 3C 7F 该指令自己完成0x7f移位

ORR     R1, R3, #2

所以直接是找不到0x7f02

 

#immed_8r那个看明白了,但是请问图片里的那个8~11位的循环移位数,0000是不移位;0001是移动2位;0010是移动4位;0011是移动6位这样子吗?那么 0x7F007F左移8位指令中变成4 7F请问为什么老大你给出的是C 7F呢?

这个大哥犯了一个错误,关于循环移位,其实arm中只有循环右移(ROR)。0x7f0x7f00是通过循环右移24次才实现的,这里每次移动2位所以是12次(0xc

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

相关推荐

嵌入式系统(三):ARM 指令汇编(2)

2.ARM微处理器的指令系统 ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM微处理器的指令集可以分为六大类 : 跳转指令 数据处理指令 程序状态寄存器(PSR)处理指令 加载/存储指令 协处理器指令 异常产生指令 (1)ARM指令格式 ARM指令的基本格式如下: ...

csyifanZhang的博客 1126

4.2 指令集介绍

ARM指令集——指令格式      ARM指令的基本格式如下:      其中      ARM指令集——第2个操作数      ARM指令的基本格式如下:      灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:      (1)#immed_8r——常数表达式;

MTT_SKY 2232

计原(三)ARM指令系统

thumb-1是ARM指令集的子集, 具有良好的代码密度. thumb-2是一种兼容16位和32位指令的thumb指令集,无需在16位和32位之间进行切换. 书写thumb-2时不需要分析其位数为32还是16, 编译器会按照最简原则完成汇编, 但在统一汇编语言中可以利用后最.N和.W来指定长度. W为32位, N为16位. 基本指令格式: opcode为指令操作码, cond为执行条件, S表示该指令的执行是否影响到应用程序状态寄存器APSR(标志)寄存器的值(若写上则影响), Rd为目的操作数(寄存.

weixin_45883559的博客 697

ARM指令详解

详细介绍ARM指令集1- - 首先详细介绍ARM指令集,ARM指令集包括标准ARM指令集和Thumb指令集,并介绍ARM的宏汇编以及ARM汇编语言编程 1 ARM指令系统特点 ARM指令系统属于RISC指令系统。标准的ARM指令每条都是32位长,有些ARM核还可以执行Thmub指令集,该指令集是ARM指令集的子集,每条指令只有16位。 1 数据类型 ARM处理器一般支持下列6种数据类型: l8位有

fengkuangwarrior的专栏 4437

arm指令

作者不详,如果作者看到请与我联系...ARM指令系统特点ARM指令系统属于RISC指令系统。标准的ARM指令每条都是32位长,有些ARM核还可以执行Thmub指令集,该指令集是ARM指令集的子集,每条指令只有16位。1  数据类型ARM处理器一般支持下列6种数据类型:l8位有符号字节类型数据;l8位无符号字节类型数据;l16位有符号半字类型数据;l16位无符号半字类型数据;l32位有符号字类型

小有的专栏 1万+

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

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

Scroll_C的博客 6662

ARM8位位图--第二操作数的立即数表示

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

cloud 的学习时代 3619

ARM指令中灵活的第二操作数

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

jeffupright的专栏 6240

Arm指令格式

ARM指令的编码格式  实际指令语法格式为:  ADDEQS R0,R1,R2;  该指令的编码格式为:  ARM指令的助记符  ARM指令汇编程序中用助记符表示,一般ARM指令的助记符格式为:  {} {S} ,,  其中:  操作码,如ADD表示算术加操作指令;  {} 决定指令执行的条件域;  {S} 决定指令执行是否影响CPSR寄存器的值;  目

beyond702的专栏 4724

ARM指令格式和寻址方式

原文:http://www.eefocus.com/article/08-08/49786s.html ARM指令的编码格式 实际指令语法格式为: ADDEQS R0,R1,R2; 该指令的编码格式为: ARM指令的助记符 ARM指令汇编程序中用助记符表示,一般ARM指令的助记符格式为: {} {S} ,, 其中: 操作码,如ADD表示算术加操作指

永久指针 1万+

ARM指令中如何判断一个立即数是有效立即数

转载于:http://blog.sina.com.cn/s/blog_7ea827fe0100torx.html  在ARM处理器的汇编语言中,对指令语法格式中的的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。     首先从ARM指令系统的语法格式说起:     一条ARM指令语法格式分为如下几个部分:

haha_YM的博客 1442

ARM指令集详解

ARM指令集详解 1.       汇编 1.1.    通用寄存器   通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的低8位,也就是控制位 CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C) MSR - Load specified fields of...

简单博客 5万+

ARM寄存器及功能介绍/R0-R15寄存器

1、ARM 寄存器组介绍 ARM 处理器一般共有 37 个寄存器,其中包括: (1) 31 个通用寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。 (2) 6 个状态寄存器,都是 32 位的寄存器。 ARM 处理器共有 7 种不同的处理器模式: 用户模式(User),快速中断模式(FIQ),普通中断模式(IRQ),管理模式(Svc),数据访问中止模式(Abort),未定义指令中止模式(Und),系统模式(Sys), 在每一种处理器模式中有一组相应的寄存器。在任意一种处理器模式下,可见的寄存器包

pikachu的博客 3万+

ARM内核STM32学习笔记——Thumb-2指令集与ARM指令

摘录自 http://www.eefocus.com/book/09-08/793361276059991.html Thumb 指令集 Thumb 指令可以看作是ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16 位的代码密度。Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持ARM 指令集。因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的ARM 指令集,比如,所有异常自动进入ARM 状态。 在编写Thumb ...

SGJ_K的博客 8160

第三章 ARM指令

ARM指令的基本格式如下:其中<>号内的项是必须的,{ }号内的项是可选的。各项的说明如下:opcode:指令助记符;cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;operand2:第2个操作数;形式1:#immed_8r——常数表达式MOV R0,#1;R0 ←1R2与0x0F,结果保存在R1先将R1指向内存中的数存入R0之后,;传送完成后 R1← R1-4,后变址形式2:Rm——寄存器方式R1-R2→R1。

weixin_62515670的博客 1786

ARM 300问中的8位图立即数 研究

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

bournechen的专栏 3651
上一篇: ARM指令里几个特殊符号
下一篇: 贴上答案作参考--嵌入式研发工程师面试试题大全(ANSI C/C++方面的知识)
pinkmemoryld
博客等级 码龄18年 19粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值