how do i compile my assembly code into a raw bin file so i can use it in a boot loader?
There was a thread about this already. Do a board search :)
i did, it came up witth junk. i dont know what keywords to search for
what I found is that you have an older version of link that can use 16 bit code. Masm handles that without problems.
Correct me if I'm wrong.
Correct me if I'm wrong.
where can i get this 16 bit compiler?
as far as i understand it you compile with masm and use the old link version which you can download at iczelions site: www.win32asm.cjb.net
in the downloads section.
in the downloads section.
Microsoft Linker for those who want to use MASM to code DOS programs. You MUST use this linker instead of the one from MASM32.
I seem to recall to have read that FASM is able to assemble raw code...
im a loyal masm user. i dont go for non-standard hll-based compilers like fasm/nasm/spasm. but ive got it working. i seem to have to hex edit out 512 bytes of 0s before the code/boot seg wich is also 512 bytes. anyi deas how to get it only the code?
"hll-based compilers like fasm/nasm/spasm" haha. Masm is the most hll of these... anyway, get 16bit linker from iczelions site, then exe2bin from somewhere (it's included in win2k, and it's not hard to write your own).
im a loyal masm user.
I'm loyal to what gets the job done the best... especially when it comes to compilers and assemblers...
Lots of good assembly programmers switched from MASM to FASM in the past weeks... loyalty is for relationship and work relations, not for programming imho. ;)
But I see what you mean... :)
i dont go for non-standard hll-based compilers like fasm/nasm/spasm.
FASM, nasm and spasm HLL based? ?_o
Or did you mean that the hll of these assemblers is "non-standard" (then, to what ? MASM?) and afaik the HLL support in these assemblers is provided by macros, unlike MASM where they are built-in.
Regards,
im having trouble with my boot sector, it shows a jumble of letters, but not the message i want it to display
.286
.model tiny, stdcall
option casemap :none
;-- --------------------------------------------------------------------
; Simple boot program that prints the letter 'H'
; and then hangs
; Joel Gompert 2001
;
; Disclaimer: I am not responsible for any results of the use of the contents
; of this file
;----------------------------------------------------------------------
.code
; This is where BIOS loads the bootloader
; Execution begins here
entry:
jmp short begin ; jump over the DOS boot record data
; ----------------------------------------------------------------------
; data portion of the "DOS BOOT RECORD"
; ----------------------------------------------------------------------
brINT13Flag DB 90H ; 0002h - 0EH for INT13 AH=42 READ
brOEM DB 'MSDOS5.0' ; 0003h - OEM name & DOS version (8 chars)
brBPS DW 512 ; 000Bh - Bytes/sector
brSPC DB 1 ; 000Dh - Sectors/cluster
brResCount DW 1 ; 000Eh - Reserved (boot) sectors
brFATs DB 2 ; 0010h - FAT copies
brRootEntries DW 0E0H ; 0011h - Root directory entries
brSectorCount DW 2880 ; 0013h - Sectors in volume, < 32MB
brMedia DB 240 ; 0015h - Media descriptor
brSPF DW 9 ; 0016h - Sectors per FAT
brSPH DW 18 ; 0018h - Sectors per track
brHPC DW 2 ; 001Ah - Number of Heads
brHidden DD 0 ; 001Ch - Hidden sectors
brSectors DD 0 ; 0020h - Total number of sectors
DB 0 ; 0024h - Physical drive no.
DB 0 ; 0025h - Reserved (FAT32)
DB 29H ; 0026h - Extended boot record sig
brSerialNum DD 404418EAH ; 0027h - Volume serial number (random)
brLabel DB 'randys disk' ; 002Bh - Volume label (11 chars)
brFSID DB 'FAT12 ' ; 0036h - File System ID (8 chars)
;------------------------------------------------------------------------
; --------------------------------------------
; Boot program code begins here
; --------------------------------------------
; boot code begins at 0x003E
nop
nop
nop
nop
nop
nop
nop
begin:
xor ax, ax ; zero out ax
mov ds, ax ; set data segment to base of RAM
mov ss,ax
mov sp, 7D00h
mov bp, sp
mov si, offset msg ; load address of our message
jmp putstr ; print the message
hang:
jmp hang ; just loop forever.
putstr:
;lodsb ; AL = [DS:SI]
mov al, byte ptr DS:[SI]
or al, al ; Set zero flag if al=0
je hang ; jump to putstrd if zero flag is set
mov ah, 0Eh ; video function 0Eh (print char)
mov bx, 0007h ; color
int 10h
inc si
jmp putstr
msg db 'Randys Operating system',0
;---------------------------------------------
d:
times db (512 - (offset d - offset entry) - 2) dup(0)
db 55h, 0AAh ;2 byte boot signature
end entry
i had to add 7c00 to the offset!!!!!i dont know the tiny memory model, how do i get the complete memory address?
I anm glad there are still a few MASM purists who enjoy the sheer low level grunt of MASM.
Regards,
hutch@movsd.com
Regards,
hutch@movsd.com
Qages,
the boot sector is not read to the base of ram. It is read to 7C00h. You have to set DS accordingly, or add the 7C00h manually as you have done.
You can look here for more info: http://www.nondot.org/sabre/os/articles/TheBootProcess/
specifically: http://www.nondot.org/sabre/os/files/Booting/BootSector.html
--Chorus
the boot sector is not read to the base of ram. It is read to 7C00h. You have to set DS accordingly, or add the 7C00h manually as you have done.
You can look here for more info: http://www.nondot.org/sabre/os/articles/TheBootProcess/
specifically: http://www.nondot.org/sabre/os/files/Booting/BootSector.html
--Chorus
Yep, better set up your segments manually, and don't reference anything through CS... some BIOSes are broken in the way they set up CS:IP (ie, some have 0:7C00, some have 7C0:0).
This is the start of a working boot sector code:
As f0dder tells, better dont use simplified segment directives.
.386
@pushws macro value
db 6ah
db value
endm
@pushdws macro value
db 66h
db 6ah
db value
endm
_TEXT segment use16 'CODE'
assume ds:_TEXT
org 7C00h
L0100:
jmp L015A
nop
L7C03 db "MSWIN4.1"
L7C0B:
db 11h dup(0)
L7C1C dd 0
db 27h dup(0)
db 11 dup(0) ;label
db 8 dup(0) ;"FAT32 "
L015A:
cli
xor cx,cx
mov ss,cx
mov sp,7BF8h
mov es,cx
mov bp,0078h
As f0dder tells, better dont use simplified segment directives.
Also, you might want to use nasm for bootsector writing... direct binary output and better opcode controls are advantagous when dealing with code like this.
You can get the nice bootsector example here: http://fasm.sf.net/phboot.zip (I'm sorry, it's written for fasm ;))
used nasm for it, fasm is stupid!
used nasm for it, fasm is stupid!
This opinion is stupid, too.
What is stupid about FASM in your opinion?