当前位置:首页 » 编程软件 » c程序汇编程序

c程序汇编程序

发布时间: 2025-01-23 06:49:42

1. 如何将c语言程序转成汇编语言程序。

如果是VC则在编译器命令行参数再加 /FA 则会生成汇编代码。如果参数是 /FAs 则会同时将源码和汇编代码。
/FA 程序集代码;.asm
/FAc 机器码和程序集代码;.cod
/FAs 源代码和程序集代码;.asm
/FAcs 机器码、源代码和程序集码;.cod

/Fa的用法

/Fa 为编译中的每个源代码文件创建一个源文件.asm。
/Fa文件名 将文件名.asm 放到当前目录中。仅在编译单个源代码文件时有效。
/Fa文件名.扩展名 将文件名.扩展名放到当前目录中。仅在编译单个源代码文件时有效。
/Fa目录\ 为编译中的每个源代码文件创建一个源文件.asm,并将其放到指定目录中。请注意必须有后缀反斜杠。只允许使用当前磁盘上的路径。
/Fa目录\文件名 将文件名.asm 放到指定目录中。仅在编译单个源代码文件时有效。
/Fa目录\文件名.扩展名 将文件名.扩展名放到指定目录中。仅在编译单个源代码文件时有效。

如果你是用gcc 或 g++编译器,如dev c++则加入命令行参数 -S 即可

2. C语言中如何调用汇编子程序给个例子讲解下

C语言中可以通过内联汇编调用汇编子程序。例如下面这个例子:

#include
int func(int a, int b) {
return a - b;
}

int main() {
//计算12-5
int a = 12, b = 5; //给定两个数
int res; //用来记录结果
__asm {
//内联汇编
push b; //b压栈
push a; //a压栈,注意C中函数接受参数的时候入栈是反着的
call func; //调用函数func,返回值保存在eax里
mov res, eax; //将eax里的值赋给res
}
printf("%d\n", res); //输出结果,得到7
return 0;
}

在这个例子中,内联汇编代码被嵌入到C语言程序中。首先,将变量b和a压入栈中,然后调用函数func,调用完成后,返回值被保存在eax寄存器中。最后,将eax寄存器中的值赋给变量res。通过这种方式,可以在C语言程序中直接调用汇编子程序。

需要注意的是,内联汇编的具体实现会根据不同的编译器和平台有所差异。上述代码使用了x86架构的汇编指令。在实际编写内联汇编代码时,需要查阅对应编译器和平台的文档,以确保代码的正确性和兼容性。

此外,内联汇编的使用需要谨慎,因为它可能会降低代码的可移植性和可读性。在大多数情况下,使用高级语言提供的功能和库函数足以完成大部分任务,除非有特定的性能需求或需要直接访问硬件。

通过这个例子,我们可以看到如何在C语言程序中调用汇编子程序。内联汇编提供了一种直接控制底层硬件的方式,但同时也带来了复杂的语法和潜在的错误风险。因此,在实际开发中,应尽量避免过度依赖内联汇编。

在编写内联汇编代码时,还需要注意以下几点:

1. 了解目标平台的汇编指令集。

2. 确保寄存器的使用符合编译器的要求。

3. 保持代码的简洁和可读性。

4. 进行充分的测试,确保代码在不同环境下的正确性。

总之,内联汇编是一种强大的工具,但在使用时需要小心谨慎。通过合理利用内联汇编,可以优化程序性能,实现特定的硬件功能。

3. C语言写的程序 怎么反汇编成汇编语言

在keilc中,单片机的C语言程序可以再DEBUG模式中得到对应的汇编程序。步骤如下:

1、建立工程,导入C文件代码,编译生成hex文件。

3、点击View--Disassembly Window调出汇编窗口,如上图。

通过以上步骤就可以看到与C对应的汇编程序了。

4. C语言与汇编程序有什么区别啊

1、可读性的不同

高级语言通用性强,换成专业术语叫移植性好,也就是放那都能用的意思。效率较低。计算机只认机器语言,高级语言翻译成机器语言后,会增加很多额外的代码,这样会降低软件执行效率。低级语言可读性低。

2、执行效率的不同

C语言它是一种比较特殊的语言,它具备高级与低级语言的特性,可以直接对硬件进行操作,又可以进行一些问题的编程,语句可以说是最简单易懂的了汇编则不同,它直接作用与硬件。

basic就更高级,它需要专门的平台兼容性好,还有C++和C差不多,但是C++是针对对象的编程,操作系统游戏等,都是用C++编写的。

3、使用指令的不同

低级语言更接近于机器指令,而高级语言更接近于人的一般的思维模式必然是低级语言执行得更快,因为语言必须通过编译器转换成机器指令才能执行,转换过程中必然会产生一些冗余。越是高级的语言,这些冗余也就越多,执行速度就越慢。

但是高级语言的这种劣势会随着计算机硬件性能的提高而越来越不明显,与此同时高级语言编写简单的优势就很明显了,因此大家普遍用的都是高级语言。

5. C语言调用汇编程序时,使用哪些寄存器来传递参数

C语言与汇编语言混合编程应遵守的规则
ARM编程中使用的C语言是标准C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境与ARM的硬件紧密相关。
在使用C语言时,要用到和汇编语言的混合编程。若汇编代码较为简洁,则可使用直接内嵌汇编的方法;否则要将汇编程序以文件的形式加入到项目中,按照ATPCS(ARM/Thumb过程调用标准,ARM/Thumb Procere Call Standard)的规定与C程序相互调用与访问。
在C程序和ARM汇编程序之间相互调用时必须遵守ATPCS规则。ATPCS规定了一些子程序间调用的基本规则,哪寄存器的使用规则,堆栈的使用规则和参数的传递规则等。
1)寄存器的使用规则
子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。
在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。
寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。
寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。
寄存器r15称为程序计数器,记作PC。
2)堆栈的使用规则
ATPCS规定堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。
3)参数的传递规则
整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的FP寄存器传递参数。
子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或者S0返回。
2、汇编程序调用C程序的方法
汇编程序的书写要遵循ATPCS规则,以保证程序调用时参数正确传递。在汇编程序中调用C程序的方法为:首先在汇编程序中使用IMPORT伪指令事先声明将要调用的C语言函数;然后通过BL指令来调用C函数。
例如在一个C源文件中定义了如下求和函数:
int add(int x,int y){
return(x+y);
}
调用add()函数的汇编程序结构如下:
IMPORT add ;声明要调用的C函数
……
MOV r0,1
MOV r1,2
BL add ;调用C函数add
……
当进行函数调用时,使用r0和r1实现参数传递,返回结果由r0带回。函数调用结束后,r0的值变成3。
3、C程序调用汇编程序的方法
C程序调用汇编程序时,汇编程序的书写也要遵循ATPCS规则,以保证程序调用时参数正确传递。在C程序中调用汇编子程序的方法为:首先在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。
例如在一个汇编源文件中定义了如下求和函数:
EXPORT add ;声明add子程序将被外部函数调用
……
add ;求和子程序add
ADD r0,r0,r1
MOV pc,lr
……
在一个C程序的main()函数中对add汇编子程序进行了调用:
extern int add (int x,int y); //声明add为外部函数
void main(){
int a=1,b=2,c;
c=add(a,b); //调用add子程序
……
}
当main()函数调用add汇编子程序时,变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给变量c。函数调用结束后,变量c的值变成3。
4、C程序中内嵌汇编语句
在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者不容易实现的功能。对于时间紧迫的功能也可以通过在C语言中内嵌汇编语句来实现。内嵌的汇编器支持大部分ARM指令和Thumb指令,但是不支持诸如直接修改PC实现跳转的底层功能,也不能直接引用C语言中的变量。
嵌入式汇编语句在形式上独立定义的函数体,其语法格式为:
__asm
{
指令[;指令]
……
[指令]
}
其中“__asm”为内嵌汇编语句的关键字,需要特别注意的是前面有两个下划线。指令之间用分号分隔,如果一条指令占据多行,除最后一行外都要使用连字符“\”。
5、基于ARM的C语言与汇编语言混合编程举例
下面给出了一个向串口不断发送0x55的例子:
该工程的启动代码使用汇编语言编写,向串口发送数据使用C语言实现,下面是启动代码的整体框架:
……
IMPORT Main
AREA Init,CODE,READONLY;
ENTRY
……
BL Main ;跳转到Main()函数处的C/C++程序
……
END ;标识汇编程序结束

下面是使用C语言编写的主函数:
#include "..\inc\config.h" //将有关硬件定义的头文件包含进来
unsigned char data; //定义全局变量

void main(void){
Target_Init(); //对目标板的硬件初始化
Delay(10); //延时
data=0x55; //给全局变量赋值
while(1) {
Uart_Printf("%x",data); //向串口送数
Delay(10);
}
}

热点内容
传奇日常脚本 发布:2025-01-23 10:45:04 浏览:39
刷华为的系统可以用方舟编译器吗 发布:2025-01-23 10:45:03 浏览:225
java数组反射 发布:2025-01-23 10:39:24 浏览:290
服务器如何从导轨取下来 发布:2025-01-23 10:28:30 浏览:102
华为手机的密码保险柜在哪里 发布:2025-01-23 10:27:02 浏览:633
三星的铃声文件夹是哪个 发布:2025-01-23 10:26:25 浏览:115
信号量编程 发布:2025-01-23 10:23:59 浏览:555
网易邮箱账号和密码哪里查看 发布:2025-01-23 10:09:37 浏览:306
java数据库下载 发布:2025-01-23 10:04:33 浏览:247
基岩版服务器改地址 发布:2025-01-23 09:59:33 浏览:506