有所追求
分类:
2009-03-15 18:52:37
周一又上班了,按照进度今天应该上电做蜂鸣器的实验,不过出了点小问题,电源丢了,还要买电源,那今天就看看C语言与汇编语言相互调用的文档吧。
在开发板给的光盘上有一个文档ATPCS.pdf说的应该就是这方面内容,还是先看看中文的吧,原来(\)是续行符号呀,今天第一次听说。
在C、C++程序中使用内嵌的汇编指令的注意事项:
1 在汇编指令中(,)用作分隔符。因此如果指令中的C表达式中包含有逗号,则该表达式应该包含在括号内。
2 在指令中谨慎的使用物理寄存器,特别是需要调用函数或程序段的时候。
3 不要使用物理寄存器去引用一个C变量
4 对于在内嵌汇编语言程序中使用到的寄存器,便一起在编译时会自动保存和恢复这些寄存器,用户不用保存和恢复这些寄存器。
我验证一下:
第一个:略
第二个:结果如图所示:
按照原来的设想应该是sum=500+500/5=600;在实际编译中将100给了R0然后相加结果变成了200,这是因为保存500/5的结果的是R0,破坏了R0原有的数据。
程序改为如图所示:设想的结果出来了,程序先把500放到R1里边去了,这样就不会被500/5的结果打扰。
第三个:很好理解,略
第四个:很好理解,略
从汇编程序中访问C程序变量(有这个必要吗?)
在C程序中声明的全局变量可以被汇编程序通过地址间接访问。1:先用IMPORT声明要用这个全局变量。2:用伪指令读入这个全局变量的地址。3:用相应的指令读取存储全局变量的值
前面所说的ATPCS.pdf我大略的找一下也为以后看着方便
关于ATPCS
什么是ATPCS,什么是PCS?
ATPCS即arm-thumb procedure call standard,PCS即procedure call standard.
PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。PCS规范强制实现如下约定:调用函数如何传参(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。PCS规范的制订是一系列指标的“tradeoff”(因为很大程度上涉及系统的一些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编译选项可以支持或不支持framepointer来支持深入调试功能或提高程序运行性能。
PCS是体系结构密切相关的,直接涉及编译器如何使用处理器提供的应用寄存器,如编译器使用什么寄存器作为栈指针,利用哪些寄存器作直接传参等。值得注意的是,没有谁规定说ATPCS是必须这样而不是那样的,它是应用相关的,任何一个操作系统和应用可以处于它自身的考虑定义自己的PCS,当然,如果那样,也必须有自己的编译器,而实际上,在一个处理器设计时,都会有某种假设,所以PCS某种程度上应该是一样的。
ATPCS是基于arm指令集和thumb指令集过程调用的规范。
寄存器的使用规则:
寄存器的使用必须满足下面的规则:
1. 子程序间通过寄存器R0 R3来传递参数,这时,寄存器R0R3可以记作A1-A4。被调用的子程序在返回前无需恢复寄存器R0-R3的内容。
2. 在子程序中,使用寄存器R4 R11来保存局部变量.这时,寄存器R4-R11可以记作V1-V8。如果在子程序中使用到了寄存器V1-V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4-R7来保存局部变量。
3. 寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。在子程序间的连接代码段中常有这种使用规则。
4. 寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。
5. 寄存器R14称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
6. 寄存器R15是程序计数器,记作pc。它不能用作其他用途。
Typically, the registers from r4 to r11 are used to hold the values of a routine’s local variables. They are also labeled v1-v8.
In all variants of the procedure call standard, registers r12-r15 have special roles. In these roles they are labeled IP, SP, LR and PC (or ip, sp, lr, and pc).
3、子程序调用: