Galkov писал(а):
посмотри на коды FPC - увидишь Откопал свое раннее творение под названием Boot Pascal - язык для написание операционных систем. Так у меня без оптимизаций код лучше, чем у них генерится:
Program Project;
uses Vesa,System, Bios;
var i,j,p:word;
color:TColor;
begin
if i > j then
begin
p := i + j
end;
for i := 0 to 640-1 do
for j := 0 to 480-1 do
p := i + j;
readkey
end.
ASM:
.data
i dw 0
j dw 0
p dw 0
.code
start:
; if i > j then
xor ebx,ebx
mov bx,[j]
cmp [i],bx
jle @@if0
; p := i + j
xor ebx,ebx
mov bx,[i]
add bx,[j]
mov [p],bx
@@if0:
; for i := 0 to 640-1 do
mov [i],0
@@for0:
cmp [i],639
jg @@for1
; for j := 0 to 480-1 do
mov [j],0
@@for2:
cmp [j],479
jg @@for3
; p := i + j;
xor ebx,ebx
mov bx,[i]
add bx,[j]
mov [p],bx
inc [j]
jmp @@for2
@@for3:
inc [i]
jmp @@for0
@@for1:
; readkey
sub esp,1
mov ebx,esp
push ebx
call @@readkey
add esp,1
end start
;--------------------------------
@@readkey proc near
push ebp
mov ebp,esp
mov ah,0h
int 16h
mov ebx,[dword ptr ebp + 6]
mov [ byte ptr ebx ],al
pop ebp
ret 4
endp @@readkey
;--------------------------------
end
красота Добавить бы туда классы и можно было свой компилятор прикрутить.
[size=-2]------ Добавлено в 21:31
А вот так на нем выглядел ранее упоменаемый лоадер размером 512 байт:
{ MINI Boot Loader
Минимальный загрузчик для 2х физических
дисков. Он грузит НЕ ОС!, а всего лишь их
стандартные загрузчики, записанные в MBR
винчестера.
В программу не включены никакие проверки
ввода, поскольку 512 байт для такой роскоши
мало и пришлось бы делать 2х этапный
загрузчик.
}
program Hello;
{стандартное начало для Boot загрузчика}
{$ boot }
uses
System,bios;
var b:byte;
begin
{инициализируем сегмент данных}
initds
{переменная b отлична от 0 при повторном
вызове программы( ниже по тексту )}
if b
{подробнее о загрузке см. Помощь -> Загрузка }
bootfromdisk(b-1)
else
begin
clrscr
gotoxy(10,10)
writecstring("Demon Boot Loader:",clgreen)
{убрал, т.к. включение ещё какого либо
сделает размер загрузчика больше, чем
512 байт!}
{gotoxy(5,10)}
writecstring("1 - LILO ",clgray)
{gotoxy(5,11)}
writecstring("2 - Windows XP",clgray)
b := ReadKey - '0';
{грузим свою копию в новое место}
absread($1000,$7c00,1,1)
__ax := $1000
__es := __ax
{говорим ей, что пора грузить ОС}
asm
mov al,[cs:b]
mov [es:b],al
end
CallFarProc($1000,$7c00);
end
end.
- если бы в настоящее время такие штуки хоть сколько-нибудь были актуальны, можно бы было пределать как пакет к HiAsm.