R13 (stack pointer)
R14 (Link Register)
R15 (program counter)
c语言中内嵌汇编的规则:
内嵌汇编器与armasm的区别:
访问全局变量:
unsigned char LDRB/ STRB
unsigned short LDRH/STRH
unsigned int LDR/STR
char LDRB/STRB
short LDRH/STRH
B 字节操作
H 双字节操作
c语言调用汇编程序
在汇编中使用EXPORT 伪指令声明本子程序,使其他程序可以调用该子程序
在c语言中使用extern来声明外部函数
汇编程序
特别注意其中R0,R1 为默认的第一个参数和第二个参数
函数名称只是一个标号而已,而其中的参数通过R0,R1来传输。
汇编中调用c语言
其中一个存在4个参数
汇编中调用方法
首先有一个import
然后将参数通过r0,r1,r2,r3,以及堆栈来传递数据
STR R3, [SP, #-4]!
满递增:
通过增大寄存器的地址向上增长, 堆栈指针指向内含有效数据项的最高地址
LDMFA/STRFA
空递增
通过增大寄存器的地址向上增长,堆栈指针直线堆栈上的第一个空位置
LDMED/STRED
空递减和空递增与上面的意思相对。
以入栈后SP的值是增加还是减少为依据,可将堆栈类型划分为递增堆栈(向上生长)和递减堆栈(向下生长);
STMFD SP!, {R1-R7, LR};将R1-R7以及LR,入栈满递减堆栈(FA 代表满),至于为何叫做递减???...疑问...
数据块传送
堆栈操作
说明
存储
压栈
STMDA
STMED
空递减
STMIA
STMEA
空递增
STMDB
STMFD
满递减
STMIB
STMFA
满递增
数据块传送
堆栈操作
说明
加载
出栈
LDMDA
LDMFA
满递增
LDMIA
LDMFD
满递减
LDMDB
LDMEA
空递增
LDMIB
LDMED
空递减
第二列中的ED、EA、FD、FA分别表示empty descend(空递减)、 empty ascend(空递增)、 full descend(满递减)、 full ascend(满递增),其含义是说,如果你采用的是空递减(空递增、满递减、满递增)堆栈的话,入栈操作则使用指令STMED(STMEA、STMFD、STMFA),出栈操作则使用指令LDMED(LDMEA、LDMFD、LDMFA)。从此你再也不会为你应该使用ia、ib、da还是db来实现出、入栈操作而苦恼了。
参考该文获得