BOCHS 模拟器和我的启动代码
我的启动代码与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 模拟器和我的启动代码相关推荐
- Windows11华为eNSP模拟器 AR1路由器启动代码40 报错解决办法之一
fafa eNSP的交换机,路由器的启动都要依赖于Virtualbox虚拟环境才行启动运行. 如果你的eNSP,路由器AR1启动报错40代码.去Virtualbox 随便启动一个如下图红框 可以启动就 ...
- enspac启动失败代码2_eNSP华为路由交换设备模拟器AR设备启动失败“错误代码40”问题解决方案...
本文最后更新于2020-5-18,已超过 1 个月没有更新,如果文章内容或图片资源失效,请[留言反馈],我会及时处理,谢谢! eNSP华为路由交换设备模拟器AR设备启动失败"错误代码40&q ...
- 基于Ubuntu+Bochs模拟器实现的操作系统图形化的小游戏(2048、flappybird、)
目录 操作系统课程设计文档 1 项目设计与功能说明文档 1 一. 项目描述 2 项目目的 2 开发环境 2 项目完成指标 3 一. 功能说明 3 图形化界面 3 开机动画 4 图片显示 4 进程管理 ...
- TQQ2440第一节:启动代码
由于网上和我自己用的开发板有气度代码,所以我打算先把ARM9的外围熟悉了在回来看看启动代码,我也大约的看了一下和ARM7的差不多.只是从NANDFLASH启动多了拷贝代码,和MMU初始化的代码,在这里 ...
- ARM裸机篇---启动代码分析
ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...
- ARM启动代码中_main 与用户主程序main()的区别
STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数. 跳转具体到代码段部分如下: Reset_Handler PROC EXPORT Reset_Handler [WEAK] I ...
- 嵌入式ARM启动代码的工作
嵌入式ARM启动代码的工作 (1)定义代码的初始入口点:初始入口点是指代码运行时的起始点,它在每个映像文件中是唯一的,也是每个可执行的映像文件 所必须含有的,而且必须位于映像文 ...
- 嵌入式系统启动流程和启动代码的作用 !
嵌入式系统启动流程启动代码的作用 一般嵌入式开发流程就是先建立一个工程,再编写源文件,然后进行编译,把所有的*.s 文件和*.c 文件编译成一个*.o 文件,再对目标文件进行链接和定位,编译成功后会生 ...
- 简单的启动代码 IMPORT |Image$$RO$$Limit|
简单的启动代码 IMPORT |Image$$RO$$Limit| IMPORT |Image$$RW$$Base| IMPORT |Image$$ZI$$Base| IMPORT |Image ...
- Pixhawk代码分析-启动代码及入口函数
启动代码及入口函数 基础知识 关于坐标系 1)GeographicCoordinate System Represents position on earth with alongitude and ...
最新文章
- 微软虚拟学院开学了!
- 【移动端最强架构】LCNet吊打现有主流轻量型网络(附代码实现)
- Elasticsearch入门和基本使用
- CTFshow 命令执行 web41
- spring mvc中两种异常的处理手法
- DIOCP 运作核心探密
- android搜索框功能实现_Android实现滑动解锁功能
- H.264算法的优化策略
- 【C语言】排序(算法基础)
- 常用排序算法的Java实现 - 1
- c语言2级考试题下载,C语言二级考试题库
- LabVIEW以编程方式启用IEPE激励
- 京东营销案例与运营直播手册(共47份)
- 我一个高考英语94的渣渣是怎么通过四六级的(学习方法技巧)
- 安卓应用市场广告(CPD),aso cpd
- 用 JS 原生方法实现 jQuery 的 append, prepend, before, after
- 电脑如何剪辑视频?自学视频剪辑的朋友看过来
- 【行业标准】YBT091-2019-锻轧钢球
- Vue 2 即将成为过去
- PTA---C++实现,计算正方体、圆柱体的表面积、体积
热门文章
- 努比亚 Z17 mini s (Nubia NX589J) 解锁BootLoader 并刷入recovery ROOT
- Spring Cloud之路---1.注册中心eureka与服务提供者
- Docker安装aria2+ariang
- Python根据内部文件名批量更改文件夹名称
- nssa和stub_实验4 OSPF的特殊区域STUB和NSSA
- 图片复印如何去除黑底_如何去除扫描件的底色? 扫描的图片去除背面的阴影的方法...
- 从表象到本质,包你一文看懂NFT
- cad插入块_怎么才能将两张CAD图纸合并为一张?
- java经典算法(四)---zws
- C# EF The instance of entity type ‘EqInfo‘ cannot be tracked because another instance with the