一个操作系统的实现-1_环境搭建

来源:互联网 发布:两组数据的显著性差异 编辑:程序博客网 时间:2024/05/16 16:20
一:bochs安装  
1.从官网上下载源码(http://sourceforge.net/projects/bochs/files/bochs/)

2. 确保安装编译前的依赖项

sudo apt-get install build-essential(gcc,make基本工具支持,注意bochs是用C++写的,可能需要安装g++-sudo apt-get install g++)

sudo apt-get install libx11-dev,

sudo apt-get install libxrandr-dev,

sudo apt-get install xorg-dev(x window的图形的支持),

sudo apt-get install libgtk2.0-dev

sudo apt-get install vgabios

3. 编译安装

 tar -xvf  bochs-2.6.2.tar.gz

 cd bochs-2.6.2

 ./configure --with-x11 --enable-debugger --enable-disasm

 make

 sudo make install

 make clean(清除编译中产生的文件,例如*.o文件之类的,如果放着不管的话,很占空间)

二:nasm安装

直接安装sasm即可,里面带有nasm汇编器.
http://download.opensuse.org/repositories/home:/Dman95/xUbuntu_16.04/i386/

dpkg -i   sasm_3.9.0_i386.deb

三:源码解释
    org 07c00h                ;告诉编译器程序加载到7c00处
    mov ax,cs        
    mov ds,ax
    mov es,ax
    call DispStr            ;调用显示字符串例程
    jmp $

DispStr:
    mov ax, BootMessage        ;ax存放BootMessage地址,不带[]则传递的是地址,带[]传递的是值
    mov bp,ax                ;ES:BP = 串地址     
    mov cx,16                ;CX = 串长度
    mov ax,01301h            ;AH = 13h,AL = 01h
    mov bx,000ch            ;页号为0(BH=0)黑底红字(BL=0ch,高亮)
    mov dl,0
    int 10h                    ;10h号中断
    ret

BootMessage:        db        "Hello,OS-World!"

;填充剩下空间,使得生成的二进制代码恰好为512字节,510-($-$$)打不出~~~~尴尬

dw        0xaa55                    ;结束标志


org规定程序的起始地址


cs:代码段寄存器,一般用于存放代码;ds:数据段寄存器,一般用于存放数据;es:扩展段寄存器,使用时可以看作ds的扩展寄存器;(ss:栈段寄存器,一般作为栈使用)。段寄存器是为了对内存进行分段管理。

ax:通用寄存器。通用寄存器有AX,BX,CX,DX,BP,SP,SI,DI,均可做普通数据寄存器使用。此外,AX为累加器,CX为计数器,BX,BP为基址寄存器,SI,DI为变址寄存器,BP还可以是基指针,SP为堆栈指针。

2-4行的作用就是令ds和es两个段寄存器指向与cs相同的段,以便在以后进行数据操作的时候能定位到正确位置。


第五行所call的就是显示字符串的代码了,8-15行都是。jmp $ 代表无限循环,其中$代表当前行被汇编之后的地址。

8-9行将BootMessage的首地址赋给bp(前面说过啦 是基址寄存器,还可以是基指针)。BL=0Ch代表黑底红字

下面说一下16-18行。db代表后面的数据以字节存放(dw代表以字存放,dd代表以双字存放)。 db即“分配一片连续的字节单元并初始化”。而times 510-($-$$)代表以0填充剩余空间。这里times可以理解为循环(PS:times、db、dw均属于伪指令——用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行)。而
表示一个节的开始处被汇编后的地址,这里程序只有1个节,所以

实际上表示程序被编译后的开始地址。所以$-$$表示本行距离程序开始处的相对距离。times循环过后程序有510字节,为什么不是512字节呢?因为还要给结束标志0xaa55留两个字节。而dw基本含义与db相同,不同的是dw定义16位数据,高8位数据字节先存入低地址字节中,而低8位数据字节则再存入高地址字节中。




阅读全文
1 0