详细的汇编指令就不一一介绍了。介绍一些特点
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、栈的分类
一般我们用的满减栈较多
4、批量加载存储数据LDM/STM
寄存器传送顺序是固定的,不能被改变
最小数字的寄存器总是被对应到存储器的最低地址上。
LDMIA / STMIA Increment After (先操作,后地址增加)
LDMIB / STMIB Increment Before (先地址增加,后操作)
LDMDA / STMDA Decrement After (先操作,后地址递减)
LDMDB / STMDB Decrement Before (先地址递减,后操作)
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}
;练习-模拟子程序调用
;初始化栈
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 恢复原来的值,再继续进行计算
在中断或子函数调用发生时,都会进行类似的过程。