最小操作系统的代码解释
2015-11-08 14:17
253 查看
很多资料上都有最小操作系统代码,即引导机器、显示 hello world 并进入循环等待的代码;本着学习研究交流的精神,下面鄙人再分析解释一遍此段代码;
1 ORG和07C00h
ORG伪指令告诉汇编器: 我的程序将来会被加载到某某地址A;
ORG是Origin的缩写:起始地址,源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。
汇编语言源程序中若没有ORG伪指令,则程序执行时,指令代码被放到自由内存空间的CS:0处;若有ORG伪指令,编译器则把其后的指令代码放到ORG伪指令指定的偏移地址。
FFFF0h与07C00h,这两个都是机器启动后默认访问的内存地址。
bios是用来初始化硬件的最底层的软件(然后才是操作系统),因此计算机启动后必须最先被执行。
CPU只能执行内存中的内容的,而内存中的数据是断电之后内容就会消失。工程师的解决方法是:将存放bios的rom芯片与内存芯片统一编址(不明白的话去看微机原理与接口的书)。这样就可以把存放bios的ROM芯片看作是数据永远不会消失不允许被更改的内存了。
开机启动后默认的CS=FFFFh IP=0000h。这个地址就是bios的地址。这段内存空间很小,不能够容下操作系统等大型程序。
机器启动后自动执行bios使其完成硬件初始化。bios完成硬件初始化的任务后,就要把权力移交给操作系统。
工程师进行了强制性的规定:到内存中的07c00h 处寻找系统的引导程序,即CS=0000h IP=7c00h。也就是说任何系统,他的引导程序都必须安排在07c00h开始的地方,否则就不能被正确的引导。当引导程序完成后我们就进入了Linux Windows等系统了。
(还可以把org 07c00h改为0100h,生成 com文件就能直接在dos下运行。)cx表示的是字符串的个数,10进制的,可以自行修改,boot sector的结束地址也是固定的,为0xAA55。
2 10h中断
10H中断是由BIOS对显示器和屏幕所提供的服务程序。使用int 10h服务程序时,必须先指定ah寄存器为显示服务编号之一,以指定需要调用的功用。
ah=13h, 在Teletype模式下显示字符串。
AH=13H
BH=页码
BL=属性(若AL=00H或 01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL=显示输出方式
0—— 字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
1——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
3 JMP $
$,代表当前地址。
$ 放在 LJMP 之后,它就代表这条指令本身的地址。
JMP $,就是转移到该指令的本身地址。
JMP $,就是原地转移的意思,即 死循环。
一旦有中断发生,就可以去执行中断程序。
4 填充
$-$$可能会经常被用到,它表示本行距离程序开始处的相对距离。
times 510-($-$) db 0 的意思就是将0这个字节重复510-($-$)遍,知道程序有510B为止。这样,加上结束标志0XAA55占用2B,恰好是512B
5 引导扇区
Boot Sector原理如下:当计算机被电源打开时,他先会进行加电自检(POST),然后寻找启动盘,如果选择是从软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现它是以0xAA55结束,则BIOS就会认为他是一个引导扇区。
一旦BIOS发现了引导扇区,就会将这512B的内容装载到内存0000:7c00处;
OK,解释完毕;
阅读完毕请祈祷一下哥长命500岁;
org 07c00h; 告诉编译器程序加载到7c00处 mov ax, cs mov ds, ax call DispStr; 调用显示字符串例程 jmp $; 无限循环 DispStr: mov ax, BootMessage mov bp, ax; ES:BP = 串地址 mov cx, 16; CX = 串长度 mov ax, 01301h; AH = 13, AL = 01h mov bx, 000ch; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮) mov dl, 0 int 10h; 10h 号中断 ret BootMessage:db "Hello, OS world!" times 510-($-$$) db 0; 填充剩下的空间,使生成的二进制代码恰好为512字节 dw 0xaa55; 结束标志
1 ORG和07C00h
ORG伪指令告诉汇编器: 我的程序将来会被加载到某某地址A;
ORG是Origin的缩写:起始地址,源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。
汇编语言源程序中若没有ORG伪指令,则程序执行时,指令代码被放到自由内存空间的CS:0处;若有ORG伪指令,编译器则把其后的指令代码放到ORG伪指令指定的偏移地址。
FFFF0h与07C00h,这两个都是机器启动后默认访问的内存地址。
bios是用来初始化硬件的最底层的软件(然后才是操作系统),因此计算机启动后必须最先被执行。
CPU只能执行内存中的内容的,而内存中的数据是断电之后内容就会消失。工程师的解决方法是:将存放bios的rom芯片与内存芯片统一编址(不明白的话去看微机原理与接口的书)。这样就可以把存放bios的ROM芯片看作是数据永远不会消失不允许被更改的内存了。
开机启动后默认的CS=FFFFh IP=0000h。这个地址就是bios的地址。这段内存空间很小,不能够容下操作系统等大型程序。
机器启动后自动执行bios使其完成硬件初始化。bios完成硬件初始化的任务后,就要把权力移交给操作系统。
工程师进行了强制性的规定:到内存中的07c00h 处寻找系统的引导程序,即CS=0000h IP=7c00h。也就是说任何系统,他的引导程序都必须安排在07c00h开始的地方,否则就不能被正确的引导。当引导程序完成后我们就进入了Linux Windows等系统了。
(还可以把org 07c00h改为0100h,生成 com文件就能直接在dos下运行。)cx表示的是字符串的个数,10进制的,可以自行修改,boot sector的结束地址也是固定的,为0xAA55。
2 10h中断
10H中断是由BIOS对显示器和屏幕所提供的服务程序。使用int 10h服务程序时,必须先指定ah寄存器为显示服务编号之一,以指定需要调用的功用。
ah=13h, 在Teletype模式下显示字符串。
AH=13H
BH=页码
BL=属性(若AL=00H或 01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL=显示输出方式
0—— 字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
1——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
3 JMP $
$,代表当前地址。
$ 放在 LJMP 之后,它就代表这条指令本身的地址。
JMP $,就是转移到该指令的本身地址。
JMP $,就是原地转移的意思,即 死循环。
一旦有中断发生,就可以去执行中断程序。
4 填充
$-$$可能会经常被用到,它表示本行距离程序开始处的相对距离。
times 510-($-$) db 0 的意思就是将0这个字节重复510-($-$)遍,知道程序有510B为止。这样,加上结束标志0XAA55占用2B,恰好是512B
5 引导扇区
Boot Sector原理如下:当计算机被电源打开时,他先会进行加电自检(POST),然后寻找启动盘,如果选择是从软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现它是以0xAA55结束,则BIOS就会认为他是一个引导扇区。
一旦BIOS发现了引导扇区,就会将这512B的内容装载到内存0000:7c00处;
OK,解释完毕;
阅读完毕请祈祷一下哥长命500岁;
相关文章推荐
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- C#实现判断操作系统是否为Win8以上版本
- Linux操作系统添加新硬盘方法
- java如何获取本地操作系统进程列表
- Linux rdesktop操作系统下远程登录Windows XP桌面
- 32位操作系统认出超出4G内存的方法
- Linux rpm tar 操作系统下软件的安装与卸载方法
- JavaScript 获取用户客户端操作系统版本
- jsp 获取客户端的浏览器和操作系统信息
- Windows 操作系统的安全设置
- php判断当前操作系统类型
- PHP获取用户的浏览器与操作系统信息的代码
- Perl操作系统环境变量的脚本代码
- javascript获取本机操作系统类型的方法
- 封装好的js判断操作系统与浏览器代码分享
- javascript实现获取浏览器版本、操作系统类型
- php根据操作系统转换文件名大小写的方法
- JS获得浏览器版本和操作系统版本的例子