汇编语言与C的混合编程.ppt

汇编语言与C的混合编程.ppt

ID:48178157

大小:159.50 KB

页数:33页

时间:2020-01-16

汇编语言与C的混合编程.ppt_第1页
汇编语言与C的混合编程.ppt_第2页
汇编语言与C的混合编程.ppt_第3页
汇编语言与C的混合编程.ppt_第4页
汇编语言与C的混合编程.ppt_第5页
资源描述:

《汇编语言与C的混合编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、嵌入式系统中汇编语言与C语言的混合编程1内嵌汇编器内嵌汇编器指的是包含在C编译器中的汇编器。使用内嵌汇编器后,就可以在C源程序中直接使用大部分的ARM指令和Thumb指令,可以在C程序中实现C语言不能够完成的一些操作,同时程序的代码效率也比较高。内嵌汇编器的汇编指令包括大部分ARM指令和Thumb指令,但由于它嵌入在C程序中使用,故在用法上有一些特点。1.1操作数内嵌的汇编指令中作为操作数的寄存器和常量可以是C表达式。这些表达式可以是char、short或者int类型,而且这些表达式都是作为无符号数进行操作。如果需要带符号数,则用户需要自己处理与符号有关的操作。编译器将会计算这些表达式的值,

2、并为其分配寄存器。当汇编指令中同时用到了物理寄存器和C的表达式时,要注意使用的表达式不要过于复杂。因为表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。当编译器发现了寄存器的分配冲突时,会产生相应的错误信息,报告寄存器分配冲突。1.2物理寄存器在内嵌的汇编指令中使用物理寄存器有一下限制:不能直接向PC寄存器中赋值,程序的跳转只能通过B指令和BL指令实现。在使用物理寄存器的内嵌汇编指令中,不要使用过于复杂的C表达式,因为当表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。编译器可能会使用R1寄存器或者R13寄存器存

3、放编译的中间结果,在计算表达式值时可能会将寄存器R0~R3、R2以及R14用于子程序的调用。因此在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理寄存器。在内嵌的汇编指令中使用物理寄存器时,如果有C变量使用了该物理寄存器,编译器将在合适的时候保存并恢复该变量的值。需要注意的是,当寄存器sp、sl、fp以及sb用做特定的用途时,编译器不能恢复这些寄存器的值。通常推荐在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而可能影响代码的效率。1.3常量在内嵌的汇编指令中,常量前的符号#可以省略。如果在一个表达式前使用#,则该表达式必须是一个#。1.4指令展开内嵌的汇编

4、指令中如果包含常量操作数,则该指令可能会被汇编器展开成几条指令。例如指令:ADDR0,R0,#1023可能会被展开成下面的指令序列ADDR0,R0,#1024SUBR0,R0,#01乘法指令MUL可能会被展开成一系列的加法操作和移位操作。事实上,除了与协处理器相关的指令外,大部分的ARM指令和Thumb指令中包含常量操作数都可能被展开成多条指令。各展开的指令对于CPSR寄存器中的各条件标志位的影响如下:算术指令可以正确地设置CPSR寄存器中的NZCV条件标志位。逻辑指令可以正确地设置CPSR寄存器中的NZ条件标志位、不映像V条件标志位和破坏C条件标志位。1.5标号C程序中的标号可以被内嵌的汇

5、编指令使用。但是只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。指令B使用C/C++程序中的标号时语法格式如下:B{cond}label1.6内存单元的分配所用的分配都是通过C程序完成的,分配的内存单元通过变量供内嵌的汇编器使用。内嵌汇编器不支持汇编语言中用于内存分配的伪操作。1.7SWI和BL指令的使用在内嵌的SWI和BL指令中,除了正常的操作数域外,还必须增加下面3个可选的寄存器列表。第1个寄存器列表中的寄存器用于存放输入的参数。第2个寄存器列表中的寄存器用于存放返回的结果。第3个寄存器列表中的寄存器的内容可能被所调用的子程序破坏,即这些寄存器是供所调用的子程序作为工作

6、寄存器的。2内嵌的汇编器和armasm的区别与armasm相比,内嵌的汇编器在功能和使用方法上主要有以下特点:使用内嵌的汇编器,不能通过寄存器PC返回当前指令的地址。内嵌的汇编器不支持伪指令“LDRRn,=expression”,这条伪指令可以用指令“MOVRn,expression”来代替。不支持标号表达式。不支持ADR、ADRL伪指令。十六进制数钱要使用前缀Ox,不能使用&。编译器可能使用寄存器R0~R3、ip及例如存放中间结果,因此在使用这些编译器时要非常小心。CPSR寄存器中的NZCV条件标志位可能会被编译器破坏,因此在指令中使用这些标志位时要非常小心。指令中使用的C变量不要与任何物

7、理寄存器同名,否则会造成混乱。LDM与STM指令的寄存器列表中只能使用物理寄存器,不能使用C表达式。指令不能写寄存器PC。不支持指令BX及BLX。用户不要维护数据栈。通常编译器根据需要自动保存和回复工作寄存器的值,用户不需要去保护和恢复这些寄存器的值。用户可以改变处理器模式,但是编译器并不了解处理器模式的改变。这样,如果用户改变了处理器模式,将不能使用原来的C表达式;重新恢复到原来的处理器模式后,才能再使用这

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。