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

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *