Browse Source

:tada: 创建了boot程序!

fslongjin 3 years ago
commit
eb37e8a20c
5 changed files with 82 additions and 0 deletions
  1. 2 0
      .gitignore
  2. 8 0
      .idea/.gitignore
  3. 6 0
      CMakeLists.txt
  4. 9 0
      bootloader/CMakeLists.txt
  5. 57 0
      bootloader/boot.asm

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+/cmake-build-debug/
+/bin/

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 6 - 0
CMakeLists.txt

@@ -0,0 +1,6 @@
+cmake_minimum_required(VERSION 3.20)
+project(dragonOS C)
+
+set(CMAKE_C_STANDARD 11)
+add_subdirectory(bootloader)
+

+ 9 - 0
bootloader/CMakeLists.txt

@@ -0,0 +1,9 @@
+set(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS nasm asm S)
+set(CMAKE_ASM_NASM_OBJECT_FORMAT bin)
+set(CMAKE_ASM_NASM_FLAGS "-e")
+set(CMAKE_ASM_NASM_LINK_EXECUTABLE "nasm <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
+enable_language(ASM_NASM)
+
+#修改输出的路径
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
+add_executable(boot.bin boot.asm)

+ 57 - 0
bootloader/boot.asm

@@ -0,0 +1,57 @@
+;将程序开始位置设置为0x7c00处,并给BaseOfStack赋值为0x7c00
+    org 0x7c00
+
+BaseOfStack	equ	0x7c00
+
+Label_Start:
+    ;初始化寄存器
+    mov ax, cs
+    mov ds, ax
+    mov es, ax
+    mov ss, ax
+    mov sp, BaseOfStack
+
+    ;清屏
+    mov ax, 0x0600  ;AL=0时,清屏,BX、CX、DX不起作用
+    mov bx, 0x0700  ;设置白色字体,不闪烁,字体正常亮度,黑色背景
+    mov cx, 0
+    mov dx, 0184fh
+    int 10h
+
+    ;设置屏幕光标位置为左上角(0,0)的位置
+    mov ax, 0x0200
+    mov bx, 0x0000
+    mov dx, 0x0000
+    int 10h
+
+    ;在屏幕上显示Start Booting
+    mov ax, 0x1301 ;设置显示字符串,显示后,光标移到字符串末端
+    mov bx, 0x000f ;设置黑色背景,白色字体,高亮度,不闪烁
+    mov dx, 0x0000 ;设置游标行列号均为0
+    mov cx, 10 ;设置字符串长度为10
+
+            ;为什么这里不能直接把ds赋值给es?
+    push ax
+    mov ax, ds
+    mov es, ax
+    pop ax
+    mov bp, StartBootMessage
+    int 10h
+
+    ;软盘驱动器复位
+    xor ah, ah
+    xor dl, dl
+    int 13h
+
+    jmp $
+
+StartBootMessage:   db  "Start Boot"
+
+;填满整个扇区的512字节
+    times 510 - ( $ - $$ ) db 0
+    dw 0xaa55 ;===确保以0x55 0xaa为结尾
+
+
+
+
+