Cześć!
Jakieś 15 lat temu pisałem własny system operacyjny.
Aktualnie jestem programistą C/C++ dla Embedded/Linux i dla odetchnienia postanowiłem wrócić do tamtych czasów.
System który wtedy napisałem był już dość zaawansowany, posiadał stos TCP/IP, serwer HTTP, własne mini kompilatory. Jak teraz do tego wracam, to lekka magia :)
Chciałbym teraz napisać coś na nowo, lecz całkowicie zgodnie ze sztuką programowania.
Robię teraz wszystko krok po kroku.
Ze względu że odświeżam sobie assemblera, schematy funkcji, gdzie argumenty są przekazywane przez stos, chciałbym o abyście przeanalizowali ten kawałek kodu.
[ORG 0x7C00]
[BITS 16]
; STACK
mov ax, 0x1000
mov ss, ax
xor sp, sp
push msg
call puts
add sp, 0x02
push msg
call puts
add sp, 0x02
forever:
jmp forever
puts:
push bp
mov bp, sp
mov si, [bp+0x04]
puts_loop:
mov ax, [si]
cmp al, 0x0
jz puts_exit
push ax
call putc
add sp, 0x02
inc si
jmp puts_loop
puts_exit:
;leave
mov sp, bp
pop bp
ret
putc:
push bp
mov bp, sp
mov ah, 0x0e
mov al, [bp + 0x4]
int 0x10
;leave
mov sp, bp
pop bp
ret
msg: db 'Hello World!', 13, 10, 0
times 510 - ($ - $$) db 0
dw 0xAA55
Tutaj chciałbym się poczuć jako super początkujący i przyjąć wszystkie uwagi i krytykę:
- Uwagi dotyczące formatowania kodu dla assemblera
- Szablon funkcji, przekazywanie argumentów, wyrównywanie stosu po wykonaniu funkcji
- Nazwy funkcji
- Wszystko inne czego nie poruszyłem
Budowanie i uruchomienie (np. aktualny Debian i jego programy z repozytorium):
nasm -f bin boot.asm -o boot
qemu-system-i386 -fda boot
Bardzo dziękuję i pozdrawiam,
OsReBeginner