首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

汇编与C混合编程的问题

汇编与C混合编程的问题

void delay(unsigned int count)
{

unsigned int Tcount; //C中定义变量

asm XREF Tcount; //汇编中定义变量

Tcount=count;

_asm
{

Delay: PSHX //2 clock
LDX #Tcount //3 clock
Dloop: DEX //1 clock
BNE Dloop //3 or 1 clock
PULX //3 clock
RTS //5 clock
}

}

以上是一个带参的函数,希望通过参数的不同来改变延时的时间

编译时会出现这样的错误

C12103:Address of this object is not supported

请大家帮看看是什么问题,怎么在汇编语言中用到C语言中定义的变量,万分感谢!

凭感觉,汇编在定义变量的时候需要制定地址,不能在C语言的子函数里面定义,也就是不能在堆栈里面定义。
不一定对啊
本帖最后由 深山老林 于 2009-10-24 16:19 编辑

其实不用的,因为在你调用延时函数时,延时的参数是通过cpu的寄存器D进行传递的,所以不用另外定义变量,在你延时子函数里只要对D寄存器进行操作就可以了。请看下面的例子:
//函数功能,实现延时n个100us
void Delay_n100us(unsigned int us100)
{
  //带参数的函数调用:6clock
  unsigned int tmp = us100;             /*(2 clock)*,防止出现参数未引用的提示/
  asm {
    loop:     
    pshd                               /* (2 clock) backup D */
                                    
    #if BUS_CLK == 8
        ldd #158                       /* (2 clock) number of iterations */
    #elif BUS_CLK == 16
        ldd #318                       /* (2  clock) number of iterations */
    #elif BUS_CLK == 32
        ldd #638                       /* (2  clock) number of iterations */   
    #elif BUS_CLK == 40
        ldd #798                       /* (2  clock) number of iterations */        
    #elif BUS_CLK == 48
        ldd #958                       /* (2  clock) number of iterations */        
    #elif BUS_CLK == 56
        ldd #1118                      /* (2  clock) number of iterations */  
    #elif BUS_CLK == 64
        ldd #1278                      /* (2  clock) number of iterations */         
    #endif  
     
       label0:
       nop
       nop
       dbne d, label0                     /* (4  clock) repeat*/
      
       puld                               /* (3  clock) restore D */
       dbne d, loop                       /* (3  clock)参数us100通过寄存器D进行传递*/                                 
  }
  //函数返回:8clock (D寄存器出栈+RTS)
}

上面函数的延时n个100us,当然,你可以改ldd指令后面的立即数,来实现不同分度的延时。
BUS_CLK 是我的宏定义,为了移植方便
返回列表