C调用汇编

C和arm的汇编的互相调用 1:在arm和C的相互调用中,R0,R1,R2,R3是默认的参数1,参数2,参数3,参数4的存放寄存器。其余的参数存在堆栈中,系统会自动的调用。 这个规则对于C调用汇编,或者汇编调用C都同样有效。一开始我还以为只是汇编调用C的时候是这样的。 2:汇编调用C语言 starts.s IMPORT ADDF AREA FCC,CODE,READONLY ENTRY start MOV R 阅读详情

例子:在C的main函数中调用汇编语言写的addone函数,把传入的参数加一然后返回。

汇编里面首先要把用到的寄存器压栈,使用指令global使函数可以在其他文件中调用,顺便说一句,C中的static函数之所以只能在本文件中可用,就是编译后的汇编文件没有用global指令,汇编的返回值放在EAX寄存器中。

汇编文件名是addone.asm,汇编方法在后面,内容如下:

global addone			;
addone:	MOV RAX, [RSP + 20]	; stack top + 20 bytes
	ADD RAX, 1
	RET

传入的参数在栈顶以下20个字节处,为什么是20我也不知道,是在C的编译后的汇编中看出来的,C文件文件名calladdone.c,内容如下:

#include <stdio.h>

int main(){
  int a = 3;
  // printf("before call, a is %d.\n", a);
  a = addone(a);
  //printf("after call, a is %d.\n", a);
  return 0;
}

编译后的C文件如下:

	.file	"calladdone.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	$3, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %edi
	movl	$0, %eax
	call	addone
	movl	%eax, -4(%rbp)
	movl	$0, %eax
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
	.section	.note.GNU-stack,"",@progbits

中间两句:

subq $16, %rsp
movl $3, -4(%rbp)

栈顶向低地址增长16字节,又把a=3放在-4($rbp)的地方,就是栈顶向下12的地方,然后调用addone,就是这句:

call addone

会向栈中压入一个返回地址,我机器64位,所以是8个字节,现在参数a就在栈顶向下20的地方了。(PS:不知道那个16是不是gcc约定好的。。。)

然后编译就可以了,汇编asm文件:

nasm -felf64 addone.asm

我用的汇编器是nasm,64位机器所以汇编选项是-felf64,32位机器汇编选项是-felf,然后后面跟文件名。如果要调试信息可以再加上-g选项。

汇编后生成一个addone.o文件,就是object file了。然后把这个文件和C文件一起编译:

gcc calladdone.c addone.o

gcc没有-o选项的话默认生成a.out文件,gdb中运行那个文件,加个断点可以看到a的值确实加了1。把上面C文件中注释去掉,输出如下:

before call, a is 3.
after call, a is 4.

一切正常。

最后贴一下gdb中怎么使用x查看寄存器和栈,在gdb中直接help x就可以看到了:

Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
  t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format.


Defaults for format and size letters are those previously used.
Default count is 1.  Default address is following last thing printed
with this command or "print".

比如查看栈顶向下20个字(word)可以这么用:x/20w $rsp

        查看栈顶向下10个字节(byte)可以这么用:x/10b $rsp

ARM汇编与C语言混合编程之汇编调用C函数 ARM汇编与C语言混合编程之汇编调用C函数 调用没有参数的函数 调用有参数的函数 总结 本文所用硬件平台为S3C2440开发板。通过一个点亮数码管的程序说明ARM汇编调用C函数的方法。 根据C语言中函数参数的个数,可以将汇编调用C函数分为两种情况,调用没有参数的函数和调用有参数的函数。 调用没有参数的函数这种方式是最简单的调用,只需关闭看门狗,设置堆栈即可实现这种调用。 该例子程序包括汇编 阅读详情

相关推荐

arm 汇编调用c函数与c函数调用arm汇编

1、汇编调用c函数: 汇编代码: add_s.s import add area codeseg,code,readonly entry mov r0,#1 mov r1,#2 mov r2,#3 mov r3,#4 mov r4,#5 stmfd r13!,{r4} /*由于arm只有r0-r3是传参寄存器,在这里要传递5个参数,所以要用到栈,将r4入栈*

sdlcwangsong的专栏 2335

汇编调 C ,C 调汇编,嵌入汇编和内联汇编

一,汇编调用 C C 语言函数 int my_add_c(int x1, int x2, int x3, int x4) { return (x1 + x2 + x3 + x4); } 汇编函数 MOVS R0, #0x1; 第一个参数 x1 MOVS R1, #0x2; 第二个参数 x2 MOVS R2, #0x3; 第三个参数 x3 MOVS R3, #0x4; 第四个...

tyustli 681

visual studio中C语言调用汇编

视频编解码等高实时性软件也需要使用汇编编写某些代码来提高运行效率。 在visual studio的C语言开发中,调用汇编有几点需要注意的地方   首先要区别MASM和MASM32,MASM是已经集成在visual studio中的汇编器,即汇编使用的ml.exe,可直接使用对已有的汇编代码进行汇编。MASM32是一套汇编的SDK,其安装和配置方法在sabalol的博文: http://...

Urey's Factory 984

C语言调用汇编

程序的入口是main,在main里调用汇编的函数。 首先要解决怎么定义函数的问题 在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。 在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段 例子是一个六个数相加的函数。 C语言: #include<stdio.h> extern int sum(int a,int b,int c,int d,int e,int f); int main(){ ..

m0_54123999的博客 3758

c语言与汇编语言的简单相互调用

文章目录一、C中调用汇编(无参)二、C中调用汇编(有参)三、汇编调用C四、总结 一、C中调用汇编(无参) 1.建立工程 链接: https://blog.csdn.net/asdf_qfvr/article/details/120579498?spm=1001.2014.3001.5501. 2.要求:实现在C语言中调用汇编语言,功能如下: 设置R1,R2。循环加1,当R1大于或等于10,结束程序。 3.编写程序如下: main1.c #include<stdio.h>

asdf_qfvr的博客 2693

手把手教你搞定国民技术N32G031的Keil开发环境(附Pack包和JLink配置)

本文详细指导如何搭建国民技术N32G031的Keil开发环境,包括Keil MDK安装与激活、Pack包导入、JLink调试器配置等关键步骤。特别针对新手常见问题提供解决方案,帮助开发者快速上手N32G031系列MCU的开发工作。

cuangu9341的博客 424

C语言和汇编语言相互调用

C语言和汇编语言相互调用 不同的语言就像一座孤岛,似乎毫不相干,但是所有的代码最终都要编译成机器指令,他们本质上也是一样的,最终都是变成指令给CPU下达命令。 1. C语言的链接过程 我们知道一个C语言源文件变成可执行文件,需要经过一下几个步骤: 预处理。(hello.c -> hello.i)把头文件包含起来。 编译。(hello.i -> hello.s)编译成汇编代码。 汇编。(hello.s -> hello.o)生成目标文件。 链接。(hello.o ->

m0_55708805的博客 1万+

从TCGA官网获取新版count数据并精准转换为TPM的实战指南

本文详细介绍了从TCGA官网获取新版count数据并精准转换为TPM的实战指南。通过TCGAbiolinks工具下载原始count数据,结合GENCODE v36注释文件计算基因有效长度,最终实现count到TPM的标准化转换,确保数据完整性和分析可靠性。文章包含完整代码示例和常见问题解决方案,特别适合生物信息学研究人员参考。

weixin_27310417的博客 284

c语言中如何调用汇编程序

汇编语言的基本格式为:佛山seo   PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'   ASSUME CS: _TEXT _FOUND  PROC NEAR    PUSH BP    MOV  BP,SP    MOV  CX,[BP+4]    DEC  CX    MOV  SI,[BP+10]    LODSW    M

lazy的专栏 2104

UE5新手必看:如何用蓝图系统快速打造赛车游戏(含Chaos Physics配置)

本文为UE5新手提供使用蓝图系统快速打造赛车游戏的完整指南,涵盖Chaos Physics配置、载具蓝图架构设计、控制逻辑实现等关键步骤。通过详细的实战案例和优化技巧,帮助开发者高效构建具备专业物理反馈的赛车游戏原型。

weixin_29001327的博客 387

深入分析RAG知识库多模态数据预处理

多模态企业数据预处理是构建高质量RAG知识库的关键环节。本文详解了处理流程:1)文档格式识别与路由;2)多模态内容提取(文本、图像、音视频);3)结构解析与语义重建;4)数据清洗与增强;5)智能分块(强调语义完整性);6)元数据注入。推荐使用开源工具如PaddleOCR、Whisper、BLIP-2等,或商业API处理复杂场景,最终生成带丰富元数据的结构化内容,为后续向量化检索奠定基础。

qq_35354529的博客 1379

在Keil下用C语言调用汇编函数

目录一、在C函数中调用汇编函数1.1 调用不带参数的汇编函数1.2调用带形参的汇编函数二、在汇编函数中调用c函数2.1 代码文件2.2 仿真调试三、汇编函数与c函数混合调用3.1 代码文件3.2 仿真调试四、总结C语言与汇编语言混合编程的规则4.1寄存器的使用规则4.2 堆栈的使用规则4.3 参数的传递规则四、总结 一、在C函数中调用汇编函数 1.1 调用不带参数的汇编函数 关于建立MDK工程的具体操作,可参考我的另一篇博文: 基于MDK创建纯汇编语言的STM32工程 新建一个main.c文件 #inc

Monajim的博客 3955

超实用!用 Ollama + DeepSeek + Dify 搭建本地知识库,提升企业效率

本文介绍了如何使用 Ollama + DeepSeek + Dify 搭建本地知识库,帮助企业高效管理信息。通过简单配置,可实现智能问答、文档检索等功能,提升效率并保障数据安全。

Happiness is everywhere 4294

keil4汇编调用c语言,C语言调用汇编和汇编调用C语言

1.C语言调用汇编程序的入口是main,在main里调用汇编的函数。在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段#includeextern int sum(int a,int b,int c,int d,int e,intf);intmain(){int result = sum(1,2...

weixin_29920047的博客 1549

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

第二章:创建交互式地图

那么您应该已经有了一个安装了这些包的 conda 环境。否则,您需要创建一个新的 conda 环境并使用以下命令安装。

韩天放 4218

ARM 汇编与C之间 的调用

一. 汇编调用 C   1. 初始化栈   2. 初始化BSS段 (BSS 段是C语言存放未初始化的全局变量,或者初始化为0 的全局变量)   3 .使用 r0 ,r1, r2, r3 给函数传参,如果多于 4 个参数使用栈的方式传参   4. 返回值放在 r0, r1 中,最大32位数据, 一般使用 r0 就可以满足要求 例子: 汇编文件 start.s .text @ 表...

weixin_33734785的博客 2317

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【ARM】 《C 语言调用汇编子程序》 与 《汇编调用 C 语言程序》

题目: 实现计算 1+2+3+…+(N−1)+N1+2+3+…+(N-1)+N1+2+3+…+(N−1)+N 的值 (N&gt;0)(N&gt;0)(N>0) 的加法运算 在 C 语言程序中调用汇编子程序,汇编子程序实现两个数的加法运算 在汇编程序中调用 C 语言子程序,C 语言子程序实现两个数的加法运算 一、 C 语言调用汇编子程序 C 语言主程序 #define ui...

Krone_的博客 2579

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C和汇编如何互相调用?

《Linux X64下汇编学习:C语言调用汇编代码,汇编中调用C语言函数》 《C语言与汇编语言的区别》 《C语言编写汇编的编译器,用c编写一个asm的编译器》 《C语言嵌入汇编指令(asm)查询系统时间》 《C和汇编如何互相调用?》 https://github.com/Rtoax/test/tree/master/asm https://github.com/Rtoax/test/tree/master/assembler 目录 一、gcc 内联汇编 格式: 参数 举例 三、ATP

RToax 2304

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c语言函数里怎么调用数组_C语言与汇编函数的调用方式

C语言写的函数和汇编写的函数之间可以相互调用,分别编译成机器码后由链接器将其链接成可执行程序。根据“《30天自制操作系统》”中的描述可以概况成如下的形式。1. C语言可调用的汇编函数1.1 在汇编程序中定义函数声明函数的属性为 GLOBAL GLOBAL _函数名 在汇编里函数名 _函数名 _函数名: ... ;汇编语句,可以调用[ESP+4]的值 RET 1.2...

weixin_32659227的博客 5897

vs c 中嵌入汇编语言,VS2015,C嵌套汇编 & C,汇编相互调用

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?环境:VS2015目标:如何在c语言中嵌入汇编语言,如何在C语言中调用汇编子程序,如何在汇编子程序中调用C函数,如何在汇编子程序中调用lib文件中的函数1.在C语言中嵌入汇编语句这个比较简单,直接上代码#include #pragma inlineint main(void) {int result=0,a = 10, ...

weixin_33787865的博客 1537

在DSP 线性汇编中可否调用C函数,如何调用

 求助: 在DSP 线性汇编中可否调用C函数,如何调用?例子:原始C函数(经过简化)如下:short compute(const short *x, int n){int i; sum = 0;for (i=0;isum = sum + x[i]*x[i];}return sum/n; }除法函数如下;short  divi_compute(int a, short b){    return  

ciompmq的专栏 2578

【ATT 与 Intel】汇编与C语言相互调用及内联汇编

目录一、ATT 与 Intel二、函数调用的约定三、C语言调用汇编程序四、汇编程序调用C语言五、内联汇编 一、ATT 与 Intel x86架构的处理器的汇编指令一般使用有两种: ATT 汇编 Intel 汇编 常用的汇编器: MS VC 编译器:只支持 Intel 格式 GNU CC 编译器:支持 ATT 格式和 Intel 格式,一般从 gcc 的上层开始调用像cc、ar 等工具。 ATT 与 Intel 汇编代码格式区别如下: Intel 代码省略了指示大小的后缀。我们看到指令 push

npc666666的博客 4611

C语言调用汇编和汇编调用C语言

1.C语言调用汇编 程序的入口是main,在main里调用汇编的函数。 在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。 在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段 #include extern int sum(int a,int b,int c,int d,int e,int f); int main(){

u013216061的博客 1万+
上一篇: linux下的文件操作2
下一篇: 关于linux下的库文件
High_High
博客等级 码龄19年 131粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值