嗯,這顯然是一個初學者的問題,但這是我第一次嘗試製作操作系統在C
(其實,我幾乎是全新的C
..我習慣了asm
)所以,爲什麼這是無效的?據我所知,在C
pointer
只是一個uint16_t
用於指向內存中的某個區域,權利(或uint32_t
,這就是爲什麼它不工作)? 我做了以下內核(「我已經做了一個引導程序和所有組件加載生成KERNEL.BIN文件):GCC裸機內聯彙編SI寄存器不能很好地與指針
kernel.c
void printf(char *str)
{
__asm__(
"mov si, %0\n"
"pusha\n"
"mov ah, 0x0E\n"
".repeat:\n"
"lodsb\n"
"cmp al, 0\n"
"je .done\n"
"int 0x10\n"
"jmp .repeat\n"
".done:\n"
"popa\n"
:
: "r" (str)
);
return;
}
int main()
{
char *msg = "Hello, world!";
printf(msg);
__asm__("jmp $");
return 0;
}
我用下面的命令編譯它kernel.c
:
gcc kernel.c -ffreestanding -m32 -std=c99 -g -O0 -masm=intel -o kernel.bin
返回以下錯誤:
kernel.c:3: Error: operand type mismatch for 'mov'
爲什麼可能是這個錯誤的原因?
會給你一個建議。如果你願意的話,你可以大便便利,但如果你對這類事情不熟悉,最糟糕的事情就是做內聯彙編程序。很容易弄錯,你需要適當的輸入,輸出和clobbers來覆蓋所有變化的東西。如果你想用匯編寫入,我建議把這些函數寫在一個單獨的彙編文件中,而不要使用_C_代碼。 –
如果您使用內聯彙編程序,請謹慎使用它。只有在必要時才使用它,並讓_C_代碼爲您完成工作(包括循環等)。 –
即使是經驗豐富的嘗試GCC擴展內聯彙編程序的_C_開發人員,也可以創建似乎能夠工作的代碼,然後在_C_優化程序縮減所有內容時,在未來的某個時間點不會採取應有的方式。如果你不知道自己在做什麼,那麼等待發生的負擔就會很大。 –