您的位置:首页 > 编程语言 > C语言/C++

c语言里如何调用汇编里的变量?

2016-11-23 20:59 316 查看
c语言里如何调用汇编里的变量?

汇编语言:是声明全局变量

.globl _end_ofs

_end_ofs:
.word _end - _start

c语言:声明这个变量,然后再调用这个变量

void board_init_r(gd_t *id, ulong dest_addr)

{
...............

monitor_flash_len = _end_ofs;//_end_ofs在别的头文件里声明了,所以这个函数就不用再声明

....................

}

-----------------------------------------------------------------------------------------

用法:     把c语言里的栈地址,传给汇编(移植uboot的时候,可能用到)

汇编:

.globl base_sp  //定义并声明base_sp,并初始化为0

base_sp:
.long 0


.........
ldr sp ,base_sp   //重新设置栈
......

c语言:

void board_init_f(ulong bootflag)

{
extern ulong base_sp;  //在c语言里使用汇编申请的全局变量之前要声明

.........

#else
addr_sp += 128;
/* leave 32 words for abort-stack   */
gd->irq_sp = addr_sp;

#endif

debug("New Stack Pointer is: %08lx\n", addr_sp);//addr_sp这是board_init_f函数的最后的栈值

#ifdef CONFIG_POST
post_bootmode_init();
post_run(NULL, POST_ROM | post_bootmode_get(0));

#endif

gd->bd->bi_baudrate = gd->baudrate;
/* Ram ist board specific, so move it to board code ... */
dram_init_banksize();
display_dram_config();
/* and display it */

gd->relocaddr = addr;
gd->start_addr_sp = addr_sp;
gd->reloc_off = addr - _TEXT_BASE;
debug("relocation Offset is: %08lx\n", gd->reloc_off);
memcpy(id, (void *)gd, sizeof(gd_t));

base_sp = addr_sp;  //把board_init_f函数的最后的栈值,传递给汇编

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: