Chciałbym utworzyć samodzielną funkcję C, która drukuje ciąg znaków. To byłby część systemu operacyjnego, więc nie mogę używać stdio.h
. Jak utworzyć funkcję, która wypisuje ciąg, który do niego przechodzę, bez konieczności używania stdio.h
? Czy muszę napisać to na zgromadzeniu?Samodzielna procedura C do drukowania ciągów
Odpowiedz
Najprawdopodobniej będziesz chciał spojrzeć na źródło, a może po prostu użyć go, do biblioteki stdio functions w bibliotece FreeBSD C, na licencji BSD.
Aby faktycznie produkować dane wyjściowe, potrzebujesz przynajmniej niektórych funkcji, które mogą zapisywać znaki w urządzeniu wyjściowym. Aby to zrobić, procedury stdio kończą się wywoływaniem write, który wykonuje syscall w jądrze.
Jeśli OP chce, aby był "częścią systemu operacyjnego", nie może rozsądnie używać wywołania systemu operacyjnego, które go implementuje. –
@IraBaxter: Tak. Byłaby to część, którą musiałby wdrożyć. Myślałem, że to oczywiste, że nie będzie nazywać jądra * BSD. – sfstewman
Mówisz w zasadzie o przeniesieniu biblioteki C do systemu hobbistycznego, co jest powszechną rzeczą do zrobienia, ale dość daleko w dół do PO. Prawdopodobnie powinien zacząć od odczytu/zapisu bezpośrednio do pamięci wideo. –
Zakładając, że robisz to na komputerze X86, musisz odczytać/zapisać bezpośrednio do pamięci wideo znajdującej się pod adresem 0xB8000
. W przypadku monitorów kolorowych należy podać bajt znaków ASCII i bajt atrybutów, który może wskazywać kolor. Powszechne jest używanie makr podczas uzyskiwania dostępu do tej pamięci:
#define VIDEO_BASE_ADDR 0xB8000
#define VIDEO_ADDR(x,y) (unsigned short *)(VIDEO_BASE_ADDR + 2 * ((y) * SCREEN_X_SIZE + (x)))
Później pisze się własne procedury IO. Poniżej znajduje się prosta funkcja, którą napisałem z bufora ekranowego. Użyłem tego, aby pomóc w implementacji prostej funkcji przewijania.
void c_write_window(unsigned int x, unsigned int y, unsigned short c)
{
if ((win_offset + y) >= BUFFER_ROWS) {
int overlap = ((win_offset + y) - BUFFER_ROWS);
*VIDEO_ADDR(x,y) = screen_buffer[overlap][x] = c;
} else {
*VIDEO_ADDR(x,y) = screen_buffer[win_offset + y][x] = c;
}
}
Aby dowiedzieć się więcej na ten temat i inne tematy osdev patrz http://wiki.osdev.org/Printing_To_Screen
Jest to możliwe tylko w systemach/kartach graficznych, które implementują pamięć wideo "mapowaną na znaki"; z wyjątkiem sprzętu PC, tj. komputerów opartych na procesorach x86/x64 z kartami graficznymi, które mają BIOS typu "VGA" (wywołaj to, jeśli chcesz, typ sterownika urządzenia), tak nie jest; funkcja mapowania znaków na kartach graficznych typu PC jest wykonywana przez BIOS, a nie przez kartę. Aby to zrobić, powiedzmy, RaspberryPI, musisz napisać _Framebuffer Device Driver_. Wykorzystanie funkcji BIOS VGA nie jest więc (dużo) inne niż użycie sterownika konsolowego przez wywołanie systemowe 'write()'. –
- 1. Procedura odszyfrowywania ciągów OpenSSL
- 2. Oneliner do drukowania ciągów w hex?
- 3. C Debugowanie drukowania makr
- 4. C#: DateTime.DayOfWeek do porównania ciągów
- 5. C makr do tworzenia ciągów
- 6. samodzielna definicja struktury odwołań?
- 7. Funkcja drukowania dla klasy C++
- 8. Samodzielna wersja S3 alternatywna
- 9. Samodzielna baza danych
- 10. Samodzielna metoda "dotykowa" jQuery?
- 11. Zapisz ekran drukowania w C#
- 12. samodzielna aplikacja internetowa
- 13. Współrzędne Androida do drukowania
- 14. Sieciowe rozwiązania do drukowania
- 15. Zapisana procedura wraca do DataSet w C# .Net
- 16. Czy istnieje sposób drukowania ciągów constexpr podczas kompilacji?
- 17. Dodawanie metody rozszerzenia do klasy ciągów - C#
- 18. Wskaźnik do ciągów stałych w C
- 19. C - podzielonego ciąg do tablicy ciągów
- 20. Konwertuj zapytanie linq do tablicy ciągów - C#
- 21. C Biblioteka ciągów znaków
- 22. C# tłumaczenie ciągów znaków
- 23. Samodzielna dokumentacja Xcode i XIB
- 24. Definiowanie funkcji drukowania gdb dla struktur C
- 25. Funkcja drukowania jQuery do drukowania zawartości div z css
- 26. Czy istnieje samodzielna implementacja funkcji std ::?
- 27. Tworzenie Procedura
- 28. Moduł do ładnego drukowania HTML?
- 29. Rozszerzenia Chrome do cichego drukowania?
- 30. Używanie gvim do drukowania różnic?
Co to jest system operacyjny? – md5
czy zaglądasz do wnętrza stdio.h? – JuanPi
@JuanPi OP powiedział, że nie może używać 'stdio.h'. – Rob