在看過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指標跟位址的說明很清楚,我就不重述紀錄了!