ARM汇编

详细的汇编指令就不一一介绍了。介绍一些特点

1、汇编文件中的符号

      1.指令:编译完成后作为一条指令存储在内存单元当中,CPU执行时能完成一定的操作
2.伪操作:不会生成代码也不会占用内存,告诉编译器怎样编译,比如标号
3.伪指令:本身不是指令,编译器在编译的时候将其替换成CPU能识别的指令,比如NOP,NOP指令我们知道是让CPU执行一个空操作,但实际CPU不可能执行所谓空操作,实际指令是 MOV R0, R0。

2、指令

     1.数据操作指令:对数据进行逻辑、数学等运算与处理
     2.跳转指令:实现程序的跳转,实质是修改PC
     3.Load/Store:对内存的读写操作
     4.状态寄存器传送指令:对CPSR进行读写操作
     5.异常中断产生指令:触发软中断
     6.协处理器指令:操作协处理器的指令

3、栈的分类

栈是内存中用于暂时存储数据,栈可以分为满增栈、满减栈、空增栈、空减栈。“满”的意思是当前PC指针指向地址空间已经有了数据。存储数据时需要先移动指针,再存储数据。加载数据时,则是先移动指针再加载数据。

如上图,当前PC指针指向的地址空间已经存储了数据。。
“空”则表示当前PC指针指向的地址空间没有存储数据,存储数据时需要先存储数据,再移动指针。加载数据时,则是先加载数据再移动指针

“增”,“减”则表示栈的增长方向,存储数据是栈是增长就是增栈,减小就是减栈,与前面的满空结合,就出现了4种结果
1、满减 2、满增 3、空减 4、空增


  

一般我们用的满减栈较多

4、批量加载存储数据LDM/STM

LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。
寄存器传送顺序是固定的,不能被改变
最小数字的寄存器总是被对应到存储器的最低地址上。

根据我们上面讲的栈的形式,批量加载存储数据会有不同
4 种寻址操作:
 LDMIA / STMIA Increment  After   (先操作,后地址增加)
 LDMIB / STMIB Increment  Before (先地址增加,后操作)
 LDMDA / STMDA Decrement After   (先操作,后地址递减)
 LDMDB / STMDB Decrement Before (先地址递减,后操作)

可以拿下面这段代码去试一下,看看什么效果
mov r1, #1
mov r2, #2
mov r3, #3
mov r4, #4
mov r5, #5
mov r11, #0x40000020
stmia r11!, {r1-r5}
;先存储数据  后增长地址
stmib r11!, {r1-r5}
;先增长地址  后存储数据
stmda r11!, {r1-r5}
;先存储数据  后递减地址
stmdb r11!, {r1-r5}
;先递减地址  后存储数据
;ldmdb r11!, {r6-r10}
 我们看一下stmia的结果,r1-r5分别被保存到0X40000020-0X40000030,执行完毕后,r11地址为0X40000034.可以操作一下其他几个看一下结果。
        
批量操作一般在压栈、入栈时候使用,比如在中断时的现场保护。在常用的满减栈中,压栈时我们用stmdb,出栈时我们用ldmia,其他类型的栈可以思考一下入栈出栈应该分别如何操作。这样相对来说有点麻烦,ARM指令有更加简便的
满减栈:stmfd,ldmfd(fd表示full decreacse) 相当于stmdb和ldmia
满增栈:stmfi,ldmfi(fi表示full increasement)
空减栈:stmed,ldmed(ed表示empty decreacse
满增栈:stmei,ldmei(ed表示empty increasement)


;练习-模拟子程序调用


;初始化栈
MOV SP, #0x40000020
MAIN
MOV R1, #3
MOV R2, #5
BL FUNC
ADD R3, R1, R2
B STOP


FUNC
;压栈保护现场
STMFD SP!, {R1,R2}
MOV R1, #10
MOV R2, #20
SUB R3, R2, R1
;出栈恢复现场
LDMFD SP!, {R1,R2}
MOV PC, LR


STOP
B STOP

MAIN函数中对R1 R2赋值


进入子函数FUNC,首先将R1 R2压入栈中,再对R1 R2赋值

        

子函数要结束时,将R1 R2出栈,R1 R2 恢复原来的值,再继续进行计算

       

在中断或子函数调用发生时,都会进行类似的过程。














  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值