目录
多寄存器访问指令与寻址方式
多寄存器内存访问指令
多寄存器内存访问指令的寻址方式
编辑
栈的种类与使用
栈的概念
栈的分类
栈的应用举例
叶子函数的调用过程举例
多寄存器访问指令与寻址方式
多寄存器内存访问指令
MOV R1, #1
MOV R2, #2
MOV R3, #3
MOV R4, #4
MOV R11,#0x40000020
STMIA R11!,{R1-R4}
先存储数据,后增长地址
STMIB R11!,{R1-R4}
先增长地址,后存储数据
STMDA R11!,{R1-R4}
先存储数据,后递减地址
STMDB R11!,{R1-R4}
 先递减地址,后存储数据 
多寄存器内存访问指令的寻址方式
多寄存器内存访问指令
MOV R1, #1
MOV R2, #2
MOV R3, #3
MOV R4, #4
MOV R11,#0x40000020
STM R11,{R1-R4}
将R1-R4寄存器中的数据写入到以R11为起始地址的内存空间中
LDM R11,{R6-R9}
将以R11为起始地址的内存空间中的数据读取到R6-R9寄存器中
        
当寄存器编号不连续时,使用逗号分隔
STM R11,{R1,R2,R4}
不管寄存器列表中的顺序如何,存取时永远是低地址对应小编号的寄存器
STM R11,{R3,R1,R4,R2}
自动索引照样适用于多寄存器内存访问指令
STM R11!,{R1-R4} 
栈的种类与使用
栈的概念
- 栈的本质就是一段内存,程序运行时用于保存一些临时数据
 - 如局部变量、函数的参数、返回值、以及程序跳转时需要保护的寄存器等
 
栈的分类
增栈:压栈时栈指针越来越大,出栈时栈指针越来越小
减栈:压栈时栈指针越来越小,出栈时栈指针越来越大
满栈:栈指针指向最后一次压入到栈中的数据,压栈时需要先移动栈指针到相邻位置然后再压栈
空栈:栈指针指向最后一次压入到栈中的数据的相邻位置,压栈时可直接压栈,之后需要将栈指针移动到相邻位置
栈分为空增(EA)、空减(ED)、满增(FA)、满减(FD)四种
ARM处理器一般使用满减栈
 栈的应用举例
 
叶子函数的调用过程举例
@ 初始化栈指针
MOV SP, #0x40000020
@ 主函数
MIAN:
    @ 设置R1和R2的值
    MOV R1, #3
    MOV R2, #5
    @ 调用FUNC1函数
    BL  FUNC1
    @ 将返回值加到R3中
    ADD R3, R1, R2
    @ 跳转到STOP循环
    B STOP
		
@ 非叶子函数FUNC1
FUNC1:
    @ 压栈保护现场
    STMFD SP!, {R1,R2,LR}
    @ 设置R1和R2的值
    MOV R1, #10
    MOV R2, #20
    @ 调用FUNC2函数
    BL  FUNC2
    @ 计算结果,保存在R3中
    SUB R3, R2, R1
    @ 出栈恢复现场
    LDMFD SP!, {R1,R2,LR}
    @ 返回到调用FUNC1函数的位置 
    MOV PC, LR
		
@ 叶子函数FUNC2
FUNC2:
    @ 压栈保护现场
    STMFD SP!, {R1,R2}
    @ 设置R1和R2的值
    MOV R1, #7
    MOV R2, #8
    @ 计算R1和R2的乘积,结果保存在R3中
    MUL R3, R1, R2
    @ 出栈恢复现场
    LDMFD SP!, {R1,R2}
    @ 返回到调用FUNC2函数的位置
    MOV PC, LR
@ STOP循环
STOP:
    B STOP
                



















