Page 1 of 1

Translate

Posted: Tue Dec 20, 2005 12:00 am
by try_os
Can you help me with asm-dialect ?
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:

There is my GAS code :

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: 
What is wrong in my GAS code ?
Thank you