C函数中嵌入汇编之形参传递(单片机)

    单片机编程中在C语言里嵌入汇编比较常见,只需要在嵌入前后写入:

#pragma asm

    MOV  A,#0x00

#pragma endasm

两个声明即可,在它们中间就可以使用汇编代码,

因为汇编是机器码,执行速度快,在对程序运行速度要求高的地方嵌入汇编可以大大提高运行速率,

但是当我们在C函数中需要汇编来调用其他的C函数时,传递参数就会变得复杂,

例:


   
   
  1. void fix_data()
  2. {
  3. #pragma asm
  4. PUSH ACC
  5. loop:
  6. MOV R11,@DR12
  7. MOVX @DPTR,A
  8. INC DPTR
  9. INC WR14,# 0x01
  10. DJNZ R0,loop
  11. POP ACC
  12. #pragma endasm
  13. }
  14. U8 Fun(U8 far *xPA,U8 far *yPA,U8 far *M,U8 M_Length,U8 far *Sig_R,U8 far *Sig_S)
  15. {
  16. //For_Share_Lib_xdata[0] = *M;
  17. #pragma asm
  18. //保存DR12的值
  19. PUSH DR12
  20. //填写参数M
  21. MOV DPXL,# 0X01
  22. MOV DTPR,# 0X0008
  23. MOV WR12,#WORD2 M? 140
  24. MOV WR14,#WORD0 M? 140
  25. MOV R0,# 0X04
  26. ECALL         fix_data?
  27. //填写参数Sig_R,Sig_S
  28. MOV DPTR,# 0X000D
  29. MOV WR12,#WORD2 Sig_R? 142
  30. MOV WR14,#WORD0 Sig_R? 142
  31. MOV R0,# 0X08
  32. ECALL         fix_data?
  33. //调用函数
  34. ECALL 0xFF0010 //函数地址
  35. //恢复DR12的值
  36. POP DR12
  37. #pragma endasm
  38. }

如上例所示,在Fun函数中需要嵌入汇编,使用汇编调用一个固定地址函数,并将所有参数传递过去,本例中使用的是16位单片机寄存器包含R0,R1,R2,R3,R4,R5,R6,R7,R11


Fun函数中每个指针参数需要占用4字节,因此两个指针参数就需要占用8个寄存器,所以*xPA和*yPA可以通过寄存器进行传递,其他的参数则需要通过XRAM进行传递,因此需要先找到被调用函数中对应参数的地址(在Map文件中查找),本例中*M参数的地址为0x010008,*M被编译后的名字变成了M?140,其名字需要去掉 

//For_Share_Lib_xdata[0] = *M;  
   
   

注释后编译,然后在Map文件中找到编译后变量被改成了什么名字,

MOV R0,#0x04 中0x04为传递参数占用的字节数

接着就是调用fix_data()函数,将该变量名对应到XRAM地址上去,如此参数传递完成。

其中M_Length为一个字节可通过R11进行传递。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值