历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | ARM指令分类学习

2020-02-22 来源:eefocus

指令分类:


1、算数和逻辑指令


2、比较指令


3、跳转指令


4、移位指令


5、程序状态字访问指令


6、存储器访问指令


++++++++++++++++++++++++++++++++++++++++++++++++++


学习指令的资料《arm汇编手册(中文版).chm》 ,注:这个资料是 ARM汇编手册,我们用的是GNU的汇编,所以语法 大小写上是有差别的。

使用上一篇文章中的汇编程序来,学习使用每个指令的用法。


一、算数和逻辑指令


1、mov指令


作用、格式、例子


从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。


MOV{条件}{S}  ,    。其中必须是通用寄存器。 可以是通用寄存器,也可以是立即数。

汇编程序中使用@来添加注释。

JLink 连接好板子,PC机。板子nandflash启动。开启JLinkGDBServer,启动eclipse。

打开上一篇文章中的汇编程序工程。

直接在eclipse的工程项目中编辑start.s文件,

.text

.global _start

_start:

@mov指令释放

mov r1,#3

@ #3表示立即数,十进制3

mov r2,r1

mov r3,#10


clean,编译,调试。

查看寄存器的值,寄存器的值可以使用16进制来展示,右键菜单选项进行设置。


2、MVN : 传送取反的值


  MVN{条件}{S}  ,


 ( 使用C语言的表示方法:dest = !op_1)将 按位取反之后,赋值给


例子:

mvn r1,#ob10

@ #ob10 表示二进制数  10

mvn r2,#5

mvn r3,r1

------------------

r1的值应该是 二进制 10 按位取反之后的值: 11111111111111111111111111111101


r3的值应该是r1取反的值  即二进制  10

3、SUB : 减法


  SUB{条件}{S}  , ,


                dest = op_1 - op_2

SUB 用操作数 one 减去操作数 two,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值


4、ADD : 加法


5、AND : 逻辑与


  AND{条件}{S}  , ,


                dest = op_1 AND op_2


----------------------------------

  Op_1   Op_2   结果


  0      0      0

  0      1      0

  1      0      0

  1      1      1


.text

.global _start

_start:

mov r0,#0

mov r1,#1

mov r2,#3

and r3,r0,r1

@r3的值是0

and r4,r1,r2

@r4的值是1

6、BIC : 位清除


BIC{条件}{S}  , ,

BIC 是在一个字中清除位的一种方法。操作数 2 是一个 32 位位掩码(mask)。如果如果在掩码中设置了某一位,则清除这一位。未设置的掩码位指示此位保持不变。


例子:

r0 的值是二进制  10111111

掩码是   101

则结果是    10111010

掩码是1 则清楚对应位,置为0

掩码是0,则不做操作。

.text

.global _start

_start:

mov r1,#0b101011

bic r2,r1,#0b101

@r2的值应该是 0b101010


二、比较指令

1、cmp : 比较(Compare)

比较的结果保存在程序状态寄存器,CPSR的 N ,Z 位

N: 0  操作数 one大于操作数two


      1 操作数 one小于操作数two


Z:  1 表示比较的结果是两个数相等


.text

.global _start

_start:

mov r1,#1

cmp r1,#3

2、TST : 测试位

操作数one跟操作数two按位与操作,结果影响CPSR的Z位

Status = op_1 AND op_2

Status 0  CPSR Z位 是1

Status 1  CPSR Z位 是0

 

四、跳转指令(分支指令)


C语言中 if else分支,在汇编中是如何实现的?


1、b


b{条件}  <地址>

{条件}的相关知识在:

GT : 大于(有符号)如果一次比较之后...

设置了 N 标志并设置了 V 标志

或者...

清除了 N 标志并清除了 V 

标志

并且...

清除了 Z 标志。 

示例:

mov r1,#7

mov r2,#3

cmp r1,r2

bgt branch

add r3,r1,r2

b end

branch:

sub r3,r1,r2

end:

nop


bgt branch: 满足条件跳转到 branch标号处。

b end: 无条件跳转到end标号处。



2、bl  带连接的分支


bl会把下一条指令的地址保存到lr寄存器当中。以便函数能够正常返回到调用的地方。


在汇编中实现函数的调用,返回


mov r3,#1


bl func1 @调用函数 func1


mov r1,#6


func1:


mov r1,#2


mov r2,#3


mov pc,lr


@注意lr寄存器,bl指令能够把跳转地址的下一条指令保存到lr中,可以通过反汇编来看到lr的地址是哪个指令操作的地址。


mov r3,#3


五、移位指令


1、LSL 逻辑左移


mov r1, #0b1


mov r1, r1, lsl#1


@r1的值最终为 0b10


2、ROR 循环右移


mov r1, #0b11


mov r1, r1, ror#1


@r1 的最终结果  1........1


六、程序状态字访问指令


需要特殊的指令来访问,修改CPSR寄存器


msr  把通用寄存器写入到CSPR寄存器中


mrs 把程序状态字搬移到通用寄存器


mrs r0, cpsr  @把cpsr的值赋值给 r0


orr r0, #0b100  @把r0 的第三位置为1


msr cpsr, r0 @把r0的值赋值给cpsr


七、存储器访问指令


内存的值到寄存器 ldr


寄存器的值到内存 str


mov r0, 0xff


str r0,  [r1]  @把r0的值赋值给,以r1的值为地址的内存中。


@在调试时,认为的修改 r1的值为 0x30001000 ,(2440的开发板)


@调试界面打开Memory窗口,观察 内存地址为 0x30001000 的数据是否是  0xff


ldr r2,  [r1]


@以r1的值作为内存的地址,把该内存地址上的值赋值给r2 ,应该是 0xff

推荐阅读

史海拾趣

ERNI公司的发展小趣事

1947年,瑞士工程师Ernst Rudolf Erni和他的妻子Elsa在瑞士那提空(Nänikon)共同创立了“ERNI & CO.”公司。他们的首个订单是为苏黎世克洛腾机场开发地雷探测器和机场导航灯。这个起点虽小,但为ERNI日后在电子行业的辉煌奠定了基础。随着订单的增多,公司逐渐扩大了生产规模,并开始涉足继电器、电气设备等领域。

中微股份(Cmsemicon)公司的发展小趣事

作为一家以技术创新为核心竞争力的企业,中微股份(Cmsemicon)始终坚持以市场需求为导向,持续推动技术创新和产品升级。近年来,公司在刻蚀设备领域取得了一系列重要突破,包括成功研制出针对先进逻辑和存储器件制造中关键刻蚀工艺的高端产品等。这些技术成果不仅提升了公司的核心竞争力,也为行业的发展做出了积极贡献。

3M公司的发展小趣事

在刻蚀设备领域取得成功后,中微并没有满足于现状,而是积极拓展多领域,实现业务多元化。2012年,公司完成了首台MOCVD设备的研制,成功进入薄膜沉积领域。2016年,公司又完成了首台ICP刻蚀设备的研制,进一步巩固了在刻蚀设备领域的领先地位。此外,公司还在环保领域有所布局,成功研制出首台VOC设备。这些举措不仅丰富了公司的产品线,也为公司带来了更多的市场机遇。

Advanced Ceramic X Corporation公司的发展小趣事

中微股份(Cmsemicon)的起点可以追溯到2004年,当时公司以刻蚀设备为核心业务,致力于引领中国刻蚀技术水平的提升。经过几年的不懈努力,2007年,中微成功研制出首台CCP刻蚀设备,这一里程碑标志着公司在刻蚀设备领域取得了重大突破。此后,公司不断突破技术壁垒,2011年刻蚀设备达到45nm工艺节点,2013年达到22nm,2016年更是达到了14nm,并当前已量产5nm工艺节点设备。这些技术成果不仅证明了中微在刻蚀设备领域的实力,也为公司的后续发展奠定了坚实基础。

Good Will Instrument Co., Ltd.公司的发展小趣事

2019年,中微股份(Cmsemicon)迎来了又一个重要时刻——成为科创板首批上市公司之一。这一荣誉不仅是对公司过去成绩的肯定,也为公司的未来发展提供了更多的资金支持。上市以来,公司充分利用资本市场的优势,加大研发投入,推动技术创新和产品升级。同时,公司还积极拓展国际市场,提升品牌影响力。

Digitron公司的发展小趣事

Digitron公司成立于XXXX年,由一群热衷于电子技术的工程师和科学家创立。在成立初期,公司专注于开发高精度、高可靠性的温度数据记录器。这些设备在医药、冷链物流等领域得到了广泛应用,为Digitron公司赢得了良好的声誉。随着技术的不断进步,Digitron公司逐渐扩大了产品线,推出了更多适用于不同行业的数据记录器和传感器。

问答坊 | AI 解惑

内存操作的疑问

wince6.0应用程序不能直接访问内存。这是为什么呀?什么原因呀?WINCE5可以吗?为什么不能仿问呀!用MAP成虚拟地址也不能仿问吗?…

查看全部问答>

6410 MLC 如何才能从nandflash启动

各位老大,最近我刚开始研究6410的板子,手头上现有三星6410 PM 090416的BSP包,Nandflash型号是K9GAG08U0M 2G,用PM的包现在可以采用iRom方式从SD卡启动,但下载stepldr和Eboot不能从Nandflash启动,有谁知道都会有什么原因导致出现这个情况,我曾 ...…

查看全部问答>

sqlce如何在嵌入式设备上建立数据库以及sdf文件?

sqlce能在设备上直接创建和编辑数据库、或者sdf文件么?像access和sql server企业管理器一样的编辑数据库。如果行的话,应该怎么做?不行的话,能给我发一下创建数据库的代码么?谢谢!!!!…

查看全部问答>

TXT文本生成问题

我用的是VB.NET 2003,开发一个WIN CE4.2和程序,我的界面有一个文本框,一个button按钮,我想在文本框里输入字符,然后按button按钮后生成一个UP.TXT文档,我想要每按一次按钮就生成一行数据,然后换行,等待文本档的输入,按button按钮再生成一行 ...…

查看全部问答>

QuartusII 管脚分配提示错误

no input node cannot be assigned to input pin,我已有输入node不知道为什么会这么提示,还请各位大侠提示一下,谢谢…

查看全部问答>

谁有LaunchPad的电路图啊 谢谢!!!

本科毕业时同学给了我套LaunchPad,最近想玩玩   可惜没有电路图…

查看全部问答>

TA疑问

这是MSP430F5438用户手册关于TA的连续增加方式的介绍,提到到达0FFFFh后回到0开始下一个周期。 这是Ti提供的例程,里面初始化时却对TA1CCR0赋值,并不是0FFFFh,我有点疑惑,两者存在矛盾呀…

查看全部问答>

u-boot_smdkv210 分析三:启动代码lowlevel.s分析

u-boot_smdkv210 分析三:启动代码lowlevel.s分析_TEXT_BASE: .word TEXT_BASE .globl lowlevel_init lowlevel_init: push {lr}                        &n ...…

查看全部问答>

stm32掉电讨论

stm32掉电时发现,sram里的变量会变,例如有个变量fault=3,在掉电的过程中,fault会变为零。为了解决这个问题,我使用了掉电检测,发现PVD0在掉电的时候也会变来变去,一回为0一回为1。大家遇到过这个问题没有,怎么解决。 …

查看全部问答>