kleine verständnisfrage
-
ist printf eigendlich in assembler realisert?
oder
wie kann man ohne die benutzung irgendwelcher standard header und/oderfunktionen printf realsieren ?danke...
-
meinem bescheidenen wissen nach wird printf zum beispiel in windows an die MSVC runtime weitergeleitet, die entscheidet wohin es soll (schickt es wahrscheinlich an die kernel), und von da kommt es über den grafiklayer an die graka....
kann mir nicht vorstellen dass das viel mit assembler zu tun hat.
zum thema realisieren: vermutlich macht das der linker, und somit ist das von system zu system unterschiedlich.
-
printf --> putchar --> os --> grafiktreiber --> bildschirm
-
printf ist eine Library Funktion der C Standard Library. Wie sie intern implementiert ist, ist von Betriebssystem zu Betriebssystem unterschiedlich. idR wird ein Kernel-Call gemacht. Unter DOS waren es zB bestimmte interrupts die direkt aufgerufen wurden, unter Linux wird es vermutlich einen Aufruf von write() zur folge haben...
Assembler spielt natürlich ganz unten in der Reihe eine Rolle, da ein paar Kernfunktionen des System die Hardware direkt ansteuern. Aber es gibt viele High-Level Funktionen darüber, so dass man damit nicht in berührung kommt.
-
ich weiß dass im linux kernel printk als ausgabeform implementiert wudre
-
linuxusernichteingeloggt schrieb:
ich weiß dass im linux kernel printk als ausgabeform implementiert wudre
Das ist aber nur zum Debuggen gedacht.
-
Wenn das mit printf -> putchar -> ... stimmt, ist dies dann die normale putchar Funktion?
int putchar(int c) { write(1, &c, 1); return c; }
Wenn nicht, könnte das dann mal Jemand in einer anderen Version hier Posten, rein aus Interesse.
Danke
-
Putchar schrieb:
Wenn das mit printf -> putchar -> ... stimmt, ist dies dann die normale putchar Funktion?
Es gibt keine _normale_ Form. Das write ist durchaus OK - aber bedenke, dass man da dann doch einen Puffer haben will, etc. So trivial ist das ganze nicht. aber wenn du willst, kannst du es dir so (oder so ähnlich) vorstellen.
Schnapp dir einfach den Source der Standard Library vom gcc und schau nach wie es dort gemacht ist.
Aber bedenke: jede Implementierung kann ihr eigenes süppchen kochen.
-
Wenn man gerade kein Betriebssystem laufen hat, könnte man eine printf funktion so implementiren:
#define WHITE_TXT 0x07 int pritnf(const char *message, unsigned int line) { char *vidmem = (char *) 0xb8000; unsigned int i=0; i=(line*80*2); while(*message!=0) { if(*message=='\n') { line++; i=(line*80*2); *message++; } else { vidmem[i]=*message; *message++; i++; vidmem[i]=WHITE_TXT; i++; }; }; return(1); }
Vorsicht: Funktioniert nur wenn gerade kein Betriebsystem geladen ist.
Koennte man gebrauchen wenn man sein eigenes OS schreiben will.
Mehr infos dazu unter: [url] http://lowlevel.net.tc/ [/url]mfg LastManStanding
-
RAILEX 4 EVER!!!!!!!
-
schrieb:
RAILEX 4 EVER!!!!!!!
yeah, RAILEX 4 EVER!!!
-
printf() ist immer in c geschrieben. etwas anderes würde sich auch kein programmierer antun wollen. die implementation sieht stark vereinfacht etwa so aus:
#include <stdarg.h> #include <stdio.h> #include <string.h> int my_vfprintf (FILE *out, const char *format, va_list argl) { char c,*cp; int n=0; while(c=*format++) if(c=='%') switch((unsigned)(c=*format++)) { case 's': cp=va_arg(argl,char*); fputs(cp,out); n+=strlen(cp); break; case '%': fputc('%',out); ++n; break; } else fputc(c,out); return n; } int my_printf (const char *format, ...) { va_list argl; int res; va_start(argl,format); res=my_vfprintf(stdout,format,argl); va_end(argl); return res; }
fputc() etc sind über die datei-befehle des betriebssystems realisiert. unter windows wäre das die win32api.
wenn du das wissen willst, um deine programme mit einem selbstgeschriebenen printf() auszustatten damit sie kürzer werden, dann wäre es besser, stattdessen die funktion wsprintf() der win32api zu verwenden:
#include <stdarg.h> #include <windows.h> INT my_printf (LPCSTR format, ...) { va_list argl; CHAR buf[1024]; INT res; va_start(argl,format); res=wvsprintf(buf,format,argl); va_end(argl); WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),buf,res,NULL,NULL); return res; }
leider beherrscht die win32api-funktion wsprintf() nicht den vollen ansi-c-standard. so können zb keine fließkommazahlen ausgegeben werden. aber für die meisten zwecke reichts. und das programm wird schön kurz
-
Coole Sache!