哪位给个汇编中 调用C函数的例子
哪位给个汇编中 调用C函数的例子 汇编可调用 C编译出来的汇编。 最好给个例子 汇编中直接调用C中定义好的函数就可以了。以AVR为例:
/* main.c ------------------------------------------*/
#include <avr\io.h>
void func1(void)
{
asm("NOP");
}
int func2(char arg1, char arg2)
{
return (256U + arg1 + arg2);
}
/*func_asm在test_asm.s中实现*/
/*int func_asm(char arg)
{
func1();
return (10 + func2(arg, 100));
}
*/
extern int func_asm(char arg);
/*Main function*/
int main(void)
{
func_asm(1);
while(1){
}
return (0);
}
/*--------------------------------------------------*/
/* test_asm.s --------------------------------------*/
.global func_asm
.extern func1, func2
func_asm:
push r28
std Y+1, r24
rcallfunc1 ;调用在在main.c中定义的void func1(void)
ldi r22, 100;arg2 参数传递
ldd r24, Y+1;arg1 参数传递
rcallfunc2 ;调用在在main.c中定义的int func2(char arg1, char arg2)
adiw r24, 10 ;返回值在r24中, +10返回
pop r28
ret 我用的是NEC 单片机PM编译器 不知道NEC中是怎么操作的 回复【5楼】jpg4151
我用的是nec 单片机pm编译器 不知道nec中是怎么操作的
-----------------------------------------------------------------------
提问又不把问题说清楚,给你例子就是个参考,自己搞明白编译的原理再说。 这是我写的main.asm 调用csub.c中函数的代码。 编译有问题,哪位指教下
用的是NEC 单片机 PM编译器
;main.asm***********************************
EXTRN _CSUB
@@VECT CSEG AT 0000H
DW START ;0000;复位中断
@@OPT CSEG AT 0080H
;***************************************
; -||----------;上电或复位释放后振荡稳定时间 00--2^10/fx01--2^12/fx 10--2^15/fx 11--2^17/fx
; ----|--------;RMCE 1--RESET口作为复位输入 0--普通输入口
; -----||------;OSCSEL1 OSCSEL0 00--外部晶振,01--外部时钟,1x--内部时钟
; -------|-----;LIOCP 内部低速时钟 0--振荡通过软件停止
DB 94H ;10010100内部时钟,复位口做普通输入口,
;**************************************
START:
movw ax,#20H ;set 2nd argument(j)
push ax
movw ax,#21H ;set 1st argument(i)
call!_CSUB
popax
br $$
END
/* csub.c --------------------------------------*/
void CSUB(int i, int j)
{
i+=j ;
} 汇编里能调用C语言? main.asm 声明成外部变量
例 EXTRN_CSUB
csub.c声明成公共变量,
然后在调用就可以啦
页:
[1]