历史上的今天
今天是: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 

上一篇:ARM体系结构_DAY2
史海拾趣
|
各位老大,最近我刚开始研究6410的板子,手头上现有三星6410 PM 090416的BSP包,Nandflash型号是K9GAG08U0M 2G,用PM的包现在可以采用iRom方式从SD卡启动,但下载stepldr和Eboot不能从Nandflash启动,有谁知道都会有什么原因导致出现这个情况,我曾 ...… 查看全部问答> |
|
sqlce能在设备上直接创建和编辑数据库、或者sdf文件么?像access和sql server企业管理器一样的编辑数据库。如果行的话,应该怎么做?不行的话,能给我发一下创建数据库的代码么?谢谢!!!!… 查看全部问答> |
|
no input node cannot be assigned to input pin,我已有输入node不知道为什么会这么提示,还请各位大侠提示一下,谢谢… 查看全部问答> |
|
u-boot_smdkv210 分析三:启动代码lowlevel.s分析 u-boot_smdkv210 分析三:启动代码lowlevel.s分析_TEXT_BASE: .word TEXT_BASE .globl lowlevel_init lowlevel_init: push {lr} &n ...… 查看全部问答> |




