Проблема с кодом загрузчика на ассемблере - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь понять содержимое загрузчика, но столкнулся с некоторыми проблемами в приведенной ниже части кода, пожалуйста, помогите.Я упоминаю комментарии здесь, это поможет вам, почему мы используем 07C0h, это фиксированное местоположение или произвольно, тогда как 544 во второй строке.

Bootloader_start:    
mov ax, 07C0h        ;set up 4k of stack space above buffer
add ax, 544 ;8k buffer = 512 paragraphs + 32 paragraphs 
                      ;(loader) 

cli                  ;disable interrupts while changing stack
mov ss, ax 
mov sp, 4096
sti                  ;restore interrupts

mov ax, 07C0h ;set data segment to where we are loaded
mov ds, ax

cmp dl, 0
je no_change
mov [bootdev], dl    ;save boot device number   
mov ah, 8                 ;get drive parameters
int 13h
jc fatal_disk_error
and cx, 3fh              ;maximum sector number 
mov [SectorsPerTrack], cx  ;Sector numbers start at 1
movzx dx, dh        ;maximum head number
add dx, 1.             ;head number starts at 0 - add 1 for total
mov [Sides], dx

...... продолжается

1 Ответ

2 голосов
/ 10 июля 2019
Bootloader_start:    
mov ax, 07C0h   ;set up 4k of stack space above buffer
add ax, 544     ;8k buffer = 512 paragraphs + 32 paragraphs (loader) 

cli             ;disable interrupts while changing stack
mov ss, ax 
mov sp, 4096
sti             ;restore interrupts

mov ax, 07C0h   ;set data segment to where we are loaded
mov ds, ax

Сначала очевидная оптимизация, которая позволила бы избежать правильной критики со стороны Питера о неиспользовании добавления во время сборки:

Bootloader_start:    
mov ax, 07C0h  ;set up 4k of stack space above buffer
MOV DS, AX
add ax, 544    ;8k buffer = 512 paragraphs + 32 paragraphs (loader) 
cli            ;disable interrupts while changing stack
mov ss, ax 
mov sp, 4096
sti            ;restore interrupts

Тогда почему 544?

Автор хочет иметь 8192-байтовый буфер плюс 4096-байтовый стек прямо над загрузчиком, который находится в памяти по линейному адресу 7C00h.

Делайте математику, зная, что линейный адрес7C00h - это абзац 07C0h:

              Paragraph
              ---------
                07C0h    Bootloader 512 bytes ==  32 paragraphs (20h)
07C0h + 0020h = 07E0h    Buffer    8192 bytes == 512 paragraphs (200h)
07E0h + 0200h = 09E0h    Stack     4096 bytes
                                                 ---
                                                 544

Дно стека находится в абзаце 09E0h, который равен 07C0h + (32 + 512) или 07C0h + 544.
Затем указатель стека SP устанавливается со смещением 4096, поэтомуу нас полный SS:SP.

...