这是我正在研究的引导加载程序的一部分
`[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寄存器?
那两个变量TOTALSECTORCOUNT
和KERNEL32SECTORCOUNT
是什么?它们不会出现在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
`
答案 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代码,我们就无法帮助。