在线等 汇编调用C语言 混合编程 嵌入式ARM (汇编调试的各种命令)
本文目录导航:
嵌入式ARM 混合编程,汇编调用C语言,在线等
段定义前加 PRESERVE8 伪指令试一下。
前两天刚好看到 ARM UCOS 汇编代码中用到PRESERVE8这个关键字(加在段定义之前),以前没见过的,于是网络。
1.汇编代码没有保持8字节栈对齐而调用C或C++代码。
下的代码用RVDS2.2编译时,即使已经8字节栈对齐,连接器也将之当作非8字节栈对齐。
所以要用伪指令指明一下。
E文不好,故而附原文以供参详:where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and when attempting to link legacy SDT/ADS objects with RVCT 2.x objects. Legacy SDT/ADS objects that do not have these attributes are treated as ~PRES8, even if they do actually happen to preserve 8-byte alignment.

编写一段代码使用C语言嵌人汇编程序,在汇编程序中实现求两个数的最大公约数
在C语言中嵌入汇编代码可以使用`asm`关键字,具体的实现方式取决于所使用的编译器和平台。
下面是一个简单的示例代码,使用C语言嵌入汇编程序来求两个数的最大公约数:```c#include <stdio.h>int gcd(int a, int b) {int result;asm volatile(mov %1, %%eax\n// 将a的值放入eax寄存器mov %2, %%ebx\n// 将b的值放入ebx寄存器cmp $0, %%ebx\n// 将b与0比较je end\n // 如果b等于0,跳转到end标签gcd_loop:\n// 定义gcd_loop标签mov %%ebx, %%edx\n// 将ebx的值放入edx寄存器mov $0, %%ebx\n // 将0放入ebx寄存器idiv %%edx\n// edx:eax除以edx,结果保存在eax,余数保存在edxmov %%edx, %%eax\n// 将edx的值放入eax寄存器cmp $0, %%eax\n // 将eax与0比较jne gcd_loop\n// 如果eax不等于0,跳转到gcd_loop标签mov %%edx, %0\n // 将edx的值保存到result变量中end:\n// 定义end标签: =r (result) // 输出寄存器,将结果保存到result变量中: r (a), r (b)// 输入寄存器,将a和b的值传入汇编代码: eax, ebx, edx // 被修改的寄存器);return result;}int main() {int a, b;printf(请输入两个整数:);scanf(%d %d, &a, &b);int result = gcd(a, b);printf(最大公约数为:%d\n, result);return 0;}```在上面的代码中,汇编部分通过使用寄存器来进行数值的操作和判断,求得最大公约数后,将结果保存在C语言的变量`result`中,并返回给调用函数。
请注意,这只是一个简单示例,实际使用时需要根据编译器和平台的不同进行适当的调整。
汇编和c语言如何结合的?
汇编语言具有运行速度快的优势,而高级语言则在占用存储空间和运行时间方面具有明显优势。
因此,高级语言与汇编语言各有千秋。
在某些情况下,我们可能会遇到高级语言编程速度不够,而全部采用汇编语言编程工作量又巨大的问题。
此时,可以采用“混合”编程方法,即高级语言和汇编语言互相调用,进行参数传递,共享数据结构和数据信息。
这种方法可以充分发挥各种语言的优势,充分利用现有的多种实用程序和库程序,大大缩短软件开发周期。
要实现高级语言与汇编语言的接口,需要解决两个主要问题:首先,需要说明和建立调用者与被调用者之间的关系。
被调用的过程或函数应预先说明为外部类型,如汇编子程序,应用PUBLIC说明其可被外部模块引用;调用程序则应预先说明要引用的外部模块名。
其次,参数传递问题。
在汇编子程序之间通常采用寄存器作为参数传递的工具,而汇编语言与高级语言程序间的参数传递,一般采用堆栈来传递,即调用程序将参数依次压入堆栈中,当被调用程序后,再从堆栈中依次弹出参数作为操作数使用。
为此,必须了解各种语言的堆栈结构、生成方式和入栈方式等。
C语言与汇编语言的接口可以分为两种情况:一种是C语言调用汇编子程序,另一种是C语言嵌入汇编。
在C程序中使用关键字ExTERn对函数作显式说明,参数传递顺序是按其在参数表中出现的顺序的反序被压入堆栈中。
对不同的存储模式,要选用不同的汇编语言格式。
汇编程序取C的参数时,远过程返回地址占四个字节,BP压入占二字节,所以第一个参数在BP+6所指向的单元;对于近过程,第一个参数在BP+4所指向的单元。
汇编程序中寄存器的保护也很重要,TurboC允许子过程使用SI和DI存放局部变量。
C语言允许嵌入四类汇编命令:一般指令、串指令、跳转指令、数据分配和定义指令。
嵌入汇编比调用汇编子程序更方便、灵活、功能也更强。
但是,嵌入汇编不是一个完整的汇编程序,所以许多错误不能马上检查出来。
采用两种或两种以上的编程语言组合编程,彼此相互调用,进行参数传递,是一种有效的程序设计方法。
这种方法可以充分发挥各种语言的优势,充分利用现有的实用程序,是当前程序接口技术的一个重要研究和应用领域。