欢迎来到天天文库
浏览记录
ID:40803430
大小:32.00 KB
页数:4页
时间:2019-08-07
《在C语言中调用nasm子过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在C语言中调用nasm过程,在nasm中调用C运行时库作者:AllenC调用nasm过程GCC的函数原型声明:intf(int)__attribute__((cdecl));可以是cdecl也可以是stdcall,stdcall约定在函数返回前必需将参数出栈,因此不能使用在参数不定的函数调用上,例如scanf和printf_s。VC/BCB的函数原型声明:int__cdeclf(int);C语言代码://gcc–cfilename.c#includeintfact(int)__attribute__((cd
2、ecl));intmain(void){intn,sum;printf("Sumintegersupto:");scanf("%d",&n);sum=fact(n);//,&sum);printf("Sumis%d",sum);return0;}Nasm自过程代码:;nasm–fcofffilename.asmsegment.textglobal_fact_fact:enter0,0moveax,[ebp+8];eax=ncmpeax,1jbeterm_cond;if(n<=1)deceax;n-=1pusheaxcal
3、l_fact;eax=fact(n-1)popecxmuldword[ebp+8];edx:eax=eax*[ebp+8]jmpshortend_factterm_cond:moveax,1end_fact:leaveret将生成的.o文件用GCC连接:gcc–ofilenamecfile.oasmfile.oNasm调用C运行时库函数%ifdefELF_TYPE%define_scanfscanf%define_printfprintf%define_getchargetchar%define_putcharputchar
4、%define_fputsputs%endifextern_scanf,_printf,_getchar,_putchar,_fputssegment.dataformatdb"%d",0segment.textglobal_asm_main_asm_main:enter0,0pushaleaeax,[ebp-16]pusheaxpushdwordformatcall_scanfaddesp,8popaleaveret注:在C中声明的函数在nasm代码中要加单下划线调用,例如scanf预定于为_scanf
此文档下载收益归作者所有