Finally Begin to import C Language

在看过30天打造OS!作业系统自作入门(附光碟)的03-08 迈向32位元模式前的准备工作这节后,ㄚ琪要进展到03-09 终于开始导入C语言,这一节主的一些指令一定要记起来,不然下周书还了,又不知要如何进行了。

首先使用cc1.exe由bootpack.c制作bootpack.gas。

然后使用gas2nask.exe由bootpack.gas制作bootpack.nas。

接着使用nask.exe由bootpack.nas制作bootpack.obj。

并且使用obj2bim.exe由bootpack.obj制作bootpack.bim。

最后使用bim2hrb.exe由bootpack.bim制作bootpack.hrb。

然后使用copy命令,将asmhead.bin与bootpack.hrb连结起来,就成了haribote.sys。

先试着纪录这几个部份,再继续往下一章看!

在04-03向指标挑战这里,使用C语言的指标跟组合语言的关系,在宣告的部份:

char *p; /* BYTE用位址的情况 */

short *p;/* WORD用位址的情况 */

int *p;/* DWORD 用位址的情况 */

程式:

void HariMain(void)
{
int i; /* 变数宣言。iという变数は、32ビットの整数型 */
char *p; /* pという变数は、BYTE […]用の番地 */

for (i = 0xa0000; i <= 0xaffff; i++) {

p = i; /* 番地を代入 */
*p = i & 0x0f;

/* これで write_mem8(i, i & 0x0f); の代わりになる */
}

for (;;) {
io_hlt();
}
}

用这个去make run的话,会发生

bootpack.c:10: warning: assignment makes pointer from integer without a cast

第10行p = i; /* 代入位址 */这是转型的问题,只要做p = (char *) i;的修正就可以解决问题!

所以专栏二中,有个进阶的写法:

p =(char *)  i; /* 番地を代入 */
*p = i & 0x0f;

可以写成:

*((char *) i) = i & 0x0f;

而这又跟组合语言的BYTE [i] = i & 0x0f;很像。

专栏3指标跟位址的说明很清楚,我就不重述纪录了!