ARM汇编
汇编
概念
不同系统种汇编指令有差异
如何判断一个立即数是否合规:此数除以4,如果在0-255之间则合规。
0x102:是立即数
0x104:不是立即数
寻址模式
ARM堆栈
- 满堆栈:堆栈指针指向栈顶
- 空堆栈:堆栈指针指向栈底
- 递增堆栈:从低地址向高地址压栈
- 递减堆栈:从高地址向低地址压栈
汇编算数操作
内存操作
跳转与状态操作
跳转实质:给PC传程序地址,告诉CPU下一个执行的程序。
BL:mov LR,PC 这样执行完可以在LR中找到执行记录返回
常用伪指令
混合编程
- 在C/C++代码中嵌入汇编指令。
- 汇编调用C/C+
- C/C++调用汇编
C语言嵌入汇编
限制条件:
- 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令;
- 在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突;
- R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器;
在C中嵌入汇编指令
1 | void my_str_cpy(char *src,char *dest) |
C语言调用汇编
步骤:
- 汇编export
- c语言定义extern function
- c语言使用
C语言和汇编语言之间的参数传递是通过对应的用R0-R3来进行传递,即R0传递第一个参数,R1传递第二个参数,多于4个时借助栈完成,函数的返回值通过Ro来传递。这个规定叫作ATPCS(ARM Thumb Procedure Call Standard),具体见ATPCS规范
1 | myARM, , |
1 | extern void my_strcpy(char *src,char *dest); |
汇编调用C语言
步骤:
- c语言实现函数
- 汇编import函数名
- BL函数名
1 | myARM, , |
1 | int cFun(int a,int b,int c) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 吾辈之人,自当自强不息!!
评论