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来实现出、入栈操作而苦恼了。
参考该文获得