微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux+ARMARM体系结构与编程(ARM汇编指令)

嵌入式Linux+ARMARM体系结构与编程(ARM汇编指令)

时间:11-09 来源:互联网 点击:
自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善。

1.汇编系统预定义的段名

.text @代码段
.data @初始化数据段
.bss @未初始化数据段
需要注意的是,源程序中.bss段应该在.text之前。

2.定义入口点
编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。

.text

.global _start

_start:

3 .word用法

word expression就是在当前位置放一个word型的值,这个值就是expression
举例来说,

_rWTCON:

.word 0x15300000
就是在当前地址,即_rWTCON处放一个值0x15300000

4.equ赋值操作,相当于c语言的宏定义

.equ MEM_CTRL_BASE, 0x48000000 //注意要加,号

5. 逻辑指令

AND―――――逻辑"与"操作指令

指令格式:

AND{cond}{S} Rd,Rn,operand2

AND指令将操作数operand2 与Rn 的值按位逻辑"与",结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响N、Z位,在计算第二操作数时,更新C位,不影响V位(指令ORR、EOR、BIC 对标志位的影响同AND 指令)。

指令示例:
ANDS R1,R1,R2 ;R1=R1&R2,并根据运算的结果更新标志位
AND R0,R0,#0x0F ;R0=R0&0x0F,取出R0最低4位数据。

ORR―――――逻辑"或"操作指令
指令格式:ORR{cond}{S} Rd,Rn,operand2 ORR指令将操作数operand2 与Rn 的值按位逻辑"或",结果存放到目的寄存器Rd 中。指令示例:
ORRS R1,R1,R2 ;R1=R1|R2,并根据运算的结果更新标志位

ORR R0,R0,#0x0F ;R0=R0|0x0F,将R0最低4位置1,其余位不变。

BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2

BIC指令将Rn 的值与操作数operand2 的反码按位逻辑"与",结果存放到目的寄存器Rd 中。

指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。

CMP―――――比较指令

指令格式:

CMP{cond} Rn,operand2

CMP指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与operand2比较是大、小、相等)反映在CPSR中,以便后面的指令根据条件标志决定程序的走向。CMP指令与SUBS指令完成的操作一样,只是CMP指令只减,不存结果。

指令示例:
cmp R0,R1 ;比较R0,R1
beq stop ;R0=R1跳到stop
blt less ;R0

Less:...
Stop:...

参考:

http://blog.csdn.net/denlee/article/details/2501182

嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时的初始化,进出中断时的环境保存、恢复,对性能要求非常苛刻的函数等。

1、相对跳转指令:b、bl
不同之处在于:bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。
跳转范围:当前指令的前后32M。
它们是与位置无关的指令。
示例:
b fun1
......
fun1:
bl fun2
......
fun2:
......

2、数据传送指令:mov,地址读取伪指令:ldr
mov指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器。
例:
mov r1, r2
mov r1, #4096
mov指令传送的常数必须能用立即数来表示。
当不知道一个数能否用立即数来表示时,可以使用ldr命令来赋值。ldr是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的指令:如果该常数能用立即数来表示,则使用mov指令;否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
例:
ldr r1, =4097
ldr本意为“大范围的地址读取伪指令”,以下是获得代码的绝对地址:
例:
ldr r1, =label
label:
......

3、内存访问指令:ldr、str、ldm、stm
ldr指令既可能是大范围的地址读取伪指令,也可能是内存访问指令。当它的第二个参数前面有“ = ”时,表示伪指令,否则表示内存访问指令。
ldr指令是从内存中读取数据到寄存器,str指令把寄存器的值存储到内存中,它们操作的数据都是32位的。
例:
ldr r1, [r2, #4] // 将地址为r2+4的内存单元数据读取到r1中
ldr r1, [r2] // 将地址为r2的内存单元数据读取到r1中
ldr r1, [r2], #4 // 将地址为r2的内存单元数据读取到r1中,然后r2=r2+4
str r1, [r2, #4] // 将r1的数据保存到地址为r2+4的内存单元中
str r1, [r2] // 将r1的数据保存到地址为r2的内存单元中
str r1, [r2], #4 // 将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4
ldm和stm属于批量内存访问指令,只用一条指令就可以读写多个数据。格式为:
ldm {cond} { ! } { ^ }
stm {cond} { ! } { ^ }
其中,{cond}表示指令的执行条件有:

条件码(cond)

助记符

含义

cpsr中条件标志位

0000

eq

相等

Z = 1

0001

ne

不相等

Z = 0

0010

cs/hs

无符号数大于/等于

C = 1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top