Created
February 2, 2018 08:05
-
-
Save MyCatShoegazer/38dc3ee7db9627ff3a20ebdb8910f983 to your computer and use it in GitHub Desktop.
Hello World NASM boot loader example.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo on | |
echo Bulding bin file... | |
nasm loader.asm -f bin -o loader.bin | |
echo Writing bin file to ploppy | |
partcopy loader.bin 0 200 -f0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Build bin file | |
nasm loader.asm -f bin -o loader.bin | |
# Write bin file to floppy | |
dd if=loader.bin bs=512 of=/dev/fd0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[BITS 16] ;Tells the assembler that its a 16 bit code | |
[ORG 0x7C00] ;Origin, tell the assembler that where the code will | |
;be in memory after it is been loaded | |
MOV SI, HelloString ;Store string pointer to SI | |
CALL PrintString ;Call print string procedure | |
JMP $ ;Infinite loop, hang it here. | |
PrintCharacter: ;Procedure to print character on screen | |
;Assume that ASCII value is in register AL | |
MOV AH, 0x0E ;Tell BIOS that we need to print one charater on screen. | |
MOV BH, 0x00 ;Page no. | |
MOV BL, 0x07 ;Text attribute 0x07 is lightgrey font on black background | |
INT 0x10 ;Call video interrupt | |
RET ;Return to calling procedure | |
PrintString: ;Procedure to print string on screen | |
;Assume that string starting pointer is in register SI | |
next_character: ;Lable to fetch next character from string | |
MOV AL, [SI] ;Get a byte from string and store in AL register | |
INC SI ;Increment SI pointer | |
OR AL, AL ;Check if value in AL is zero (end of string) | |
JZ exit_function ;If end then return | |
CALL PrintCharacter ;Else print the character which is in AL register | |
JMP next_character ;Fetch next character from string | |
exit_function: ;End label | |
RET ;Return from procedure | |
;Data | |
HelloString db 'Hello World', 0 ;HelloWorld string ending with 0 | |
TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0 | |
DW 0xAA55 ;Add boot signature at the end of bootloader |
Can smbody help? How I might to call my extern C function from assembly code?
Just add
extern functionName
andcall functionName
wherever needed. Make sure to link the files firstDon't forget to setup 32 bit mode or compile your c for 16 bit, and use an appropriate linker
Can you give linker.ld and boot.s
No I don't know how to do it. I just know what to do, and why
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Don't forget to setup 32 bit mode or compile your c for 16 bit, and use an appropriate linker