[第2天] 寄存器和nasm进阶

      终于到了第二天。今天作者把程序部分也分解了,使用汇编代码把系统的运行过程展示出来。还借机介绍了寄存器, BIOS中断等。期间遇到的问题是资料太难找,我一般要有两份资料才能让我信服。。

寄存器:

      我也先说一下寄存器。作者只介绍了8,16,32位寄存器,实际上还有64位寄存器。寄存器在汇编中几乎每行一个。wikipedia以前好像有一张图,现在不见了。还好我保存了。但是可以看到x86的。各个寄存器的用处,可以粗略的看一下Wikipedia,但是要详细的话还得看针对处理器的文档,比如abi官方文档

register

Memory Map:

        知道一点寄存器的知识后,作者又引入了内存映射。就是说memory map。我找了很对地方也没有详细介绍内存映射的。总的来说就是0x00000000-0x00007BFF是bios用的,可以先不管。0x00007C00-0x00007DFF一共512bytes,是本次实验的重点。这是通常所说的boot sector(找不到更好的参考)中的数据载入的。其实这512bytes 也不能全是程序,大体结构如下所示。所以目前为止,写得都是bootloader,不是操作系统。。这些数据在磁盘上时是0-512bytes,为什么载入到内存就变成了0x00007C00-0x00007DFF,这就是ORG(origin)的作用。(The function of the ORG directive is to specify the origin address which NASM will assume the program begins at when it is loaded into memory。)

bootsector

BIOS中断:

       作者还介绍如何使用BIOS中断来显示字符。用的是0x10,第16号中断向量。关于BIOS中断的就比较多。还有说能改变字符颜色。我试了一下,不行。查了查说只有16位显示模式才行,我们的是256位显示模式。先不管。

程序主体:

      下面是程序的主体部分,我使用nasm,所以有点不兼容,下面已经标出。我也趁机搞清楚了$和$$的区别。在nasm里,$代表这一行的(汇编之后)的位置,$$代表这个section的起点位置,如果只有.text那么$$=0。下面的程序只有.text,所以要确认的话可以加一个.data来测试一下($-$$)的值。总体程序见github。为什么这么写,可以见链接中的nasm参考。

运行结果与上次一样就不截图了。

链接:

  1.  GNU Memory map, BIOS Data Area, Memory Map
  2.  Boot loader,  Write Boot Sector Code,  Grub
  3.  StackOverflow fififorum pcasmThe Art Of Assembly Language

[第1天] 二进制代码和nasm

       终于有时间来做第一天的事了。第一天作者别出心裁,使用普通的二进制编辑器直接编写代码。作者目的是制作在FAT12格式的上运行的操作系统。编译出来后是一个Raw Disk Image,当然也可以直接在虚拟机上跑。

       二话不说,看代码。我比较懒惰,直接使用xxd输出作者原有系统的代码。然后稍微修改点字符,就当完成了。然后再xxd -r就行了。

       这里其实是手动写了个FAT12的磁盘文件系统。详细的FAT12见链接

       二进制编辑实在蛋疼,还要查ascii码表。所以作者马上升级,让我们使用nasm汇编。汇编比二进制不知道高到哪去了。下面是整个汇编程序。因为作者建议使用他的nask,然后可能与nasm不兼容,比如RESB中0x1fe-($-$$)要这么写。。编译一发,就能得到bootable的磁盘。在这里我就改了比较多的字符。详细代码见github

      有兴趣的可以仔细研究一下上面的代码代表的意思。不难,根据详细的FAT12,就能知道其中的含义。其中前3个bytes中的第2个貌似只有jump到空的区域就没有问题,这里3e~4e都行。

firstday

链接:

1. fat