立即数方式

3.汇编指令:【寻址方式】立即数寻址、寄存器寻址、存储器寻址 文章目录指令格式指令中的(目标 / 源)操作数来源一、立即数寻址二、寄存器寻址三、存储器寻址3.1 直接寻址3.2 寄存器间接寻址3.3 基址寻址3.4 变址寻址3.5 基址变址寻址3.6 带位移的基址加变址寻址方式3.7 小结---------------------------------------------------------------------------------寻址方式中容易出现的错误另类写法练习题第1题第2题 指令格式 指令中的(目标 / 源)操作数来源 立即数:四位十六 阅读详情
  立即数方式:每个立即数由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记作<immediate>,8位常数记作immed_8,4位的循环右移值记作rotate_imm,则有:

<immediate>=immed_8循环右移(2*rotate_imm)

这样并不是每一个32位的常数都是合法的立即数,只有能够通过上面构造方法得到的才是合法的立即数。

下面的常数是合法的立即数:

0xff,0x104,0xff0,oxff00

下面的数不能通过上述构造方法得到,则不是合法的立即数:

0x101,0x102,0xFF1

同时按照上面的构造方法,一个合法的立即数可能有多种编码方式。如0x3f0是一个合法的立即数,它可以采用下面两种的编码方式:

immed_8=0x3f,rotate_imm=oxe或者

immed_8=oxfc,rotate_imm=0xf

转换为二进制形式如下:

ox3f=0000 0000 0000 0000 0000 0000 0011 1111

oxe=14(十进制)     2*14=28

∴,ox3f循环右移28位得到如下:

0000 0000 0000 0000 0000 0011 1111 0000=ox3f0

immed_8=oxfc,rotate_imm=0xf 的转换如下:

oxfc=0000 0000 0000 0000 0000 0000 1111 1100

rotate_imm=oxf=15(十进制) 15*2=30

所以oxfc循环右移30位得到如下结果:

0000 0000 0000 0000 0000 0011 1111 0000=ox3f0

可以看出,结果是一样的!!!

但是,由于这种立即数的构造方法中包含循环移位操作,而循环移位操作会影响CPSR的条件标志位C。因此,痛一个合法的立即数由于采用了不同的编码方式,将使得某些质量的执行产生不同的结果,这是不能允许的。ARM汇编编译器按照下面的规则生成立即数的编码。

1.当立即数数值在0和0xFF范围时,零immmed_8=<immediate>,rotate_imm=0.、

2.其他情况下,汇编编译器选择使rotate_imm数值最小的编码方式。所以ox3f0的正确表示法是第一种。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

解释二:

一条典型的ARM指令语法格式分为如下几个部分:
  <opcode> {<cond>} {S}    <Rd> ,<Rn>{,<operand2>}
其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
   opcode      指令助记符,如LDR,STR 等
   cond        执行条件,如EQ,NE 等
   S           是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响
   Rd          目标寄存器
   Rn          第一个操作数的寄存器
operand2    第二个操作数

  其指令编码格式如下:
31-28 cond
27-25 001
24-21 opcode
20   S
19-16 Rn
15-12 Rd
11-0 (12位) operand2

对其中的operand2的常数表达式有这样的规定:“该常数必须对应8位位图, 即常数是由一个8位的常数循环右移偶数位得到的。”这句话的意思是说,当用12位第二操作数来表示一个32位立即数时,采用的是将8位数通过移位的方式来 实现的,其中12位第二操作数的低八位存放被移位的“基本”数(取值范围为0到255),而高四位存放的是循环右移的位数,因为是四位二进制数,所以取值 范围位为0到15,而对应的移位位数则为0到30位(因为移动的可能只有31种),也就是说若“移位”数为0,则表示“基本”数不变,若“移位”数为1, 则表示将“基本”数在32位数字空间中循环右移2位,若“移位”数为5,则表示将“基本”数在32位数字空间中循环右移10位,若“移位”数为10,则表 示将“基本”数在32位数字空间中循环右移20位,依次类推。举例表示:
     AND R1,R2,#0xff
     当处理器处理这条指令的第二操作数0xff时,因为0xff为8位二进制数,所以处理器就将其直接放进8位“基本”数中,而4位“移位”数则为0.
     AND R1,R2,#0x104
     当处理器处理这条指令的第二操作数0x104时,因为此时0x104已经超过了8位二进制数,所以处理器就要将其“改造”一下,我们先把0x104转换成 二进制0000 0000 0000 0000 0000 0001 0000 0100,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 0100 0001通过循环右移30位得到的,因此改造后的结果是8位“基本”数中存放0100 0001,而“移位”数为15。
     AND R1,R2,#0xff000000
     当处理器处理这条指令的第二操作数0xff000000时,处理器同样要对其“改造”,我们先把0xff000000转换成二进制1111 1111 0000 0000 0000 0000 0000 0000,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 1111 1111通过循环右移8位得到的,因此改造后的结果是8位“基本”数中存放1111 1111,而“移位”数为4。
我想,通过以上的 三个例子,就应该明白了8位位图的原理了。但是,有些数并不符合8位位图的原理,这样的数在进行程序编译时,系统将会提示出错,下面再举几个违反8位位图 的例子:比如0x101,转换成二进制后位0000 0000 0000 0000 0000 0001 0000 0001,像这个数,无论向右循环几位,都无法将两个1同时放到低8位中,因此不符合8位位图;再比如0x102,转换成二进制后位0000 0000 0000 0000 0000 0001 0000 0010,如果将两个1同时放到低8位中,即转换成二进制后为0000 0000 0000 0000 0000 0000 1000 0001,需要将此二进制数向右移31位,这也不符合循环右移偶数位的条件,因此0x012也不符合8位位图;再举一个0xff1,转换成二进制后将会有 9个1,不可能将其同时放入8位中,因此当然也不符合啦。
通过正反例的比较,可以总结如下:第一,判断一个数是否符合8位位图的原则,首先看这 个数转换成二进制后1的个数是否不超过8个,如果不超过8个,再看这n个1(n<=8)是否能同时放到8个二进制位中,如果可以放进去,再看这八个 二进制位是否可以循环右移偶数位得到起初被判断的那个数值,如果可以,则此数值即为符合8位位图原理,否则,不符合。第二,用12位的编码来表示一个任意 的32位数是不可能的,只能通过循环右移八位二进制数偶数位来得到一部分32位数,其余的无法表示的32位数,只有通过其它途径获得了,比如 0xffffff00,可以通过0x000000ff按位取反得到,因此在以后的编程中,一定要注意用到的第二操作数是否符合8位位图。

汇编中的寻址方式大揭秘:立即数、寄存器间接、偏移和复合寻址! 寻址方式就是CPU 如何找到操作数的方式。在汇编中,我们会用寻址方式来告诉汇编器数据在哪里,如何读取或写入数据。立即数寻址寄存器间接寻址偏移寻址复合寻址(超重要! 阅读详情

相关推荐

Python爬虫(一)京东商品价格及详情页抓取

这是一个以http://item.jd.com/2957726.html为例的单网页抓取案例 import urllib.request; #载入urllib.request,用于获取页面html源代码 from pandas import Series; #载入series包 from pandas import DataFrame; #载入dataframe包 from bs4 impo

Data Proc 1万+

单字节字符串、宽字符串和多字节字符串

调查报告:了解单字节字符串、宽字符串 和多字节字符串等C/C++语言字符串表示方 法,总结其原理、存储、操作、应用等特 征,并编制报告。 单字节字符串(Single-Byte): 原理:每个字符用一个字节表示。这就决定了单字节字符集不可能包含256个以上 的字符。单字节字符包含拉丁文字母表,重音字符(accented characters)及ASCII标准和DOS操作系统定义的图形字符。存储:一个...

ATOD 3017

自动化测试-自愈技术

随着人工智能的发展,作为一名软件测试工程师,相信大家都会思考如何把这一前沿技术引入到我们的自动化测试当中,想一万遍不如做一遍。,传递当前页面状态,获取之前成功的定位器路径,比较它们,并生成修复的定位器列表。如果修复成功,我们可以使用 Healenium Idea 插件更新我们的自动化测试代码:插件使用修复定位器寻找修复和更新测试代码。的旧定位器去定位按钮的时候,脚本就会报错,提示 “NoSuchElement”的错误异常。现在,我们假设开发人员变更了应用程序的UI界面,改变了这个按钮的id属性,从。

qq_58223744的博客 2660

ARM指令中的"8位图"立即数格式

ARM指令中的"8位图"立即数格式  (2012-02-25 22:06:46) 转载▼ 标签:  杂谈 分类: ARM 书中在介绍ARM指令格式的时候, 指出:"ARM MOV指令中, 第二个操作数 (operand2) 如果是常数表达式的话, 该常数须对应8位位图 (Pattern), 即常数是由一个8位的常数循环移位偶数

zhu8920253的专栏 4706

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 374

怀旧党必备!用iPhone4s重温iOS6的保姆级教程(含游戏资源包)

本文提供了一份详细的iPhone4s降级至iOS6.1.3的保姆级教程,包括设备准备、越狱操作、系统降级及资源优化全流程。通过自制固件和越狱工具,用户可以重温经典的拟物化设计和流畅体验,同时获取经典游戏资源包,打造复古游戏神器。

nft7creator的博客 884

颜色的表示

颜色表示 ARGB(一种色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构)A 是alpha值,称为颜色强度,范围为0-255的十进制数的16进制数表示,0xFF表示全强度(255),00指通道中无颜色即0,ARGB定义了四个颜色通道,0xFFFFFFFF代表各个通道都是全强度,为白色,0xFF000000代表黑色,在红、绿、蓝三种颜色均没有...

weixin_30827565的博客 959

Cyclone MAX独立编程实战:从硬件接口到SAP镜像的嵌入式烧录指南

在嵌入式系统开发与量产中,固件烧录是连接软件与硬件的关键环节。其核心原理是通过特定的调试接口(如JTAG、BDM)和编程算法,将编译后的机器码写入目标处理器的非易失性存储器。这项技术的价值在于确保软件在硬件上的可靠部署,是产品功能实现和质量保证的基础,广泛应用于汽车电子、工业控制等对一致性与可靠性要求极高的领域。独立编程器(Stand-Alone Programmer)在此基础上,通过集成存储、交互界面和任务逻辑,实现了脱离PC的自动化操作,极大提升了产线效率和现场维护的便捷性。本文以Cyclone MAX

weixin_34038293的博客 467

常用0x000000类型颜色代码表

"black"=>array( 0x000000),黑色  "maroon"=>array( 0x800000), 栗色 "green"=>array( 0x008000), 绿色 "olive"=>array( 0x808000), 橄榄色 "navy"=>array( 0x000080),  藏青色 "purple"=>array( 0x800080), 紫色 "teal"=>ar

Mendax的专栏 4641

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 814

北斗导航 | 卫星信号捕获跟踪原理解析

卫星信号的捕获与跟踪是导航接收机的"眼睛",其性能直接决定定位精度、动态适应性和抗干扰能力。随着北斗三号全球组网完成,新一代接收机正朝着。两大核心阶段,二者共同构成定位的基础。调制,频谱主瓣宽度达4.092MHz,较传统BPSK调制抗干扰能力提升3dB[38]。的目标持续演进,在自动驾驶、精密农业等领域展现出巨大应用潜力。二维空间中搜索峰值相关能量[4]。卫星导航接收机对信号的处理可分为。北斗三号B1C/B2a信号采用。北斗三号新增的B1C信号采用。

尘世冰封的专栏 775

【寻址方式】直接寻址、位寻址、立即数寻址、寄存器寻址等

概念: 寻址——找操作数 1,给出操作数; 2,直接按照给出数据为地址,寻址; 3,以给出数据为地址找到数据,再以找到的数据为地址,寻需要的操作数;     先读百度百科《寻址方式》:   http://baike.baidu.com/view/889427.htm       立即数寻址:   例如:MOV   AX,10H,采用的是立即数寻址方式,这条指令(包含操...

我的笔记本 3128

【Claude】媒体文件处理错误:PDF 与 Image 过大的检测与预处理方法 bug报错已解决

图片压缩是必须的:原始图片的 base64 会占用大量 TokenPDF 提取文本优于传图片:文本版 PDF 比扫描版更省 Token分块处理大文件:不要一次性处理整个大文件控制分辨率:800x800 通常足够 Claude 分析。

博客 6360

汇编-->操作数的寻址方式-->1.立即数寻址方式

汇编-->操作数的寻址方式-->1.立即数寻址方式

Fdseert的博客 810

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【汇编语言】8086汇编,快速搞定各种寻址方式:立即数寻址 / 寄存器寻址 / 存储器寻址

0 前言 众所周知,对于8086汇编语言,有几大寻址方式,不过我觉得这个好墨迹,会用就可以了,为什么命名这么多,这次只说本质,不说命名,至于命名,还是得知道,毕竟是大部分人公认的,不能反抗这点哦,但是你知道,不代表你真的要这么去想。 1 何为寻址?何为寻址方式? 看了很多资料,让人眼花缭乱,各种专业词汇让人眼花缭乱,扑朔迷离,我直接用最简练的语言说明。 寻址,就是找数据 寻址方式,就是找数据的方...

X 6829

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数据寻址的方式,这里讲了立即数和寄存器寻址

数据寻址的方式 总而言之,数据寻址就是通过地址查找操作数的方法 立即数寻址 寄存器寻址 有寄存器的就是寄存器寻址 简单快捷 还有段寄存器比如说,ds,cs,ss 存储器寻址 ...

qq_41967779的博客 1011

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

刘帅嵌入式系统-数据处理指令操作数寻址方式之立即数寻址

立即数寻址方式 #&lt;immediate&gt; 指令编码格式如下图所示: rotate_imm:4位循环右移值。即之前所提到的公式中的移位数。 immed_8:8位常数。参照下面的立即数公式。 指令操作数&lt;shiter_operand&gt;即为立即数#&lt;immediate&gt;,立即数#&lt;immediate&gt;的生成方式之前已经介绍,不在赘...

shuai532209720的博客 799

立即数方式(ARM)——彻底解析

有问题找狗找度娘------站在巨人的肩膀上,深深体会到了。全文转载自:找到原作者,但是作者所有博文里好像没有这篇文章,也就不指出链接了。 为什么会有这个疑问呢,还是在看U-BOOT第一阶段启动代码里发现的: mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)

wafx1314的专栏 4541

8086寻址方式实战:从立即数到基址变址的7种模式详解

本文详细解析8086微处理器的7种寻址方式,从立即数到基址变址模式,涵盖内存访问机制、寄存器组合规则及实战应用。通过具体代码示例和调试技巧,帮助开发者掌握8086汇编编程的核心技术,提升程序性能和效率。

u8v9w0x1y的博客 74

如何快速判断立即数

目录一、什么是立即数二、什么是立即寻址三、如何判断立即数 一、什么是立即数  要想判断立即数,首先要了解什么是立即数。 我们通常把在立即寻址方式指令中给出的数称为立即数。 立即数可以是8位、16位或32位,该数值紧跟在操作码之后。 如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。 二、什么是立即寻址  立即寻址方式的目的就是将操作数紧跟在操作码后面,与操作码一起放在指令代...

汤姆lazy的优快云博客 2万+

寻址方式 寄存器寻址方式 立即数寻址方式 存储器寻址方式: 直接寻址方式,寄存器间接寻址方式,变址和基址寻址方式,基址变址寻址方式 串操作寻址方式 I/O端口寻址方式

寻找操作数地址的方法共有八种: 寄存器寻址方式 立即数寻址方式 存储器寻址方式:( 直接寻址方式,寄存器间接寻址方式,变址和基址寻址方式,基址变址寻址方式) 串操作寻址方式 I/O端口寻址方式8086采用的是变字长指令格式,指令长度为1~6个字节,第一个字节包含操作码,第二个字节通常表示寻址方式,第三个到第六个字节表示位移量,立即数。1,寄存器寻址方式:指令所需的操作数在寄存器中,按指令

用心做事,用爱生活 8475

ARM汇编指令立即数规范和判断

转载 :https://blog.youkuaiyun.com/yunfenglw/article/details/41621103 在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必须是立即数。 在讨论什么是立即数,为什么有立即数,如何快速判断立即数之前,我们先来弄明白一个问题:什么不是立即数。 汇编指令是对数据(指令、数据)对象的操作,很关键的一个问题我们如何寻找我们的操作对象?汇编指令是一门关于寻址的艺术。ARM有九种寻址方式:1.寄存器寻址2.立即寻址3.寄存器移位寻址4.寄存器间接寻

weixin_44426124的博客 3102

ir指令、立即数的作用_指令的寻址方式

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)。注:(A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址。对应的(A)就是寄存...

weixin_39720516的博客 2288

合法的立即数的判断

立即数的定义: 每个立即数由一个8位的常数循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记为<immediate>, 8位常数记为immed_8, 4位的循环右移值记作rotate_imm, 则有: <immediate> = immed_8 ROR(2 * rotate_imm) 所以并不是每一个32位的常数都是合法的立即数...

aiduan6474的博客 445
上一篇: 关于VS2010调试时出现的找不到可执行文件问题的可能的解决办法
下一篇: 4乘4按键
KerNEL.AC.CN
博客等级 码龄15年 100粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值