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 许可协议。转载请注明来自 吾辈之人,自当自强不息!!
 评论





