Print(..)
-
Hallo jungs!
Schreibe gerade ein OS, bisher habe ich den Bootloder
und den Kernel den man schon in C Programmieren kann.und da kommt meine frage:
Und zwar ich will in C print benützen mit allem drum und dran, bisher sieht der ASM code so aus:
GLOBAL _print _print: push bp mov bp,sp push bx push si mov si,[bp+4] call ausgabe pop si pop bx pop bp ret ausgabe: lodsb ; load byte at ds:si into al or al,al ; test if character is 0 (end) jz ausgabe@ende mov bx,0007 mov ah,0eh ; put character int 10h ; call BIOS jmp ausgabe ausgabe@ende: ret
und der C code:
print("Beispiel Text);
hmm soweit so gut, aber wen ich z.B.
print so verwende:
print("Hallo\nZeile drunter\nZeile drunter");
Sieht die ausgabe so aus:
Hallo Zeile drunter Zeile drunter
Will aber das die die Untereinander sind!
Könnt ihr mir helfen??
-
Du musst \n\r schreiben statt \n. \n erzeugt lediglich den Sprung in eine neue Zeile. \r setzt dann den Cursor noch in die erste Spalte.
-
\r\n
-
Es ist doch im Endeffekt sowas von egal, ob man zuerst in die erste Spalte springt und dann in die nächste Zeile, oder ob man umgekehrt zuerst in die nächste Zeile und dann in die erste Spalte springt.
Der Effekt ist der gleiche.
-
danke, wow!
-
Ich hab wohl das Forumtopic verwechselt...
[ Dieser Beitrag wurde am 10.07.2003 um 20:29 Uhr von cd9000 editiert. ]
-
hey seit dem ich das jetzt Benütze Flimert es wider an meinem Bildschirm!
vieleich hat es vorher auch, aber habe es nicht so sehr dan gesehn wie jetzt.
Hier ist der Code von ASM:
mov ax, 1000h ; Update die Segmentregister: mov ds, ax mov es, ax extern _main ;Aus dem C++ Code, für den Linker start: call _main ;Rufe main() auf ;=============== Bildschirm Löschen (CLS) ======================= GLOBAL _cls ;Die "Funktion" _cls als GLOBAL, für den Linker _cls: push bp ;dies muss gemacht werden, mov bp,sp ;wird später bei der Parameter übergabe wichtig call bildschirm_loeschen pop bp ret bildschirm_loeschen: mov ah,6 mov al,0 mov bh,7 mov cx,0 mov dh,24 mov dl,79 int 10h mov ah,2 mov bh,0 ; video page mov dh,0 ; row (y; 0 is top) mov dl,0 ; col (x; 0 is left) int 10h ret ;=========================== Reboot ============================ GLOBAL _Reboot ;Die "Funktion" _Reboot: push bp ;dies muss gemacht werden, mov bp,sp ;wird später bei der Parameter db 0EAh dw 0000h dw 0FFFFh ret ;=========================== Shutdown ============================ GLOBAL _Shutdown ;Die "Funktion" _Shutdown: mov ax,$5301 xor bx,bx int $15 mov ax,$530e xor bx,bx mov cx,01 int $15 mov ax,$530f mov bx,1 mov cx,bx int $15 mov ax,$5308 mov bx,1 mov cx,bx int $15 mov ax,$5307 mov bx,1 mov cx,3 int $15 ret ;=========================== Print ============================ GLOBAL _print _print: push bp mov bp,sp push bx push si mov si,[bp+4] call ausgabe pop si pop bx pop bp ret ausgabe: lodsb ; load byte at ds:si into al or al,al ; test if character is 0 (end) jz ausgabe@ende mov bx,0007 mov ah,0eh ; put character int 10h ; call BIOS jmp ausgabe ausgabe@ende: ret ;=========================== GetKey ============================ GLOBAL _GetKey _GetKey: push bp mov bp,sp mov ah, 00h int 16h mov sp,bp pop bp xor ah,ah push ax ret
und der C code:
int main() { cls(); //Funktioniert print("Wilkommen bei Tilus 0.1\n\r"); print("\n\r"); print(" ___________________________________________________________\n\r"); print("| |\n\r"); print("| 1.] Boot |\n\r"); print("| 2.] Option |\n\r"); print("| 3.] Exit |\n\r"); print("| |\n\r"); print(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\n\r"); print("Auswahl: "); if(GetKey() == '3') { Reboot(); } else { } }
-
Ich weiß nicht, ob es daran liegt, aber ich würde nach dem call _main noch rebooten oder ne Endlosschleife starten. Weil so wird doch nachdem main bearbeitet wurde nochmal ein cls durchgeführt und dann wird ret gestartet. Allerdings dürfte als Rücksprungadresse ja noch die von main auf dem Stack liegen, oder? Demnach wird wieder main aufgerufen, der Text nochmal ausgegeben, dann wieder cls, dann wieder Text...