操作系统学习常见疑惑问与答[编码实践部分]
—问题1:nasm:org指令深入理解
作者:yxin1322
blog:
http://blog.youkuaiyun.com/yxin1322
转载请注明出处
大三的时候已经学过了《操作系统原理》这门课,虽然学习过程中做过一些实验,但对操作系统的认识仍然停留在理论的层面上,对于如何才能编程实现一个真正的操作系统缺乏可操作的方案,于是有了我现在进行的学习计划。按照计划,近期我读了一些有关操作系统编写的书籍,也参考了网上很多的文章,接触了不少国内这方面的论坛,总算对编写操作系统有了一个大概的认识。在这期间,我曾经被许多小的问题困扰过,并且我认为许多初学操作系统的同学也会跟我一样有相同的困惑,所以我将自己找到的答案和心得以问答的形式记录在此,希望能给后来者提供参考,同时也当作自己的学习备忘。
学习还在继续,问题也在不断增加,所以我会不断丰富问答的内容。其中部分回答摘自网上的文章,我会注明,而大部分回答则是我自己的见解。如果大家读后认为回答有不对或理解偏差的地方,还请留言指正。
需要说明的是我这里讨论的操作系统是指基于IA构架80386以上CPU的操作系统,并不包括其他计算机构架之上的操作系统或嵌入式操作系统。
问:为什么编写NASM语法的系统引导程序,汇编代码的开始总是使用“org 7c00h”?为什么有时候去掉org指令程序也能正常执行?
答:对于这个问题,我首先在《NASM中文手册》中找到了org指令的解释:
NASM汇编编译器为bin文件格式提供了额外的操作符org,它的功能是指定程序被载入内存时的起始地址。根据书中的解释,我们很容易想到,因为引导程序将会被加载到内存0x7c00处,而且引导程序一般都被编译成bin文件格式(bin文件格式没有文件头,它的文件映像与加载到内存运行时的内存映像是一致的),似乎在引导程序中用
org 7c00h是很符合规范的,可仔细一想,似乎又不对,按《NASM中文手册》的说法,使用
org 7c00h将会指定程序加载入内存的起始地址为7c00h,但我们都知道,引导程序加载到内存的7c00h处是一项标准,并不是在编程时决定的,经过试验也验证了我的想法,将org后的数字改成其他值,bois程序一样将它加载到7c00处。那么是不是可以去掉org指令呢,因为程序被加载到哪里并不关它什么事。于是我将org指令去掉,重新编译,写入软盘引导扇区,用它引导系统。出乎预料,程序不能正常运行——没有正常打印出提示信息!到底怎么回事呢?我决定一探究竟。以下是我的引导代码:
boot.asm
1 %include "PrintLib.inc" 2 3 org 07c00h 4 ;org 0100h 5 mov ax,cs 6 mov ds,ax 7 mov es,ax 8 9 mov ah,10h 10 mov al,03h 11 mov bl,01h 12 int 10h 13 14 PrintString BootMessage,LenOfBootMessage,display_mode_2,0h,(ATTR_BLACK<<4)|ATTR_GREEN,0000h 15 16 hlt ;停机 17 18 19 BootMessage: db "Dreamix Starting Please wait..." 20 LenOfBootMessage equ $-BootMessage 21 22 times 510-($-$) db 0 23 dw 0xaa55 |
boot.asm 里引用到了PrintLib.inc文件,PrintLib.inc文件中定义了一个向屏幕输出字符串信息的宏,封装了部分10h BISO子功能,文件内容如下: