Я недавно изучал операционные системы, процесс загрузки и NASM. В моих путешествиях я столкнулся с куском полезного кода начальной загрузки, который я частично понял и протестировал с помощью виртуальной дискеты. Мой основной вопрос заключается в том, что некоторые из этих строк я не понимаю. Я прокомментировал, что я думаю о том, что делают строки, и любые исправления или подтверждения будут высоко оценены.Базовая загрузка NASM
; This is NASM
BITS 16 ; 16 bits!
start: ; Entry point
mov ax, 07C0h ; Move the starting address (after this bootloader) into 'ax'
add ax, 288 ; Leave 288 bytes before the stack beginning for some reason
mov ss, ax ; Show 'stack segment' where our stack starts
mov sp, 4096 ; Tell 'stack pointer' that our stack is 4K in size
mov ax, 07C0h ; Use 'ax' as temporary variable for setting 'ds'
mov ds, ax ; Set data segment to where we're loaded
mov si, text_string ; Put string position into SI (the reg used for this!)
call print_string ; Call our string-printing routine
jmp $ ; Jump here - infinite loop!
text_string db 'This is my cool new OS!', 0 ; Our null terminated string
; For some reason declared after use
print_string: ; Routine: output string in SI to screen
mov ah, 0Eh ; I don't know what this does..
; Continue on to 'repeat'
.repeat:
lodsb ; Get character from DS:SI into AL
cmp al, 0 ; If end of text_string
je .done ; We're done here
int 10h ; Otherwise, print the character (What 10h means)
jmp .repeat ; And repeat
.done:
ret
times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55 ; The standard PC 'magic word' boot signature
Спасибо,
Джо
О, я вижу, поэтому 4608 байт фактически добавляются к 'ax' , Предположительно 512 из них для самого скрипта/программы, а затем 4096 из них используется для чего-то. Используется ли 4096 в качестве дискового буфера или он для самого стека - устанавливается ли «ss» в начало или конец стека? –
@ Joesavage1 SS определяет базу стека, а SP определяет, где в стеке мы находимся. Когда стек пуст, SP указывает на самое высокое смещение от SS. Это означает, что SP фактически уменьшается, когда вещи помещаются в стек и увеличиваются, когда они выскользнули.SP Всегда указывает на последнюю вещь, помещенную в стек – Dougvj
Итак, вы говорите, что это указывает _start_ стека ?! Если да, то почему мы передаем ему место («топор») 4096 байт от места хранения самого кода? (4608 из точки входа вещи) Что это за 4096 байт, если они не для стека? Кроме того, вы знаете, почему «ds» возвращается к 07C0h [7C00h] после того, как материал стека завершен? («Установите сегмент данных туда, где мы загружены») –