Bootloader内存位置

时间:2014-03-19 05:54:12

标签: bootloader osdev

这是我正在研究的引导加载程序的一部分

`[ORG 0x00]
[BITS 16]

SECTION .text

jmp 0x07c0:START                ; set CS(segment register) to 0x07C0 and jump to START label. 
TOTALSECTORCOUNT:
    dw  0x02
KERNEL32SECTORCOUNT:
    dw  0x02

START:
    mov ax, 0x07c0
    mov ds, ax                  ; set DS(segment register) to the address of the bootloader. 

mov ax, 0xb800
mov es, ax                      ; set ES(segment register) to the address of the video memory starting address. 

; stack initialization
mov ax, 0x0000
mov ss, ax
mov sp, 0xfffe
mov bp, 0xfffe

; clear the screen
mov si, 0
CLEARSCREEN:
    mov byte[es:si], 0
    mov byte[es:si + 1], 0x0a

    add si, 2
    cmp si, 80 * 25 * 2

    jl CLEARSCREEN

; print welcome message`

我不明白开头:jmp 0x07C0:START它如何设置CS寄存器? 那两个变量TOTALSECTORCOUNTKERNEL32SECTORCOUNT是什么?它们不会出现在bootsector文件中的任何位置,如果我删除它们,则引导加载程序无法加载欢迎消息。

删除部件会导致操作系统无法加载。那么jmp语句和两个变量的意义是什么?

``[ORG 0x00]
[BITS 16]

jmp START


START:
    mov ax, 0x07c0
    mov ds, ax                  ; set DS(segment register) to the address of the bootloader. 

mov ax, 0xb800
mov es, ax                      ; set ES(segment register) to the address of the video memory starting address. 

; stack initialization
mov ax, 0x0000
mov ss, ax
mov sp, 0xfffe
mov bp, 0xfffe
`

2 个答案:

答案 0 :(得分:2)

我对装配效果不佳,通常也使用 AT& T 语法。不过我之前写了一个bootloader。

希望您已经了解了16位应用程序中使用的分段寻址系统。 cs寄存器包含代码段http://wiki.osdev.org/Segmentation

jmp 0x07C0:START ;This is a long jump
jmp segment:offset

长跳转将cs寄存器设置为segment参数,然后跳转到offset参数。当你进行短跳时,cs寄存器不会改变。我假设它将包含0x0。您可以使用短跳转但必须告诉汇编器或链接器 代码将在哪里运行。

编辑:再次阅读代码后,有[org 0x00]行。这默认情况下将cs注册表设置为0x00。如果您想使用短跳,请尝试将此行更改为[org 0x7c00]

答案 1 :(得分:0)

BIOS应该已经被BIOS设置为0x7c00所以行:

jmp 0x07c0:START

可以替换为:

jmp START

您提到的两个变量必须在代码中的其他地方使用才能加载内核。但是,您似乎还没有在此处发布整个代码。

如果没有看到其余的bootsector代码,我们就无法帮助。