原来es:bp是串地址啊!
mov是右给左!
org 07c00h ;高速编译器程序加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ;调用显示字符串例程 jmp $ ;无线循环 DispStr: mov ax, BootMessage mov bp, ax mov cx, 16 mov ax, 01301h; ah=13,al = 01h mov bx, 000ch ; 页号为0(bh = 0) 黑底红字 (b1 = 0Ch,高亮) mov dl, 0 int 10h ; 10h号中断 ret BootMessage: db "Hello, OS world!" times 510-($-$$) db 0;填充剩下的空间。使生成的二进制代码恰好为512字节 dw 0xaa55 ;结束标志我估计第一个7c00,第二个是7c02… BootMessage这个标签的地址被赋给了ax寄存器 0是黑底,C是红色,是bl寄存器,8位寄存器哦
用NASM编译下nasm boot.asm -o boot.bin得到一个512B的boot.bin用软盘绝对扇区读写工具将这个文件写到空白软盘的第一个扇区第一个OS已完成这张软盘已是一张引导盘
把它放到你的软驱中重新启动计算机,从软盘引导,你看到了什么?
计算机显示出红色的“ Hello, OS world!”,你的“操作系统”在运行
用Virtual PC(下文有关Virtual PC的详细),应看到图1-1
你已经制作了一个可以引导的软盘了!
计算机电源打开时,它会先加电自检(POST),然后寻找启动盘如果是选择从软盘启动, 计算机就检査软盘的0面0磁道1扇区如果发现它以0xAA55(把此扇区看做字符数组sector,相当于sector[510]=0x55,且 sector[511]=0xAA)结束,则BIOS认为它是一个引导扇区,也就是Boot Sector。 一个正确的Boot Sector除了以OxAA55结束外, 还应包含一段少于512B的执行码
一且BIOS发现了Boot Sector,就会将这512B的内容装载到内存的0000:7c00处,然后跳到0000:7c00处将控制权彻底交给这段引导代码到此计算机不再由BIOS中固有的程序来控制, 而变成由操作系统的一部分来控制
第一行会出现org 07c00这行代码就是告诉编译器,这段程序要被加载到内存偏移地址7c00处
NASM中,不被方括号括起来的标签或变量名都被认为是地址
BootMessage是个标签,
访问标签中的内容必须使用[]
mov ax, Bootmessage
把“ Hello, OS world!”这个字符串的首地址传给ax。
如果有: foo dw 1
mov ax,foo将把foo的地址传给ax,
mov bx,[foo]将把bx的值赋为1
NASM中,变量和标签一样
foo dw 1 ≡ \equiv ≡foo: dw 1foo这个变量和foo这个标签是一回事哈
Offset这个关键字在NASM也不需要 不加方括号时表示的就是Offset这是NASM的一大优点,要地址就不加方括号,也不必额外地用什么 Offset想要访问地址中的内容就必须加方括号
$表示当前行被汇编后的地址。把刚刚生成的二进制代码文件反汇编 打开 disboot.asm发现 00007C09 EBFE jmp short 0x7c09$原来就是0x7c09
$$表示一个(secton)的开始处被汇编后的地址程序只有1个节, 就表示程序被编译后的开始地址,0x7c00
$-$$表示本行距离程序开始处的相对距离times 510-($-$$) db 0 将0这个字节重复遍在剩下的空间中不停地填充0,直到程序有510B
Turbo Debugger是不错的调试工具,“图形化”界面,全屏操作,用起来感觉和一个“严重”精简后的 Windows差不多
NASM给我们提供了预编译宏把原来的“org 07c00h”一行变成许多行
如果想要调试,就让第一行有效,想要做 Boot Sector时,将它注释掉就可
有信心将 BootSector不断扩充, 让它变成一个真正的操作系统的一部分
整个章节结束啦!