我的启动代码与BOCHS

BOCHS模拟器很小巧,是最近喜欢和常用的一个调试软件。
我们谈谈BOCHS的小工具bximage.exe。
这是一个生成BOCHS数据软盘和硬盘的一个应用程序。

用bximage生成软盘镜像文件的全过程。
这里选择的是1.44M软驱,和boot.img镜像名。
然后用winhex这个编辑软件查看内容。

bximage 软件创建的1.44M软盘镜像是全零的数据。
这个说明镜像内容是顺序存放,没有任何特殊的辅助标记的。
我们要编写的引导程序会在开始的512字节。
也就是说,我们完全可以把编译文件当成一个镜像文件使用而不经过转换。
系统从磁盘(光盘,硬盘,软盘)引导的两个重要约定。
传统BIOS第一个约定是:从编移地址0处读入的程序段会在实地址7c00处执行。
传统BIOS第二个约定是:512字节程序的结尾处一定要是55AA两个标识数。

用radasm编辑器和fasm汇编语言编译器。

我们可以编写引导程序。
程序引导代码:

;           .P    rYYrYYYi      eY  YeYYeYeYYY   .. .P.       Pr  .    .ePPPPePePPPPe     rrriYYe       iP       P        P                           ;         eePPePr ..PPiiiPP    rP.  ..PP...rPe   ePePPeePPeePPPPePP    Pi    .P     YP    iiiPr..  .    YP    ..YPi  YYYYePYYYYY  .PPPPYiP    PP      ;         ..YP..    Pr   YP   .P.     PY   Pi        . .  .            PririirPriiiiYP    YrYPeYY  PPPe rP    YePPe. rriirPriirr    rP  iPP  PPP      ;           .P     Pe    PP   Pi Pi   Pi  PP.i     P  eP .PPYYrrYYi    Priii.rPi.iiiYP    .. Pi i    .i rP       P        P         rP  rPrPPPYP      ;        iPePPPPP ir   eeY   PPrPe    P.  i.rPi   .P. eP    . . ...    Pr    .P     YP    ee P  P       rP      .P   eYeePPeYYP.    iP  iP YP iP      ;         i .P     YePPPeY     PP    iPPi   eP     P  YP  rrrrrrYY      rYYYrYPYrYYYi     eP P  P  PPei rP       Pre ie.     PP                       ;         P  Prri PY     PP   YP     Pe PP iP       ..YY .YrirYYi     YYrii.irPrii.irYY   Pe P  P    iY iP    .rPPY.  ePr   PP                        ;        .P  Pir. P.     rP  YPerYi  P.  YPP       PeYrPPYrYPYrYPi    ii..YPYiPiiPPr.ii   PY P  P  .    YP    eYiP      YPYPi                         ;        rP. P    Pe.....PP     ..  YP   ePPY     rP   Pr   P   PP       YPi  P   YPi     P. P. P rPPPPePPer     P      iPPPr                         ;        PYPPP.   .ePPPPPY   Yiiiri Pr ePY  PPi   YP   Pe  iP.  PP    .PPe   .P     PPi  .P  P. P.      rP      YP   rPPe   YPe.                      ;       .e  iYPPPPeYYYYYYer  YYrrrr.e .Y     rY  ePPPPPPPPPPPPPPPPP  .PY     .P      iP  .Y  e  Y       iP    iPP.  YPi       ee                      ;-----------------------------------------------
; 开机测试程序
; 测试时钟中断
; 应用于U盘启动,测试用BOSCH
;                           by Pierre
; 编辑器是RADAsm       字体 FixedSyS 字号 小四
;-----------------------------------------------format binary as 'img'
org 7c00h;我对CMOS时钟数端口的理解
;时钟设置端口在实模式下是端口70/71,72/73
;CMOS的时钟有两种模式DV0=0模式,DV0=1模式
;端口70模式是只读模式,端口71模式是只写模式
;0e-3f 是RAM 50字节用户空间
;40-7f 是RAM 64字节用户空间
;80-ff 是128字节RAM扩展用户空间
;*00-ff 是256字节RAM用户空间*
;DV0=1模式下 50 = +offset 80(DV0=0下的80)
;----------------------------------------------
;DV0=1模式可用地址
;00 秒
;01 秒警
;02 分
;03 分警
;04 时
;05 时警
;06 星期数据
;07 月数据
;08 月
;09 年
;0a 寄存器 A
;0b 寄存器 B
;0c 寄存器 C
;0d 寄存器 D
;32 是辅助国家时区(DV0=0)
;48 是国家时区代码(DV0=1)
;50 是扩展内存端口地址
;53 是护展内存端口数据
;7e 计数复位
;注:秒警,分警,时警相当于闹钟的意思
;---------------------------------------------
;地址00 数值为00-59 当 0b 寄存器 B = 1 时 设置
;地址00 数值自动被硬件更新,软设置停止
;地址01 高位为C(字节[7:6]=11b)使用
;地址01 位设置为1不使用
; 02-03,04-05 性质同上
; 04区别数值为00-23
; 06数值01-07 星期日值为1
; 07数值01-28 软件设置后自动停止
; 08数值01-12 同上
; 09数值00-99 同上
;++++++++++++++++++++++++++++++++++++++++++++
;寄存器 A 字节[3:2:1:0]
;              0 0 0 0   默认最快设置
;              0 0 0 1   256Hz(3.90625微秒)
;              0 0 1 0   128Hz(7.8125
;              0 0 1 1   8.192kHz(122.070毫秒
;              0 1 0 0   4.096kHz(244.141毫秒
;              0 1 0 1   2.048kHz(488.281毫秒
;              0 1 1 0   1.024kHz(976.5625毫秒
;              0 1 1 1   512Hz(1.953125微秒
;              1 0 0 0   256Hz(3.90625微秒
;              1 0 0 1   128Hz(7.8125微秒
;              1 0 1 0   64Hz(15.625微秒
;              1 0 1 1   32Hz(31.25微秒
;              1 1 0 0   16Hz(62.5微秒
;              1 1 0 1   8Hz(125微秒
;              1 1 1 0   4Hz(250微秒
;              1 1 1 1   2Hz(500微秒
;寄存器 A 字节[:4]DV0 = 0 或 1 端口72/73访问256字节RAM内存
;地址7f 字节[:0]为1可以访问RTC内存;读时间
start:
;   mov ax,cs
;   mov ds,ax
;   mov es,ax
;   xor ecx,ecx;    mov al,00
;   out 71,al
;   in al,70
;   mov di,data1
;   stosb
;   mov al,02
;   out 71,al
;   in al,70
;   mov [di+1],almov ah,0mov al,13hint 10hscreen:  mov si,data2mov al,byte [si]    call writejz write_donejmp screen
write_done:xor  ah,ah           ;暂停键功能int   16h             ;BIOS键盘中断       loop write_donewrite:mov    ah,0eh          ;字符终端显示输出功能函数号mov bx,0003h      ;显示属性 (weird...).more:lodsb             ;读到al一个字节or al,aljz .doneint    10h             ;BIOS显示中断jmp    .more           ;重复.more这段代码.done:retndata1 db 0h,0h,0h,0h,0h,0h,0h,0h,0h,0h,0h,0h,0h
data2   db 'Super blue fruit tech',0dh,0ah,0rb 7C00h+512-2-$ ;fill up to the boot record signaturedb 055h,0AAh       ;the signature itself

这是一个简单显示字符“Super blue fruit tech"的引导程序。
开头的

org 7c00h

是必须的因为程序会读入到内存7c00h处。

rb 7C00h+512-2-$    ;fill up to the boot record signature
db 055h,0AAh        ;the signature itself

程序结尾处这两行代码也是必须的。告诉文件是512大小,结尾标识符是55aa。
编译栏是
12,O,FASM,2,12
为什么是12,因为12的文件是iobtst.bin

iobtst.bin可以加上去。
编译生成后,我们来组织bochs启动脚本。当然,文件要在当前目录。
我的bochs在桌面。
bochsrc.bxrc的脚本

megs: 32
romimage: file=C:\Users\Pierre\Desktop\Bochs-2.7/BIOS-bochs-latest
vgaromimage: file=C:\Users\Pierre\Desktop\Bochs-2.7/vgabios-cirrus.bin
vga: extension=vbe, update_freq=15
floppya: 1_44=iobtst.bin, status=inserted
#floppyb: 1_44=b.img, status=inserted
#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path=gnu.img
boot:floppy,disk
#boot:c
log: bochsout.txt
mouse: enabled=0
cpu: ips=15000000


bochs启动界面:

引导程序执行成功。
特别的介绍一下。
在引导程序里,功能模块不能引用外部系统扩展库。
所有的模块得在代码中实现。
引导程序唯一能引用的就是BIOS中的中断服务程序。
这程序引用了BIOS中断程序10,显示模块。和中断程序16键盘中断模块。
只能是BIOS子模块调用。

BOCHS 模拟器和我的启动代码相关推荐

  1. Windows11华为eNSP模拟器 AR1路由器启动代码40 报错解决办法之一

    fafa eNSP的交换机,路由器的启动都要依赖于Virtualbox虚拟环境才行启动运行. 如果你的eNSP,路由器AR1启动报错40代码.去Virtualbox 随便启动一个如下图红框 可以启动就 ...

  2. enspac启动失败代码2_eNSP华为路由交换设备模拟器AR设备启动失败“错误代码40”问题解决方案...

    本文最后更新于2020-5-18,已超过 1 个月没有更新,如果文章内容或图片资源失效,请[留言反馈],我会及时处理,谢谢! eNSP华为路由交换设备模拟器AR设备启动失败"错误代码40&q ...

  3. 基于Ubuntu+Bochs模拟器实现的操作系统图形化的小游戏(2048、flappybird、)

    目录 操作系统课程设计文档 1 项目设计与功能说明文档 1 一. 项目描述 2 项目目的 2 开发环境 2 项目完成指标 3 一. 功能说明 3 图形化界面 3 开机动画 4 图片显示 4 进程管理 ...

  4. TQQ2440第一节:启动代码

    由于网上和我自己用的开发板有气度代码,所以我打算先把ARM9的外围熟悉了在回来看看启动代码,我也大约的看了一下和ARM7的差不多.只是从NANDFLASH启动多了拷贝代码,和MMU初始化的代码,在这里 ...

  5. ARM裸机篇---启动代码分析

    ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...

  6. ARM启动代码中_main 与用户主程序main()的区别

    STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数. 跳转具体到代码段部分如下: Reset_Handler PROC EXPORT Reset_Handler [WEAK] I ...

  7. 嵌入式ARM启动代码的工作

    嵌入式ARM启动代码的工作 (1)定义代码的初始入口点:初始入口点是指代码运行时的起始点,它在每个映像文件中是唯一的,也是每个可执行的映像文件             所必须含有的,而且必须位于映像文 ...

  8. 嵌入式系统启动流程和启动代码的作用 !

    嵌入式系统启动流程启动代码的作用 一般嵌入式开发流程就是先建立一个工程,再编写源文件,然后进行编译,把所有的*.s 文件和*.c 文件编译成一个*.o 文件,再对目标文件进行链接和定位,编译成功后会生 ...

  9. 简单的启动代码 IMPORT |Image$$RO$$Limit|

    简单的启动代码 IMPORT |Image$$RO$$Limit|  IMPORT |Image$$RW$$Base|  IMPORT |Image$$ZI$$Base|  IMPORT |Image ...

  10. Pixhawk代码分析-启动代码及入口函数

    启动代码及入口函数 基础知识 关于坐标系 1)GeographicCoordinate System Represents position on earth with alongitude and ...

最新文章

  1. 微软虚拟学院开学了!
  2. 【移动端最强架构】LCNet吊打现有主流轻量型网络(附代码实现)
  3. Elasticsearch入门和基本使用
  4. CTFshow 命令执行 web41
  5. spring mvc中两种异常的处理手法
  6. DIOCP 运作核心探密
  7. android搜索框功能实现_Android实现滑动解锁功能
  8. H.264算法的优化策略
  9. 【C语言】排序(算法基础)
  10. 常用排序算法的Java实现 - 1
  11. c语言2级考试题下载,C语言二级考试题库
  12. LabVIEW以编程方式启用IEPE激励
  13. 京东营销案例与运营直播手册(共47份)
  14. 我一个高考英语94的渣渣是怎么通过四六级的(学习方法技巧)
  15. 安卓应用市场广告(CPD),aso cpd
  16. 用 JS 原生方法实现 jQuery 的 append, prepend, before, after
  17. 电脑如何剪辑视频?自学视频剪辑的朋友看过来
  18. 【行业标准】YBT091-2019-锻轧钢球
  19. Vue 2 即将成为过去
  20. PTA---C++实现,计算正方体、圆柱体的表面积、体积

热门文章

  1. 努比亚 Z17 mini s (Nubia NX589J) 解锁BootLoader 并刷入recovery ROOT
  2. Spring Cloud之路---1.注册中心eureka与服务提供者
  3. Docker安装aria2+ariang
  4. Python根据内部文件名批量更改文件夹名称
  5. nssa和stub_实验4 OSPF的特殊区域STUB和NSSA
  6. 图片复印如何去除黑底_如何去除扫描件的底色? 扫描的图片去除背面的阴影的方法...
  7. 从表象到本质,包你一文看懂NFT
  8. cad插入块_怎么才能将两张CAD图纸合并为一张?
  9. java经典算法(四)---zws
  10. C# EF The instance of entity type ‘EqInfo‘ cannot be tracked because another instance with the