I have nasm code :
Code: Select all
GLOBAL entry
entry:
; check if data segment linked, located, and loaded properly
mov eax,[ds_magic]
cmp eax,DS_MAGIC
je ds_ok
; display a blinking white-on-blue 'D' and freeze
mov word [0B8000h],9F44h
jmp short $
ds_ok:
; stop using bootloader GDT, and load new GDT
lgdt [gdt_ptr]
mov ax,LINEAR_DATA_SEL
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov gs,ax
jmp LINEAR_CODE_SEL:sbat
sbat:
; zero the C language BSS
; 'bss' and 'end' are defined in the linker script file
EXTERN bss, end
mov edi,bss
mov ecx,end
sub ecx,edi
xor eax,eax
rep stosb
mov esp,stack
IMP main
call main ; call C code
jmp $ ; freeze
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Multiboot header for GRUB bootloader. This must be in the first 8K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
; these are in the linker script file
EXTERN code, bss, end
ALIGN 4
mboot:
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
; aout kludge. These must be PHYSICAL addresses
dd mboot
dd code
dd bss
dd end
dd entry
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECTION .data
ds_magic:
dd DS_MAGIC
gdt:
; NULL descriptor
dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
; unused descriptor
dw 0
dw 0
db 0
db 0
db 0
db 0
LINEAR_DATA_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 92h ; present, ring 0, data, expand-up, writable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
LINEAR_CODE_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 9Ah ; present,ring 0,code,non-conforming,readable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1
dd gdt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECTION .bss
resd 1024
stack:
Code: Select all
.globl entry
entry:
# check if data segment linked, located, and loaded properly
movl $ds_magic,%eax
cmp %eax,$DS_MAGIC
je ds_ok
# display a blinking white-on-blue 'D' and freeze
movw $0x9F44,($0xB8000)
jmp $
ds_ok:
# stop using bootloader GDT, and load new GDT
lgdt ($gdt_ptr)
mov $LINEAR_DATA_SEL,%eax
movw %ax,%ds
movw %ax,%es
movw %ax,%ss
movw %ax,%fs
movw %ax,%gs
jmp LINEAR_CODE_SEL:sbat
sbat:
# zero the C language BSS
# 'bss' and 'end' are defined in the linker script file
.extern bss, end
mov bss,%edi
mov end,$ecx
subl %edi,%ecx
xorl %eax,%eax
rep
stosb
mov stack,%esp
.extern main
call main # call C code
right:
jmp right
##############################################################################
# Multiboot header for GRUB bootloader. This must be in the first 8K
##############################################################################
.align 4
mboot:
.set MULTIBOOT_PAGE_ALIGN, 1<<0
.set MULTIBOOT_MEMORY_INFO, 1<<1
.set MULTIBOOT_AOUT_KLUDGE, 1<<16
.set MULTIBOOT_HEADER_MAGIC, 0x1BADB002
.set MULTIBOOT_HEADER_FLAGS , MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
.set MULTIBOOT_CHECKSUM , -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
# these are in the linker script file
.extern code, bss, end
.long MULTIBOOT_HEADER_MAGIC
.long MULTIBOOT_HEADER_FLAGS
.long MULTIBOOT_CHECKSUM
# aout kludge. These must be PHYSICAL addresses
.long mboot
.long code
.long bss
.long end
.long entry
##############################################################################
.data
ds_magic: $DS_MAGIC
gdt:
# NULL descriptor
.word 0 # limit 15:0
.word 0 # base 15:0
.byte 0 # base 23:16
.byte 0 # type
.byte 0 # limit 19:16, flags
.byte 0 # base 31:24
# unused descriptor
.word 0
.word 0
.byte 0
.byte 0
.byte 0
.byte 0
.equ LINEAR_DATA_SEL, $-gdt
.word 0xFFFF
.word 0
.byte 0
.byte 0x92 # present, ring 0, data, expand-up, writable
.byte 0xCF # page-granular (4 gig limit), 32-bit
.byte 0
.equ LINEAR_CODE_SEL, $-gdt
.word 0xFFFF
.word 0
.byte 0
.byte 0x9A # present,ring 0,code,non-conforming,readable
.byte 0xCF # page-granular (4 gig limit), 32-bit
.byte 0
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1
dd gdt
##############################################################################
.section .bss
.lcomm Stack, 1024*4 # This reserves 8KBytes of memory here
stack:
stack:
Thank you