本课时主要目的是创建loader工程,编写简单的代码,并实现从boot进入到loader中运行。与此同时还将了解到如何从汇编语言进入到C语言环境中运行。
课程中实现了两级跳转:从汇编到C,再从boot到loader。

从汇编语言跳到C语言

从汇编跳转到C语言执行,有两种方式:一是用JMP直接跳转过去;二是用CALL指令进行函数调用。
在本课时中,由于是从boot中的汇编跳转到C语言,无需返回,所以直接用JMP跳转。
在使用前,先用.extern boot_entry导入外部boot_entry符号,然后再用jmp boot_entry跳转。

跳转到指定loader运行

boot和loader分属两个工程,共生成两个bin文件。
从boot跳到loader,只知道loader的起始地址为0x8000,所以采用函数指针转换。(void ()(void) 为无参数、无返回值的函数类型。((void ()(void))LOADER_START_ADDR)() 即认为在0x8000地址处存放了这种类型的函数的代码,通过调用函数函数进入到loader中运行。

注:无论是boot还是loader,其工程均已经配置好让start.S中的代码位于生成的bin文件开头。所以无论是boot还是loader,其最开头的指令总是程序的入口指令。

有关函数指针的定义及其使用,请参考相关的C语言书籍。



登陆发表评论