博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Write Your Own Operating System Tutorial(中文版)- Lesson 3: NASM
阅读量:2234 次
发布时间:2019-05-09

本文共 1103 字,大约阅读时间需要 3 分钟。

 Lesson 3: NASM

    这节课我们将学着用一个汇编语言编译器来写我们的程序。前几课里我们使用的是DEBUG。把玩过这些之后,你很快就会发现用DEBUG来编写哪怕是一小段指令都是非常痛苦的(改起来更难)。我们需要简单的方法。我们将从使用“Netwide Assembler”(NASM)开始。去它的官方网站http://www.octium.net/nasm/,你能得到一份编译器。
    现在我们将借助这个编译器,来创建和我们在Lesson 2末尾一样的操作系统。下载启动程序h.asm并且仔细看一看。第一条指令应该还算熟悉。这是跳过引导记录数据的指令。在这里,它跳到标号begin处。在跳转指令后面是20字节的数据。这是我用DEBUG从我磁盘上读到的。这些值应该可以用。如果你愿意,你也可以用你磁盘上的数据来替换它们。它们中的大多数可能是一样的。
(注意:在DEBUG中,一个字节以上的数据在显示时是颠倒的。因为在INTEL架构中,低字节存储在低地址,反之亦然。所以字节看上去是倒的。)
标号begin之后的代码和我们在第二课写的差不多,仅仅是在屏幕上打出字母“H”然后进入死循环。在文件的最后,你能够看到我对这段代码长度是否为512字节(一个扇区的大小)进行了检查,之后以“times”开始的那一行开始在代码的末尾添加0,直到文件的最后。这是为了使可执行部分的大小正好为510字节。再之后,是两字节的署名0x55,0xAA。在命令行方式下输入以下命令,编译这个文件。
nasmw h.asm -o h.bin
这将把文件编译为纯二进制文件h.bin。看一下文件的大小。如果你顺利的话,那应该正好是512字节,正好能够放到软盘的引导扇区去。
现在我们要把这个文件复制到软盘上。插入软盘,运行DEBUG,输入一下命令。
debug
-n h.bin
-l 0
这将把我们的文件载入到开始地址为0的内存。如果你想看看文件是不是被顺利的编译和加载,你可以使用dump(d)和unassemble(u)命令。你可以看到我们刚才写的可怜巴巴的几行代码。注意看一下,文件中已经正确的添加了0以用来对齐,直到扇区最后的0x1FE和0x1FF。另外,DEBUG在CX寄存器中记录了一共从文件中读入了多少字节。(你可以用r命令来显示寄存器的内容。)
当软驱中有软盘的时候,用这条命令将文件写入磁盘。
-w 0 0 0 1
用这张盘重启计算机,看看实际动作的程序吧。现在,在源码中试试其他东西。例如,修改一下代码来打印更多的字符。如果你准备好了,我们将进入下一课,在那里,我们将创建一个“Hello, World”操作系统。

转载地址:http://dcibb.baihongyu.com/

你可能感兴趣的文章
【数据结构】队列的基本认识和队列的基本操作
查看>>
【数据结构】循环队列的认识和基本操作
查看>>
【LeetCode】无重复字符的最长子串
查看>>
时间复杂度
查看>>
【C++】动态内存管理 new和delete的理解
查看>>
【Linux】了解根目录下每个文件的作用
查看>>
【Linux】进程的理解(一)
查看>>
【Linux】进程的理解(二)
查看>>
【C语言】深度理解函数的调用(栈帧)
查看>>
【Linux】进程的理解(三)
查看>>
【C++】带头节点的双向线链表的实现
查看>>
【C++】STL -- Vector容器的用法
查看>>
【Linux】Linux中的0644 和 0755的权限
查看>>
【数据结构】有关二叉树的面试题
查看>>
【Linux】内核态和用户态
查看>>
【Linux】HTTP的理解
查看>>
【Linux】HTTPS的理解
查看>>
【操作系统】大小端问题
查看>>
Git上传代码时碰到的问题及解决方法
查看>>
【Linux】vim的简单配置
查看>>