Kendi işletim sistemimi geliştiriyorum. Önyükleme sektörünü tamamladım ve çekirdeğimi başarıyla yükledim. Geliştirme ortamım Ubuntu 14.04 ve GCC 4.8. Çekirdeğim BOCHS altında çalışacak. Ekranda belirli bir konumda belirli bir karakteri yazdırmak istedi, ben de böyle bir işlevi yarattı: Ben çekirdeğin giriş noktasıdır benim main
fonksiyonu, bu işlevi çağırmakBir karakter yazdırmak için bir işlev çağıran inanılmaz bir olay
void print_char(char target, int col, int row, unsigned char attribute) {
//attribute controls the colour of the character
char * vidmem = (char *) VIDEO_ADDRESS; //#define VIDEO_ADDRESS 0xb8000
*vidmem = target;
//TODO: add other control statements
}
:
print_char('T', 0, 0, (unsigned char) 0x0f);
Yukarıdaki kodun, ekranın sol üst köşesinde 'T' karakterini yazdırması bekleniyor. Bu görünmüyor! Böyle
void print_char(char target, int col, int row, int attribute)
Ya da bir şey: Ben print_char
ilanını değişti sonra
void print_char(char target, int col, int row)
sonra print_char('T', 0, 0)
bunu değiştirdikten sonra
gibi diyoruz, her şey çalışıyor! Bu problem hakkında gerçekten kafam karıştı. Bana açıklayan var mı?
. Ancak böyle garip semptomlarınız olduğunda, çoğu zaman Tanımsız Davranışa neden olan koddaki hataların bir sonucudur. Hata, belirtilerin ortaya çıktığı kodun bir parçası bile olmayabilir. Ama sağladığınız bilgilerden anlayabileceğimiz bir yol yok. – kaylum
Bochs'u bir süredir kullanmadım, ancak bunun nispeten iyi bir montaj hata ayıklayıcısına sahip olduğunu hatırlıyorum. – immibis
Belki de sadece kodu yanlış okuyorum. Ama farz edelim ki * vidmem = öznitelik; çalıştırılır ve 'vidmem', 0xB8000 özniteliğini yazacak olan 0xB8000 adresine sahiptir. 0xB8000 ilk karakterdir, 0xB8001 ilk karakterin özniteliğidir, 0xb8002 ikinci karakterdir ve 0xb8003 ikinci karakterin özniteliğidir ve böyle devam eder. Sanırım benim amacım, öznenin yanlış baytla yazılması gibi görünüyor. –