Hi,
also ich hab jetzt nen funktionierenden C++-Kernel dank einem Tutorial... (PS:
http://biehler-josef.de/ Echt gut, sogar nen Tutorial wie man nen Brainfuck-Interpreter schreibt...
)... Nun, das geht ja alles... Hab auch nen Befehl um Texte auszugeben und Texte einzulesen (Solange einlesen bis Enter gedrückt wird...) Nun, jetzt habe ich nen paar Fragen:
1. Bei jeder Compilierung mit dem TurboC++-Compiler gibts ne Warnung aus:
Turbo C Version 2.01 Copyright (c) 1987, 1988 Borland International
kernel.cpp:
Warning kernel.cpp 16: Non-portable pointer assignment in function main
Available memory 434810
2. Wenn man beim eingeben die RückTaste drückt, geht nur der Cursor zurück, der Text bleibt also... Beispiel:
Cursor ganz hinten: PMTheQuick
_Jetzt drück ich die Rücktaste nen paar mal: PMThe
Quick
Es sollte aber so aussehen: PMTheQ
_3. Nach einigen Zeichen bleibt es auf einmal hängen und geht nicht mehr weiter... Ich will aber auch lange Strings ermitteln können! Was ist das Problem
4. Sollte ich noch irgendetwas verbessern daran?
Meine Proggis:
NASM
Turbo C++ Compiler 2.01
JLoc
So... Und nun noch mein Code:
start.asm
[BITS 16]
EXTERN _main
start:
jmp 07c0h:main_entry
main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti
mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
lea bx,[kernel]
int 13h
call _main
jmp $
;##Funktion zur Stringausgabe / Begrenzungszeichen: ASCII 0
GLOBAL _boot
_boot db "QuickOS 1.00",13,10,0
GLOBAL _enter
_enter db "ENTER",13,10,0
GLOBAL _newline
_newline db 13,10,0
GLOBAL _prnt
_prnt:
push bp
mov bp, sp
push ax
push si
mov ax, [bp + 4]
mov si,ax
prnt1:
mov al,[si]
cmp al,0
JE prnte
inc si
mov ah,0eh
int 10h
jmp prnt1
prnte:
pop si
pop ax
pop bp
ret
GLOBAL _strget
_strget:
xor ah,ah ; Funktion 00h
int 16h ; Ausfüren
cmp al, 0Dh ; Enter
je short str_get_end ; Wenn Enter dann beenden
mov [si], al ; Speichere Zeichen
inc SI
mov ah, 0Eh ; Ausgabe
mov bx, 0007h
int 10h
jmp _strget ; Neustart
str_get_end: ; String mit 0 Beenden
xor al,al
mov [si], al
ret
times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:
kernel.cpp
extern prnt(char *var);
extern strget();
extern char boot;
extern char enter;
extern char newline;
int main()
{
char *str;
char key[2];
int i;
str=&boot;
prnt(str);
while(1) {
str=strget();
prnt(str);
prnt(&newline);
}
}
make.txt
ALL:
start.obj
kernel.obj
DATA: 0F0000 MAIN.after MAIN.i_after
*,DGROUP
,,,FONT
FINAL: 0F0000 100000-FINAL.length FINAL.start-0F0000
*,kernel.obj
MAIN: 0F0000 0F0000 0
*
compile.bat
@echo OFF
nasm -f obj start.asm -o start.obj
tcc -c kernel.cpp
jloc make.txt kernel.bin
PAUSE
So... Danke im vorraus,
Gruss
PMTheQuick
EDIT: Ich will es mit dem C++ Kernel übrigens UNBEDINGT so lassen, das Booten & Funktionen in ASM und Funktionen-Aufrufe in C++ sind....