在看过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指标跟位址的说明很清楚,我就不重述纪录了!