注册 登录
编程论坛 汇编论坛

请问在c语言中如何实现arm/thumb状态切换呢?

symbianfreshma 发布于 2008-04-01 13:27, 1418 次点击
现有a模块和b模块,a模块编译成arm模式,b模块编译成thumb模式.其中在编译b模块时,调用fromelf将其转成mod文件了.
现在我需要在a模块中用c语言实现b模块的加载,但因为b模块是thumb模式,所以在调用b模块中的函数之前,需要切换到thumb状态,请问在c语言中如何实现arm/thumb状态切换呢?

补充:


b模块的编译:

tcc -c --apcs /ropi/interwork --littleend -Ospace -Otime -zo -O2 -I.testb.c
armlink -o testb.elf --reloc --entry LoadEntry testb.o --first LoadEntry
fromelf -output testb.bin -bin testb.elf

a模块的编译
armcc -c --apcs /ropi/interwork --littleend -Ospace -Otime -zo -O2 -I.testa.c

在a模块中:

int LoadTest()
{
typedef int (LoadEntryPtr)(int aParam);
  unsigned char *data=0;
  int datasize=0;
  int ret = 0;
  FILE *pf = fopen( "testb.bin", "rb" );
  if(pf!=0)
  {
    fseek(pf, 0, SEEK_END);
    datasize = ftell( pf );
    if(datasize > 0)
    {
      data = (unsigned char*)malloc(datasize);
      if(data != 0)
      {
        memset(data, 0, datasize);
        fseek(pf, 0, SEEK_SET);
        fread(data, 1, datasize, pf);
      }
    }
    fclose(pf);
  }
  ret = ((LoadEntryPtr)(buf))(datasize);
  free(buf);
  return ret;
}

如果b模块用tcc编译,则调用  ret = ((LoadEntryPtr)(buf))(datasize);时死掉了,如果b模块也用armcc编译,则可以正常运行.

[[it] 本帖最后由 symbianfreshma 于 2008-4-1 14:25 编辑 [/it]]
1 回复
#2
lzjd2008-04-03 13:52
不懂?你在做ARM开发吗?我只知道编译时可以。
1