📄 07 arm c.txt
字号:
7.1 编程设置
7.1.1 使用 Pragmas
check_printf_formats, 自动对printf类型函数中的字符串变量进行格式检查,对于函数中的非字符串变量不进行格式检查.
与 no_check_printf_formats 成对使用。
check_scanf_formats, 针对输入
debug / no_debug 生成,不成生调试信息
ospace / stime 优化空间,执行时间,
onum 0/1/2 优化级别,由低到高
check_stack / no_check_stack 检查 / 不检查数据栈溢出
softfp_linkage 指定编译器在生成代码时使用软件浮点链接。
import (symbol_name) 引入外部符号
arm section 指定后面函数或目标程序中用到的数据段或代码段。
7.1.2 使用关键词,(对 ANSIC 的扩展)
1.声明函数时使用
__asm 以下为汇编代码
__irqs 声明一个用作irq或者fiq异常中断的函数。
__pure 声明一个孤立的函数,该函数仅与输入参数有关.
__softfp 声明一个使用软件浮点链接的函数
__swi 声明的函数最多可接受四个整型参数,最多可返回4个 value_in_regs结构的结果.
__swi_indirect 指定通过寄存器R12传递操作代码到SWI处理程序.
__value_in_regs 声明的函数,指定编译器通过整型寄存器返回多达4个整型结果,也可以通过浮点寄存器返回多达4个浮点数或双精度数
__inline 内联函数,同C++中的 inline.
__weak 用于声明一个外部函数或外部对象.若链接器未找到该外部函数或者外部对象,链接器将不报告错误信息.若链接器无法解析该外部函数或外部对象,它将把该外部函数或者外部对象当作NULL处理.
2. 声明变量时使用
register 声明寄存器变量
__int64 同 long long
__global_reg(vreg) 将一个已经声明的变量分配到一个全局的整数寄存器中. __global_reg(2) int x;
3. 限定数据类型的关键词
__align(n) 限定对象的对齐.
__packed 限定对象为一字节对齐.
volatile 外部程序可能会修改该对象,编译时不优化对该对象的操作.
__weak 同上面的weak.
7.2 标准C/C++语言扩展
略过
7.3 C/C++语言数据类型
注意定义结构体时,如果紧凑地安排各个变量
7.4 C/C++语言和混合编程
注意: armasm 是高级汇编器,有时生成的代码会与用户希望的代码有所不同,并且不比ARM编译器生成的代码更有效.
另有些指令内嵌汇编器不支持,如为PC赋值引起程序跳转的低级指令.
1. 使用关键字嵌入汇编
__asm 适用C/C++.
asm 使用关键词 asm 来内嵌一段汇编代码
asm("instruction[;instruction]");
2. 嵌入式汇编与 armasm 之间的区别
嵌入式汇编:
不支持通过 (.) 批示符或{PC}获取当前指令地址
不支持"LDR Rn,=expr"伪指令而是使用"MOV Rn,expr"指令向寄存器赋值
不支持语句标号表达式
不支持ADR和ADRL伪指令
不支持BX指令
不能向PC赋值
必须使用 0x前缀代替"&"表示十六进制数.
当使用8位移位常导致CPSR的ALU标志更新时,NZCV标志中的C不具有真实的意义.
当使用物理寄存器时必须小心,
程序之间的互调
一般情况下,C与ASM间可以通过全局变量共享数据.
要访问一个全局变量,应该先使用 IMPORT伪指令引入这个全局变量,并利用LDR / STR指令根据全局变量的地址访问它们.
对于不同类型的变量,须采用不同选项的LDR / STR指令.
uchar 使用 LDRB / STRB 有符号 LDRSB / STRSB
ushort 使用 LDRH / STRH
uint 使用 LDR / STR
汇编调C
C调汇编
通过 EXPORT,IMPORT 声明.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -