Bootloader memory location

穿精又带淫゛_ 提交于 2019-12-13 06:17:17

问题


This is a part of a bootloader that I am studying from

`[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`

I don't understand the beginning: jmp 0x07C0:START How does it set the CS register? And what are the two variables TOTALSECTORCOUNT and KERNEL32SECTORCOUNT for? They don't appear anywhere in the bootsector file and if I remove them, the bootloader fails to load the welcome message.

Removing the parts causes the OS to fail to load. So what is the significance of that jmp statement and the two variables?

``[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
`

回答1:


I am not great with assembly and usually use the AT&T syntax also. I have however written a bootloader before.

Hopefully you have learnt about the segmented addressing system used in 16 bit applications. The cs register holds the code segment. http://wiki.osdev.org/Segmentation

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

A long jump sets the cs register to segment parameter and then does a jump to the offset parameter. When you do a short jump the cs register doesn't change. I assume that it would contain 0x0. You can use a short jump but you must tell your assembler or linker where the code will be run.

EDIT: After reading the code again there is the [org 0x00] line. This sets the cs register to 0x00 by default. If you wanted to use the short jump try changing this line to [org 0x7c00]




回答2:


CS should already be set to 0x7c00 by the BIOS so the line:

jmp 0x07c0:START

can be replaced by:

jmp START

The two variables you mention must be use elsewhere in the code to load the kernel. However, it appears you haven't posted the whole code here.

Without seeing the rest of the bootsector code, we cannot help.



来源:https://stackoverflow.com/questions/22497418/bootloader-memory-location

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!