zoukankan      html  css  js  c++  java
  • 操作系统学习笔记 005 引导扇区

    引导扇区

    BIOS运行完后,加载启动盘(BIOS里设置的)的MBR(主引导区)

    512字节,以0xaa55作为结束标志,否则就认为是不可引导的

    这段代码会加载到内存的07c00h位置,然后从这里开始执行

    汇编代码

    boot.asm

         org  07c00h             ; 告诉编译器程序加载到7c00处

         mov  ax, cs

         mov  ds, ax

         mov  es, ax

         call DispStr            ; 调用显示字符串例程

         jmp  $                  ; 无限循环

    DispStr:

         mov  ax, BootMessage

         mov  bp, ax             ; ES:BP = 串地址

         mov  cx, 16             ; CX = 串长度

         mov  ax, 01301h         ; AH = 13,  AL = 01h

         mov  bx, 000ch          ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)

         mov  dl, 0

         int  10h                ; 10h 号中断

         ret

    BootMessage:       db   "Hello, OS world!"

    times    510-($-$$)    db   0    ; 填充剩下的空间,使生成的二进制代码恰好为512字节

    dw   0xaa55                      ; 结束标志

    编译运行

    # nasm boot.asm -o boot.bin

    # bximage                   ;按照提示生成一个1.44M的软盘镜像文件a.img

    # dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

    # dd --help                 ;查看dd命令的帮助

    把fdos-10meg/bochsrc.txt复制过来,删除其中ata的配置,添加:

    floppya: 1_44=a.img, status=inserted

    boot=floppy

    # bochs

    启动的虚拟机屏幕左上角有一个红色的Hello, OS world!

    汇编基础

    MOV指令

    源目标

    通用寄存器

    段寄存器

    控制寄存器

    调试寄存器

    内存

    立即数

    Y

    -

    -

    -

    Y

    通用寄存器

    Y

    Y

    Y

    Y

    Y

    段寄存器

    Y

    -

    -

    -

    Y

    控制寄存器

    Y

    -

    -

    -

    -

    调试寄存器

    Y

    -

    -

    -

    -

    内存

    Y

    Y

    -

    -

    -

    $           所在源代码行的地址

    $$          当前段开始出的地址

    $-$$        当前行所在当前段内的偏移

    call        修改IP或同时修改CS+IP,相当于

    push CS

    push IP

    jmp far/near ptr 标号

    ret         用栈中的数据修改IP,实现近转移,相当于

    pop IP

    retf        用栈中的数据修改CS+IP,实现远转移,相当于

    pop IP

    pop CS

    关于10h号中断,这个帖子写得很好:

    http://blog.csdn.net/hua19880705/article/details/8125706

  • 相关阅读:
    systick运用
    stm32的systick原理与应用
    PID算法知识点博文收藏记录
    关于STM32驱动DS1302实时时钟的一点思考
    什么是同步?什么是互斥?
    C语言小笔记(1)
    typedef 复杂函数指针
    获取窗口句柄
    GetWindowRect和GetClientRect的区别详解
    RepositionBars的用法和参数的意义(引用别人的)
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/4924291.html
Copyright © 2011-2022 走看看