ComputerSystems
大约 4 分钟
ComputerSystems
目录
运行起来
准备工作
准备软件 | 作用 | 补充 |
---|---|---|
Windows系统 | 提供x86系统 | 学习暂用,以后可以用其他x86系统或其他指令集 |
VSCode | 仅提供代码高亮 | |
nasm | 将汇编代码翻译成机器代码 | 开源软件,跨平台软件 |
VirtualBox | 虚拟机软件 | |
FixVhdw | 读取、写入裸盘的小工具,硬盘U盘都可以 | 《x86汇编语言,从实模式到保护模式》的作者开发的 |
WinHex | 读写Hex、直接读写磁盘 | 打开速度挺慢的,而且仅限试用45天,可以考虑换HxD软件 |
U盘 | 提供真机测试 |
编译
编译汇编程序 (nasm)
汇编程序编写(第一个x86汇编代码)
mov ax, 0b800h
mov ds, ax
mov byte [0x00],'H'
mov byte [0x02],'e'
mov byte [0x04],'l'
mov byte [0x06],'l'
mov byte [0x08],'o'
mov byte [0x0a],','
mov byte [0x0c],'W'
mov byte [0x0e],'o'
mov byte [0x10],'r'
mov byte [0x12],'l'
mov byte [0x14],'d'
jmp $
times 510-($-$$) db 0
db 0x55,0xaa
汇编程序编译
nasm -f bin start.asm -o start.bin
# 若不加目标则默认生成的文件无.bin后缀
# -f:输入格式
# -o:输出文件名
nasm -f bin start.asm -o start.bin -l start.lst
# 【技巧】
# -l:然后后面再加一个.lst扩展名的文件,可以生成一个包括汇编地址、代码以及机器码的文件。可以方便用来调试
运行起来
虚拟机跑汇编程序
虚拟机环境搭建
这里用VirtualBox,因为上面的FixVhdw
只能些Vhd格式的虚拟磁盘,而VMWare的虚拟磁盘格式选择中没有这个格式
- 官网安装VMWare并打开,点击新建,新建参数如下
- 虚拟电脑名称和系统类型:名称随意,修改位置,类型Other - Dos,默认为Windows
- 内存大小:默认,默认为32MB
- 虚拟硬盘:默认,默认为现在创建
- 虚拟硬盘文件类型:VHD (虚拟硬盘),默认为VDI (VirtualBox 磁盘映像)
- 存储在物理硬盘上:固定大小,默认为动态分配
- 文件位置和大小:大小16MB,默认为500MB
- 点击启动则让你选择启动盘
将程序导入虚拟硬盘(FixVhdw程序)
打开FixVhdw程序,右上角选择虚拟硬盘文件,找到虚拟机创建的vhd文件,提示信息如下
虚拟硬盘: D:\...\Worksapce_VirtualBox\AssemblyTest\AssemblyTest\AssemblyTest.vhd
VHD规范的原始创建者标识: conectix
创建此文件的程序:vbox
创建此文件的程序版本:06.01
该虚拟磁盘创建于 2021-11-08 13:31:44。
481个柱面;4个磁头;每磁道有17个扇区。
总容量为 16 MB(兆字节)。
该磁盘为固定磁盘(容量固定,文件大小不变)。
点击 "数据文件1" 后面的 "选择" 按钮,找到编译好了的bin文件,注意后面的 "起始LBA扇区号" 必须要是0
点击 "写入"
开始执行写入过程,准备打开虚拟磁盘文件……
虚拟磁盘文件打开成功,准备打开数据文件……
准备工作完成,开始写入数据文件 D:\...\Assembly\start.bin……
数据写入完成,本次共操作了1个扇区。
最后重新打开VirtualBox中的系统
真机跑汇编程序
写入程序到硬盘
打开U盘文件
打开WinHex > 菜单 > Tool 工具 > OpenDisk 打开磁盘 > 选择U盘 (注意要选择Physical Storage Drivers物理驱动器,而不要选Logical Volume/Partition逻辑驱动器,区别是看你有几块硬盘还是几个分区)
复制二进制代码
菜单 > File文件 > Open打开 > 打开编译好了的start.bin文件 > 点工具栏上的复制图标 (Copy All) 末尾也是
55AA
黏贴二进制代码到U盘中
切换到U盘文件 > 选择开头的第一个16进制 > 点击工具栏上的写入剪切板图标 (Write Clipboard) > 第一扇区部分的内容改变且变为蓝字 (WinHex中蓝字表示还未保存,HxD中红色表示还未保存) > 保存 (可能会提示只有完全版才允许将扇区写入磁盘,指你的WinHex没付费,只是试用版)
重启选择U盘作为启动盘
成功
注意项:不要破坏MBR分区的MBR结构
即只能编辑前440个字节的内容,后面不能动
会出现两种问题
- 一是U盘作为启动盘时会出bug
- 比如汇编程序中输出:0123456789ABCEDabced
- 而实际中输出的却是012389ABCDEabced (这里_表示显示的是空格,实则是无法显示的乱码)
- 二是U盘无法正常打开