org 100h             ; 程序加载到内存100h处执行
BaseOfStack     equ  0100h  ; 定义Stack基址BaseOfKernelFile  equ  08000h  ; Kernel.bin被加载到的位置 ---段地址
OffsetOfKernelFile   equ  0h  ; Kernel.bin被加载到的位置 ---偏移地址jmp LABEL_START       ; Start%include   "fat12hdr.inc"   ; 定义程序中使用的参数
LABEL_START:           ; 从这里开始mov ax,csmov ds,axmov es,axmov ss,axmov sp,BaseOfStackmov  dh,0          ;"Loading   "call  DispStr         ;显示字串;下面在A盘的根目录中寻找Kernel.binmov  word [wSectorNo],SectorNoOfRootDirectoryxor  ah,ahxor  dl,dlint  13h                ;软驱复位
LABEL_SEARCH_IN_ROOT_DIR_BEGIN:cmp  word[wRootDirSizeForLoop],0    jz  LABEL_NO_KERNELBIN   ;根目录读完未找到则跳转dec  word[wRootDirSizeForLoop]mov  ax,BaseOfKernelFilemov  es,ax          ; es <- BaseOfKernelFile  ES段寄存器,此处不支持立即数寻址mov  bx,OffsetOfKernelFile  ; bx <- OffsetOfKernelFilemov  ax,[wSectorNo]     ; ax <- Root Directory 中的某 Sector号mov  cl,1call  ReadSector       ; 从序号为ax的扇区开始读入cl个扇区至内存es:bx处mov  si,KernelFileName    ; ds:si -> "KERNEL BIN"mov  di,OffsetOfKernelFile  ; es:di -> BaseOfKernelFilecld              ; 置DF为0,字符串操作时,si自增mov   dx,10h         ; 循环控制数,每扇区16个条目,每条目32字节,16*32=512
LABEL_SEARCH_FOR_KERNELBIN:cmp   dx,0jz  LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR ; 未找到则读下一个扇区dec  dx                      mov   cx,11                   ; 循环控制数,比较文件名,长度11
LABEL_CMP_FILENAME:cmp  cx,0          jz   LABEL_FILENAME_FOUND  ; 若CX为0,则表示找到,跳转dec  cx        lodsb             ; 将ds:si处内容传送置AL中,si<-si+1 cmp   al,byte [es:di]     ; 将取出的字符与es:di处文件名相较jz  LABEL_GO_ON       ; 相等则跳转到LABEL_GO_ON,比较下一个字符jmp   LABEL_DIFFERENT     ; 不等则跳转到LABEL_DIFFERENT,比较下一个条目
LABEL_GO_ON:inc  di           ; di自增,指向下一个字符jmp   LABEL_CMP_FILENAME   ; 继续比较
LABEL_DIFFERENT:and  di,0FFE0h        ; 0FFE0h=0b1111111111100000 ,将DI低五位清零,每个条目为32字节,使di指向本条目的开头add  di,20h         ; 20h=32,指向下一个条目的开头mov  si,KernelFileName    ; 将si重置为指向KernelFileName的开头jmp   LABEL_SEARCH_FOR_KERNELBIN  ;跳转到LABEL_SEARCH_FOR_KERNELBIN,从下一条目中开始查找LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR: ;查找下一个扇区add  word[wSectorNo],1    ; 将wSectorNo存放值加1,指向下一个扇区jmp  LABEL_SEARCH_IN_ROOT_DIR_BEGIN ;跳转到LABEL_SEARCH_IN_ROOT_DIR_BEGIN,读取下一个扇区并重复以上查找操作LABEL_NO_KERNELBIN:     ; 显示未找到KERNELmov  dh,2call  DispStr   ; 输出字串:NO KERNEL."jmp   $      ; 未找到Kernel.bin,死循环LABEL_FILENAME_FOUND:  ; 找到文件后的操作mov   ax,RootDirSectors ; ax寄存器暂存根目录区大小and  di,0ffe0h     ; di低五位清零,根目录每个条目占32字节,将di ->当前条目的开始,书中写and di,0fff0h,个人感觉有错误   push  eax        ; eax进栈保存mov   eax,[es:di+01ch]  mov   dword[dwKernelSize],eax ; 保存此Kernel.bin文件大小pop   eax               ; 恢复eax为根目录区大小add   di,01ah      ; di-> 此条目对应的开始簇号mov   cx,word [es:di]  ; cx保存起始簇号(扇区)push  cx        ; 进栈保存此Sector在FAT中的序号, 与下文调用读取扇区的“call ReadSector"后的pop ax 相对应add   cx,ax       ; cx <- cx+axadd   cx,DeltaSectorNo  ; cx <- cx+DeltaSectorNo ,cx寄存器中内容为Kernel.bin的起始扇区号,DeltaSectorNo=17 mov   ax,BaseOfKernelFile mov   es,ax       ; es <- BaseOfKernelFile es寄存器中存储Kernel.bin在内存中加载的位置mov   bx,OffsetOfKernelFile  ; bx < - OffsetOfKernelFile bx寄存器中存储Kernel.bin在内存中相对于基址的偏移地址mov   ax,cx       ;   将CX寄存器中的值赋给AX,下面将AX寄存器中指向的扇区加载进内存LABEL_GOON_LOADING_FILE:   push  ax                ; ax进栈保存push  bx        ; bx进栈保存mov  ah,0eh      ; 置ah为0eh,int 10h调用功能为显示字符(光标前移)mov   al,'.'      ; 置输出字符'.'至al中mov   bl,0fh      ; bl置前景色为0fhint   10h        ; 调用10h中断,每读一个扇区就在"Loading "后面打一个点,形成”Loading ...“的效果pop   bx        ; bx出栈。存放内容为Kernel.bin在相对于基址的偏移地址pop   ax        ; ax出栈,存放内容为Kernel.bin的起始扇区号mov   cl,1       ; ReadSector的参数cl置1,表示读取从ax处开始的一个扇区call  ReadSector    ; 调用ReadSector,将Kernel.bin文件加载到内存BaseOfKernelFiel:OffsetOfkernelFile处pop   ax        ; 与上文的push cx相对应call  GetFATEntry    ; 调用GetFATEntry 找到序号为AX的Sector在FAT中的条目cmp   ax,0fffh     jz    LABEL_FILE_LOADED ; 比较 ax与0fffh的值,相等则表示此簇已经是最后一个,Kernel.bin已加载到内存,跳转到LABEL_FILE_LOADEDpush  ax        ; ax进栈保存mov   dx,RootDirSectors ; dx 暂存根目录扇区数add   ax,dx       ; ax+=dx;add   ax,DeltaSectorNo ; 计算 ax簇号对应扇区号add   bx,[BPB_BytsPerSec] ; bx<-bx+[BPB_BytsPerSec],es:bx指向下一段未使用的内存jmp   LABEL_GOON_LOADING_FILE ; 无条件转移至LABEL_GOON_LOADING_FILE,进行读取ax扇区至es:bx处的操作
LABEL_FILE_LOADED:call  KillMotor     ;关闭软驱马达mov   dh,1       ; “Ready."call  DispStr      ; "显示字符串"jmp   $         ; 死循环 

loader.asm 注释相关推荐

  1. 《一个64位操作系统的设计与实现》学习实践3-boot加载loader

    1.boot.asm源码开发,编写一个能加载loader的boot. root@ubuntu:~# vi boot.asm org 0x7c00 BaseOfStack equ 0x7c00BaseO ...

  2. Usb Boot Loader(1)

    此前一直参考<一个操作系统的实现>这本书,遗憾的是书里面是以FAT12文件系统为例讲解的,于是打算用我FAT32格式的U盘实现一个Boot Loader. 这样就造成了一个问题,不能进行单 ...

  3. 自制操作系统Antz day08——实现内核 (中) 扩展内核

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址:https://www.cnblogs. ...

  4. Makefile文件的使用

    先看下面的Makefile代码: # Makefile for boot # Programs, flags, etc. ASM        = nasm ASMFLAGS    = -I incl ...

  5. 【操作系统】Oranges学习笔记(四) 第五章 内核雏形

    文章目录 5.1 在Linux下用汇编写HelloWord 5.2 再进一步,汇编和C同步使用 5.3 ELF(Executable and Linkable Format) 1. ELF Heade ...

  6. 64位操作系统——(二)kernel

    64位操作系统--(二)kernel 作者:王赛宇 参考列表: 主要参考:<一个六十四位操作系统的设计与实现>--田雨 <Using as> --Dean Elsner &am ...

  7. 操作系统开发:编写开机引导

    操作系统是用来管理与协调硬件工作的,开发一款操作系统有利于理解底层的运转逻辑,本篇内容主要用来理解操作系统是如何启动的,又是如何加载磁盘中的内核的,该系列文章参考各类底层书籍,通过自己的理解并加以叙述 ...

  8. Orange‘s’ 一个操作系统的实现

    突然想要随时记录一下实验过程中的各种问题,因此有了此文档: 由于是中途开始的,所以就偷懒直接跳过了vm.ubuntu32位16.04.bochs2.6.8.nasm的安装,下面开始正文内容: 2022 ...

  9. 操作系统开发: 编写开机引导

    操作系统是用来管理与协调硬件工作的,开发一款操作系统有利于理解底层的运转逻辑,本篇内容主要用来理解操作系统是如何启动的,又是如何加载磁盘中的内核的,该系列文章参考各类底层书籍,通过自己的理解并加以叙述 ...

最新文章

  1. Linux安装无法运行install,Linux新手安装Debian-8.2.0可能遇到的问题
  2. 微控制器和微处理器的区别
  3. 计算机通信技术 ppt,江苏大学计算机科学与通信工程学院计算机科学系.ppt
  4. 旧金山漫记(四):夜困火车站
  5. Windows8.1硬盘安装Ubuntu14.04以及卸载Ubuntu14.04参考教程[图]
  6. Android两个注意事项.深入了解Intent和IntentFilter(两)
  7. Elixir Ecto: 范围数据类型
  8. 查看操作系统的UUID
  9. 大学生换学校学计算机,高校换上新课桌,同学表示“世界观被颠覆”,网友:黑科技的诞生...
  10. nrf52832芯片资料_蓝牙大举进军智能楼宇、智慧工业等新兴领域,主流BLE芯片哪家强...
  11. 【django】短信验证码接口设计、互亿无线短信平台、后端逻辑、前端逻辑【16】
  12. 微信小程序图片上传功能(PHP后端)
  13. 阿里云思维导图系列(一)开篇
  14. 新MLC颗粒来了!让SSD写入提升2倍 寿命翻10倍
  15. 算法学习----红黑树
  16. 函数调用之特殊三位数
  17. MATLAB与STK互联10:卫星对象操作(2)—卫星轨道参数设置(方法1,通过轨道生成器设置实现)
  18. 1C.小a与星际探索(C++)
  19. Colab-免费GPU算力
  20. Vue项目开发中优雅的切换服务端ip

热门文章

  1. 【Linux 内核】调度器 ④ ( sched_class 调度类结构体分析 | yield_task 函数 | heck_preempt_curr 函数 | task_struct 函数 )
  2. 【错误记录】IntelliJ IDEA 中 Java 代码中的中文注释报错 ( Menu / File / Settings / Editor / File Encodings 中修改工程编码 )
  3. 【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
  4. 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )
  5. 【C++ 语言】pthread_mutex_t 互斥锁
  6. .Net软件测试化之道 [James D.MCCaffrey]
  7. 《毅力-如何培养自律的习惯》读后感
  8. Wannafly挑战赛3
  9. maven中把依赖的JAR包一起打包(转)
  10. BZOJ-1045 糖果传递 数学+递推