之前看了王爽的《汇编语言》,最近正学习《x86汇编语言 从实模式到保护模式》(李忠)。学习了基本的语法和内存寻址、显存读写等知识后,迫不及待地写了一个硬盘主引导扇区程序。写入VirtualBox后截屏如下(花里胡哨警告):
首先跳过数据到start。由于是主引导扇区代码,所以ds为0x7c00(最开始程序被加载到这里,这点很重要!),es为显存段地址(0xb800~0xffff)。bx为数据偏移地址,bp为显存偏移地址。循环读写。硬盘扇区规范,最后两个字节为0x55 0xaa。详见代码:
; exercise.asm
; Coco 07
; 2020.3.4 12:52
jmp start
string db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz','0123456789','+-*/<=>{[()]},.?!#_&|%@',0
start: mov ax,0x7c0
mov ds,ax
mov ax,0xb800
mov es,ax
mov bx,0
mov bp,0
mov dl,0
s: mov byte al,[string+bx]
inc bx
cmp al,0
jne con
mov bx,0
con mov byte [es:bp],al
inc bp
mov byte [es:bp],dl
inc dl
inc bp
jmp s
times 510-($-$$) db 0
dw 0xaa55
这个程序确实太简单了。不过,它既是一小步,更是我的一大步。编写和调试它的过程中,我获得了许多经验。祝自己汇编语言学习顺利!
附:
- 写代码:Visual Studio Code
- 编译:NASM
- 写入VHD:fixvhdw21
- 调试:Bochs-2.1.1
- 运行:Oracle VM VirtualBox
fixvhdwr是《x86汇编语言 从实模式到保护模式》的附书工具,作者今天(2020.3.10)发布了新版本。这个据说是使用Delphi 7.0开发的,比较简陋,但网络上似乎并没有可替代的软件 ↩︎