一: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位数据字节则再存入高地址字节中。