Зачем нам нужен ORG 0x7c00 в начале загрузчика?

#assembly #operating-system #nasm #bootloader #bios

Вопрос:

В каждом коде загрузчика, который я видел, в начале файла есть строка «ORG 0x7c00». Насколько я знаю, BIOS поместит этот код по адресу 0x7c00.

Так в чем же причина выполнения «org 0x7c00»? Разве это не правда, что если первая инструкция загружена в 0x7c00, счетчик автоматически запустится оттуда? Разве адрес каждой инструкции в любом случае не смещен на 0x7c00 ?

Комментарии:

1. org 0x7c00 необходимо сообщить ассемблеру, что это адрес загрузки. Если вы этого не сделаете, он будет считать, что адрес загрузки таков 0x0000 .

2. Также обратите внимание, что из-за адресации в реальном режиме вы можете работать с 0:7c00 или 7c0:0 (или любым другим отображением, но на практике вы увидите только эти два). Вы должны перезагрузиться CS:IP с вашими предпочтительными значениями, и это означает, что вы можете очень хорошо использовать ORG 0 (или оставить его по умолчанию).

3. @fuz итак, вы имеете в виду, что bios не знает, что я загружу загрузчик в 0x7c00, вместо этого загрузчик сообщает ему об этом?

4. @banana3227 Еще раз: BIOS знает, но ассемблер-нет. Ассемблеру необходимо знать адрес загрузки, чтобы он мог правильно вычислять адреса. Этому BIOS совершенно все равно, как вы пишете свой загрузчик, он просто загружает его 7c00 и переходит к началу.

Ответ №1:

Если у вас есть следующий код:

 org 0x7c00

bits 16

jmp somefunction

somefunction:
xor ax, ax
mov ds, ax

cli

lgdt[gdtr]

mov eax, cr0
or al, 1
mov cr0, eax

jmp 0x08:protectedMode
                        
bits 32

protectedMode:

mov ax, 0x10
mov ds, ax

hlt

gdt_start:
        dq 0x0
gdt_code:
        dw 0xFFFF   ;limit 0-15
        dw 0x0      ;base 0-15
        db 0x0      ;base 16-23 
        db 10011010b    ;pr, privi (2), s, ex, dc, rw, ac 
        db 11001111b    ;gr, sz, limit 16-19
        db 0x0      ;base 24-31
gdt_data:
        dw 0xFFFF
        dw 0x0
        db 0x0
        db 10010010b
        db 11001111b
        db 0x0  
gdtr:
        dw 24
        dd gdt_start

times 510 - ($-$) db 0
dw 0xAA55
 

Соберите с. nasm -fbin boot.s -oboot.bin Вы можете легко разобрать первую часть (16-битную часть) boot.bin с помощью ndisasm, чтобы посмотреть, что произойдет. Выполните команду ndisasm -b16 boot.bin и посмотрите результат:

 00000000  EB00              jmp short 0x2
00000002  31C0              xor ax,ax
00000004  8ED8              mov ds,ax
00000006  FA                cli
00000007  0F0116387C        lgdt [0x7c38]
0000000C  0F20C0            mov eax,cr0
0000000F  0C01              or al,0x1
00000011  0F22C0            mov cr0,eax
00000014  EA197C0800        jmp 0x8:0x7c19
00000019  66B810008ED8      mov eax,0xd88e0010
0000001F  F4                hlt
00000020  0000              add [bx si],al
00000022  0000              add [bx si],al
00000024  0000              add [bx si],al
00000026  0000              add [bx si],al
00000028  FF                db 0xff
00000029  FF00              inc word [bx si]
0000002B  0000              add [bx si],al
0000002D  9ACF00FFFF        call 0xffff:0xcf
00000032  0000              add [bx si],al
00000034  0092CF00          add [bp si 0xcf],dl
00000038  1800              sbb [bx si],al
0000003A  207C00            and [si 0x0],bh
0000003D  0000              add [bx si],al
0000003F  0000              add [bx si],al
00000041  0000              add [bx si],al
00000043  0000              add [bx si],al
00000045  0000              add [bx si],al
00000047  0000              add [bx si],al
00000049  0000              add [bx si],al
0000004B  0000              add [bx si],al
0000004D  0000              add [bx si],al
0000004F  0000              add [bx si],al
00000051  0000              add [bx si],al
00000053  0000              add [bx si],al
00000055  0000              add [bx si],al
00000057  0000              add [bx si],al
00000059  0000              add [bx si],al
0000005B  0000              add [bx si],al
0000005D  0000              add [bx si],al
0000005F  0000              add [bx si],al
00000061  0000              add [bx si],al
00000063  0000              add [bx si],al
00000065  0000              add [bx si],al
00000067  0000              add [bx si],al
00000069  0000              add [bx si],al
0000006B  0000              add [bx si],al
0000006D  0000              add [bx si],al
0000006F  0000              add [bx si],al
00000071  0000              add [bx si],al
00000073  0000              add [bx si],al
00000075  0000              add [bx si],al
00000077  0000              add [bx si],al
00000079  0000              add [bx si],al
0000007B  0000              add [bx si],al
0000007D  0000              add [bx si],al
0000007F  0000              add [bx si],al
00000081  0000              add [bx si],al
00000083  0000              add [bx si],al
00000085  0000              add [bx si],al
00000087  0000              add [bx si],al
00000089  0000              add [bx si],al
0000008B  0000              add [bx si],al
0000008D  0000              add [bx si],al
0000008F  0000              add [bx si],al
00000091  0000              add [bx si],al
00000093  0000              add [bx si],al
00000095  0000              add [bx si],al
00000097  0000              add [bx si],al
00000099  0000              add [bx si],al
0000009B  0000              add [bx si],al
0000009D  0000              add [bx si],al
0000009F  0000              add [bx si],al
000000A1  0000              add [bx si],al
000000A3  0000              add [bx si],al
000000A5  0000              add [bx si],al
000000A7  0000              add [bx si],al
000000A9  0000              add [bx si],al
000000AB  0000              add [bx si],al
000000AD  0000              add [bx si],al
000000AF  0000              add [bx si],al
000000B1  0000              add [bx si],al
000000B3  0000              add [bx si],al
000000B5  0000              add [bx si],al
000000B7  0000              add [bx si],al
000000B9  0000              add [bx si],al
000000BB  0000              add [bx si],al
000000BD  0000              add [bx si],al
000000BF  0000              add [bx si],al
000000C1  0000              add [bx si],al
000000C3  0000              add [bx si],al
000000C5  0000              add [bx si],al
000000C7  0000              add [bx si],al
000000C9  0000              add [bx si],al
000000CB  0000              add [bx si],al
000000CD  0000              add [bx si],al
000000CF  0000              add [bx si],al
000000D1  0000              add [bx si],al
000000D3  0000              add [bx si],al
000000D5  0000              add [bx si],al
000000D7  0000              add [bx si],al
000000D9  0000              add [bx si],al
000000DB  0000              add [bx si],al
000000DD  0000              add [bx si],al
000000DF  0000              add [bx si],al
000000E1  0000              add [bx si],al
000000E3  0000              add [bx si],al
000000E5  0000              add [bx si],al
000000E7  0000              add [bx si],al
000000E9  0000              add [bx si],al
000000EB  0000              add [bx si],al
000000ED  0000              add [bx si],al
000000EF  0000              add [bx si],al
000000F1  0000              add [bx si],al
000000F3  0000              add [bx si],al
000000F5  0000              add [bx si],al
000000F7  0000              add [bx si],al
000000F9  0000              add [bx si],al
000000FB  0000              add [bx si],al
000000FD  0000              add [bx si],al
000000FF  0000              add [bx si],al
00000101  0000              add [bx si],al
00000103  0000              add [bx si],al
00000105  0000              add [bx si],al
00000107  0000              add [bx si],al
00000109  0000              add [bx si],al
0000010B  0000              add [bx si],al
0000010D  0000              add [bx si],al
0000010F  0000              add [bx si],al
00000111  0000              add [bx si],al
00000113  0000              add [bx si],al
00000115  0000              add [bx si],al
00000117  0000              add [bx si],al
00000119  0000              add [bx si],al
0000011B  0000              add [bx si],al
0000011D  0000              add [bx si],al
0000011F  0000              add [bx si],al
00000121  0000              add [bx si],al
00000123  0000              add [bx si],al
00000125  0000              add [bx si],al
00000127  0000              add [bx si],al
00000129  0000              add [bx si],al
0000012B  0000              add [bx si],al
0000012D  0000              add [bx si],al
0000012F  0000              add [bx si],al
00000131  0000              add [bx si],al
00000133  0000              add [bx si],al
00000135  0000              add [bx si],al
00000137  0000              add [bx si],al
00000139  0000              add [bx si],al
0000013B  0000              add [bx si],al
0000013D  0000              add [bx si],al
0000013F  0000              add [bx si],al
00000141  0000              add [bx si],al
00000143  0000              add [bx si],al
00000145  0000              add [bx si],al
00000147  0000              add [bx si],al
00000149  0000              add [bx si],al
0000014B  0000              add [bx si],al
0000014D  0000              add [bx si],al
0000014F  0000              add [bx si],al
00000151  0000              add [bx si],al
00000153  0000              add [bx si],al
00000155  0000              add [bx si],al
00000157  0000              add [bx si],al
00000159  0000              add [bx si],al
0000015B  0000              add [bx si],al
0000015D  0000              add [bx si],al
0000015F  0000              add [bx si],al
00000161  0000              add [bx si],al
00000163  0000              add [bx si],al
00000165  0000              add [bx si],al
00000167  0000              add [bx si],al
00000169  0000              add [bx si],al
0000016B  0000              add [bx si],al
0000016D  0000              add [bx si],al
0000016F  0000              add [bx si],al
00000171  0000              add [bx si],al
00000173  0000              add [bx si],al
00000175  0000              add [bx si],al
00000177  0000              add [bx si],al
00000179  0000              add [bx si],al
0000017B  0000              add [bx si],al
0000017D  0000              add [bx si],al
0000017F  0000              add [bx si],al
00000181  0000              add [bx si],al
00000183  0000              add [bx si],al
00000185  0000              add [bx si],al
00000187  0000              add [bx si],al
00000189  0000              add [bx si],al
0000018B  0000              add [bx si],al
0000018D  0000              add [bx si],al
0000018F  0000              add [bx si],al
00000191  0000              add [bx si],al
00000193  0000              add [bx si],al
00000195  0000              add [bx si],al
00000197  0000              add [bx si],al
00000199  0000              add [bx si],al
0000019B  0000              add [bx si],al
0000019D  0000              add [bx si],al
0000019F  0000              add [bx si],al
000001A1  0000              add [bx si],al
000001A3  0000              add [bx si],al
000001A5  0000              add [bx si],al
000001A7  0000              add [bx si],al
000001A9  0000              add [bx si],al
000001AB  0000              add [bx si],al
000001AD  0000              add [bx si],al
000001AF  0000              add [bx si],al
000001B1  0000              add [bx si],al
000001B3  0000              add [bx si],al
000001B5  0000              add [bx si],al
000001B7  0000              add [bx si],al
000001B9  0000              add [bx si],al
000001BB  0000              add [bx si],al
000001BD  0000              add [bx si],al
000001BF  0000              add [bx si],al
000001C1  0000              add [bx si],al
000001C3  0000              add [bx si],al
000001C5  0000              add [bx si],al
000001C7  0000              add [bx si],al
000001C9  0000              add [bx si],al
000001CB  0000              add [bx si],al
000001CD  0000              add [bx si],al
000001CF  0000              add [bx si],al
000001D1  0000              add [bx si],al
000001D3  0000              add [bx si],al
000001D5  0000              add [bx si],al
000001D7  0000              add [bx si],al
000001D9  0000              add [bx si],al
000001DB  0000              add [bx si],al
000001DD  0000              add [bx si],al
000001DF  0000              add [bx si],al
000001E1  0000              add [bx si],al
000001E3  0000              add [bx si],al
000001E5  0000              add [bx si],al
000001E7  0000              add [bx si],al
000001E9  0000              add [bx si],al
000001EB  0000              add [bx si],al
000001ED  0000              add [bx si],al
000001EF  0000              add [bx si],al
000001F1  0000              add [bx si],al
000001F3  0000              add [bx si],al
000001F5  0000              add [bx si],al
000001F7  0000              add [bx si],al
000001F9  0000              add [bx si],al
000001FB  0000              add [bx si],al
000001FD  0055AA            add [di-0x56],dl
 

Короткий скачок, такой как jmp, к метке относителен. Это означает, что переход будет работать, даже если у вас нет директивы org. В то же время дальний прыжок является абсолютным. Он переходит к адресу, указанному в качестве пары сегмент:смещение. Директива org указывает ассемблеру добавить значение org (источник) к смещению. Это позволяет, когда вы далеко переходите к метке с неизвестной позицией (вместо жесткого кодирования позиции метки), смещение будет правильно рассчитано ассемблером с учетом фактического положения кода в оперативной памяти.

В приведенном выше примере директива org полезна только для перехода в защищенный режим и для инструкции lgdt. Вы видите, что дальний прыжок разобран на линию 00000014 EA197C0800 jmp 0x8:0x7c19 . Адрес дальнего прыжка является абсолютным, что означает, что адрес вычисляется напрямую. Если у вас нет директивы org, вместо этого будет выполнен разборный прыжок far jmp 0x8:0x19 . Это не тот адрес. Это приведет к переходу на адрес 0x19, который не работает с тем фактом, что ваш код загрузчика будет загружен в 0x7c00. Вам нужно сказать ассемблеру, чтобы он добавил 0x7c00 ко всем абсолютным адресам (в основном к дальним переходам и инструкции lgdt).

Комментарии:

1. Спасибо! это именно то, что я так долго искал!