dll文件是什么语言写的程序_学习x86汇编语言4 自己动手写一段程序引导计算机

114e4d35019c76e7454c5927cb90ebaf.png

一、本章准备工具

  • FloppyWriter.exe 软盘绝对扇区读写工具,各大下载网站能下载到
  • nasm :www.nasm.us/pub/nasm/releasebuilds/2.15.04rc5/win64/nasm-2.15.04rc5-win64.zip
  • 一个1.44M的磁盘镜像 从网上下载一个 TINIX.IMG
  • Virtual Box虚拟机
  • DOS Box
  • vscode安装HexDump插件

一、8086的内存分布

8086 地址位长度是20,1M的寻址空间。这1M的空间是按如下进行分配的:

3c04e67f9528301cb4f84af69a986363.png

高于 1M的是高位内存区和扩展内存。80386,80486,奔腾等最高寻址4G空间。

二、8086的启动流程

  1. 计算机上电后,CPU跳到0xFFFF0位置
  2. 跳转F000:E05B运行BIOS
  3. BIOS 运行完,最后一步检查0盘0道1扇区,如果这个扇区最后两字节是0x55,0xaa,bios就把这个扇区的内容加载到0x7c00,使用语句 jmp 0:7c00。
  4. 系统进入 MBR,即运行0x7c00处程序。

下面就写一段程序加载到7c00,让计算机来引导看是否能启动。

三、编译引导程序

org 07c00h ; 告诉编译器程序加载到7c00处mov ax, csmov ds, axmov es, axcall DispStr ; 调用显示字符串例程jmp $ ; 无限循环,$代表当前汇编行的地址DispStr:mov ax, BootMessage    ; 把BootMessage的首地址传给寄存器axmov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串长度mov ax, 01301h ; AH = 13,  AL = 01hmov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)mov dl, 0int 10h ; 10h 号中断retBootMessage: db "Hello, MY OS!" ; 想要开机后在屏幕上显示的字符串times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节 $$表示一个section的开始处汇编后地址dw  0xaa55 ; 结束标志

把代码保存到nasm的目录,编译:

nasm boot.asm -o boot.bin
8ae8d1d82da7410d0eea83e34722e1a1.png

四、制作虚拟软盘

1. 把 TINIX.IMG 也放到nasm目录 ,改名 MYOS.IMG

eb2b833ec691a396368dfa50f8608e2f.png

2. 打开FloppyWrite.exe

选择Write File to Image
提示选择文件先选择Boot.bin,第二次弹窗选择MYOS.IMG

219d9f84ae650511614f6222978813cb.png

五、建立一个虚拟机

1. 随便新建一个虚拟机

2. 添加软盘控制器

e4fe20fa81483ae53cdb57817f0e2e6b.png
ca06f04b7850b430b4faa6f90e5ad589.png
35ae5c497c4eea966bff6eb3d1353244.png


添加后的效果:

ad751f41d7b3bd5d54a99895ab735246.png

3. 启动虚拟机

5d641dde5edae096d06d7eb8c2377d88.png


要退出的话需要强制退出。

3653d4f997882fb84c7a8b3c74f39b58.png

六、调试引导程序的方法

修改上面代码,把org 07c00h改成 org 0100h , 就可以编译成一个.com文件在DosBox下运行。

b8aeab653f393569dc521ffbe65200e0.png


为便于以后的调试,下面使用nasm的预编译宏切换org语句加载的地址:

;%define _BOOT_DEBUG_   ; 做Boot Sector时把这行注释掉; 启用这行就用nasm Boot.asm -o Boot.com生成.com文件用于调试%ifdef _BOOT_DEBUG_   org  0100h%else   org 07c00h%endifmov ax, csmov ds, axmov es, axcall DispStr ; 调用显示字符串例程jmp $ ; 无限循环DispStr:mov ax, BootMessagemov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串长度mov ax, 01301h ; AH = 13,  AL = 01hmov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)mov dl, 0int 10h ; 10h 号中断retBootMessage: db "Hello, MY OS!" ; 想要开机后在屏幕上显示的字符串times  510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw  0xaa55 ; 结束标志

七、使用vscode查看镜像内容

VsCode安装 HexDump插件后,在要查看的文件点击键,选择ShowHexdump就可以来查看磁盘镜像的内容:

51c8e058d1d55edfec811fd369af3912.png


这里可以看到前512字节就是自己写的汇编程序,以55AA结束。

本文学习资源来自《自己动手写操作系统》于渊 电子工业出版社。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值