Pregunta

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
`
¿Fue útil?

Solución

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]

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top