void print(char far* s){
asm{
push es // nie wiem czy to potrzebne, to twoj kernel ale na push/pop niewiele stracisz czasu
push di
mov di,word ptr [s]
mov ax,word ptr [s+2]
mov es,ax
mov bx,0007h
mov ah,0eh
}
loop:
asm{
mov al,byte ptr es:[di]
test al,al
jz end
int 10h
inc di
jmp loop
}
end:
asm{
pop di
pop es
}
}
void scan(char far* s,unsigned limit){ // limit ilosc znakow+0
asm{
push es
push di
mov dx,[limit]
mov di,word ptr [s]
mov ax,word ptr [s+2]
mov es,ax
mov bx,0007h
}
loop:
asm{
dec dx
}
shortloop:
asm{
xor ah,ah
int 16h
cmp al,0dh // ctrl m/enter
je end
cmp al,03h // ctrl c/ctrl pause
je ctrlc
cmp al,08h // ctrl h/backspace
je backspace
test dx,dx
jz shortloop
cmp al,20h
jb shortloop // znakow kontrolnych (ascii<32) nie wpiszesz
mov byte ptr es:[di],al
inc di
mov byte ptr es:[di],0
mov ah,0eh
int 10h
jmp loop
}
backspace:
asm{
mov ax,[limit]
dec ax
cmp dx,ax
jnb shortloop
mov ax,0e08h
int 10h
mov ax,0a20h
mov cx,01h
int 10h
inc dx
dec di
jmp shortloop
}
ctrlc:
asm{
mov di,word ptr [s]
mov byte ptr es:[di],0
mov ax,0e5eh // '^' w al
int 10h
mov al,63h // 'c'
int 10h
}
end:
asm{
pop di
pop es
}
}
int main(){
print("\r\nala ma zielonego kota\r\n");
char a[10];
scan(a,10);
print("\r\n");
print(a);
print("\r\n");
return 0;
}
// A może całego kernela za ciebie napisać ? Tylko wstawić twoje nazwisko ? Skoro z takimi rzeczami masz problem, to z obslugą dysków i pamięci w ogóle nie ruszysz... Zanim zaczniesz pisać systemy jeszcze wiele wody uplynie.
[dopisane]
Piszesz kernela... Jądro... Podstawę systemu. Pierwsze co musisz zrobić pisząc system, to stworzyć całą kolekcję własnych funkcji i bibliotek do kompilatora, który sobie wybierzesz. Jesli bedziesz korzystał z gotowych funkcji pisanych dla danego systemu (jak putch() w tym przypadku), to cała robota mija sie z celem. putch() jest oparte na mechanizmach systemowych (dla dosa int 21h - przerwanie systemowe), a pisząc kernela wolno korzystać tylko i wylącznie z mechanizmów sprzętowych, niezależnych od jakiegokolwiek systemu.
To, co napisałem kompiluje sie pod borlandem (bc ver<4 na pewno), ale nie jest trudno przerobić to tak, by działało pod każdym kompilatorem, który kompiluje również wstawki assemblerowe.
Dobra rada. Zostaw tą robotę dopóki nie nauczysz się dobrze c/cpp ewentualnie inneg jezyka wyższego rzędu i również assemblera, bo bez tego wbrew pozorom nie ruszysz.