跳至主要內容

ComputerSystems

LincZero大约 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

    image-20211109170840304
    image-20211109170840304
  • 黏贴二进制代码到U盘中

    切换到U盘文件 > 选择开头的第一个16进制 > 点击工具栏上的写入剪切板图标 (Write Clipboard) > 第一扇区部分的内容改变且变为蓝字 (WinHex中蓝字表示还未保存,HxD中红色表示还未保存) > 保存 (可能会提示只有完全版才允许将扇区写入磁盘,指你的WinHex没付费,只是试用版)

  • 重启选择U盘作为启动盘

    成功

    IMG_20211109_190351
    IMG_20211109_190351

注意项:不要破坏MBR分区的MBR结构

即只能编辑前440个字节的内容,后面不能动

会出现两种问题

  • 一是U盘作为启动盘时会出bug
    • 比如汇编程序中输出:0123456789ABCEDabced
    • 而实际中输出的却是012389ABCDEabced (这里_表示显示的是空格,实则是无法显示的乱码)
  • 二是U盘无法正常打开
    • image-20211109174136841
      image-20211109174136841