关闭

ARM GNU汇编入门

标签: armgnu汇编mcrldr
377人阅读 评论(0) 收藏 举报
分类:
多寄存器加载存储指令:
1.LDMIA指令、LDMIB指令、LDMDB指令、LDMDA指令
     (1)LDMIA指令,IA表示每次传送后地址加4
(2)LDMIB指令,每次传送前地址加四
(3)LDMDB指令,每次传送前地址减4
(4)LDMDA指令,每次传送后地址减4

2.下面来看看STMIA指令、STMIB指令、STMDB指令、STMDA指令
(1)STMIA指令, STMIA R0,{R1,R2,R3,R4}  ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IA传送后地址加4,所以这里内存当中的地址是从0x8004开始变化的
(2)STMIB指令, STMIB R0,{R1,R2,R3,R4}  ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IB每次传送前地址加4,所以内存中的值是从0x8008开始变化的
(3)STMDB指令, STMDB R0,{R1,R2,R3,R4}  ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,DB每次传送后地址减4,所以内存中的值是从0x8010开始递减变化的
(4)STMDA与上面STMDB指令类似,DA是每次传送后地址减4
3、ldr (LDR)
LDR   R1,     [R2]
就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register)
4、STR
STR    R1,     [R2]
就是把寄存器R1中的内容“保存”到R2所指向的存储的单元中(一个memory地址)
5、ldm(LDM)出栈操作
LDMFD     SP! ,   {R0, R1, R2}
把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去
6、stm(STM)
STMFD      SP!,   {R0}
把R0保存到堆栈(sp指向的地址)中。
7、adr(ADR)
ADR   R1,  _start
取的是相对地址的值
特殊功能寄存器访问

1、MRS
MRS R0,CPSR ;传送CPSR 的内容到R0
MRS R0,SPSR ;传送SPSR 的内容到R0
2、MSR
通常用于恢复或改变程序状态寄存器的内容
MSR CPSR,R0 ;传送R0 的内容到CPSR
MSR SPSR,R0 ;传送R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域



ne 不相等
gt 大于
lt 小于
ge 大于等于
le 小于等于


and 与
orr 或 orr r8,r8,#1000
eor 异或


bic 位清零 bic r8,r8,#1000,第12位清0
lsl 逻辑左移操作
asl 算数左移
asr 算数右移 移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。
cmp 相减与零比较指令 cmp r0,#1通常与beq,bne连用
cmn 相加比较指令 cmn r1,r0;
tst 位与比较指令
teq 位异或比较指令
beq 为0跳转指令
bne 不为0跳转指令
add 相加指令
sub 相减指令 subs 时改变转态位
mov 模糊指令数据传送 mov r1,#4;mov r0,r1
ldr 单一存储指令 ldr r1,[r0,#-4]将r0-4存储单元的数据复制到r1中
ldm 多项处理指令加载指令 ldmia r0!,{r1-r3,r4}将r0存储空间的值读出到r1-r4中,r0自动加1  ldmfd出栈
str 单一存储指令 str r1,[r0,#-4]r1的数据放到r0-4存储单元中
stm 多项处理器指令存储指令 stmia r0!,{r1-r3,r4}将r1-r4的值保持到r0中,r0自动加1 stmfd sp!,{r1-r3,r4} r1-r4进栈
mcr 协处理器操作指令 mcr p15,0,r8,c1,c0,0 通用寄存器r8内存单元值写到p15协处理器内存单元中
mrc 协处理指令 mrc p15,0,r8,c1,c0,0 协处理器内存单元读到普通寄存器内存单元
msr 状态寄存器操作读出指令 msr cpsr,r0 把r0存储空间里的值读到cpsr0
mrs 状态寄存器操作读出指令 mrs r0,cpsr 把cpsr 读到r0存储空间里
swp 间接寻址




0
0
查看评论

GNU风格 ARM汇编语法指南(非常详细)1

转自:GNU风格 ARM汇编语法指南(非常详细)1 汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作 ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。 1、  GNU汇编语言语句格式     任何...
  • kevinshq
  • kevinshq
  • 2012-11-27 10:20
  • 2289

GNU ARM汇编--(十五)linux下的printascii

在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kerne...
  • dndxhej
  • dndxhej
  • 2012-10-04 23:09
  • 4842

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

 转载:http://9291927.blog.51cto.com/9281927/1786070 不同的汇编器对汇编语言的语法要求不一样。目前常用的ARM汇编环境有以下两种:     A、ARM ASM:ARM公司的汇编器,适合在Wi...
  • qr_ljj
  • qr_ljj
  • 2016-11-08 23:01
  • 453

GNU风格 ARM 汇编指令语法总结

汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作 ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。 1、  GNU汇编语言语句格式    任何Linux汇编行都是如下结构:[:][i...
  • yanbixing123
  • yanbixing123
  • 2016-08-24 15:28
  • 1506

GNU风格ARM汇编编程实战之一 <C与汇编混合编程>

一、参考资料
  • gfvvz1
  • gfvvz1
  • 2014-05-30 15:48
  • 2357

GNU ARM 汇编伪指令备忘录

gnu arm 汇编伪指令 GNU arm 汇编伪指令 section section name flags text size space type macro endm exitm algin global ltorg int long byte short long quad string...
  • eibo51
  • eibo51
  • 2016-02-04 17:19
  • 681

GNU ARM 汇编指令(注意是GNU,区别与armasm)

GNU ARM 汇编指令(注意是GNU)
  • gx19862005
  • gx19862005
  • 2014-06-23 17:25
  • 2059

Gnu arm汇编说明 包括链接脚本文件的使用

1.        汇编系统预定义段名:.text: @代码段;.data: @初始化数据段;.bss: @为初始化数据段;注意:源程序中的.bss段应该位于.data之前;2.    &#...
  • zhangdi19821125
  • zhangdi19821125
  • 2010-06-09 16:10
  • 1059

GNU ARM汇编入门

第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.g...
  • aaaaaaaaaabc
  • aaaaaaaaaabc
  • 2010-04-03 15:52
  • 187

arm 汇编——宏

详细介绍了arm汇编对于宏的操作 里面给出了两个例子 通过这两个例子可以很容易的理解gnu和arm汇编的不同点 这样也是一种方便的对比学习方法
  • xuweiwei1860
  • xuweiwei1860
  • 2014-04-10 19:17
  • 890
    个人资料
    • 访问:10723次
    • 积分:223
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:14篇
    • 译文:0篇
    • 评论:3条
    最新评论