现在的位置: 首页 > 综合 > 正文

BOOT.S程序详解

2013年09月05日 ⁄ 综合 ⁄ 共 3340字 ⁄ 字号 评论关闭

先上代码。这段代码在我的BOCHS上跑着没问题。

*************************************************************************************************************************

  1 !
  2 !boot.s -- bootsect.s 的框架程序。用代码0x07替换msag中1字符,然后在屏幕第一行上显示
  3 !
  4
  5 .globl begtext,begdata,begbss,endtext,enddata,endbss     !全局标识符,供ld86链接使用
  6 .text                                                    !正文段
  7 begtext:
  8 .data                                                    !数据段
  9 begdata:
 10 .bss                                                     !未初始化数据段
 11 begbss:
 12 .text                                                    !正文段开始
 13 BOOTSEG = 0x07c0                                         !BIOS加载bootsect代码的原始段地址。这里注意是0x07c0这是段基址寄存器,在转换位物理地址是根据16位段寄存器来                                                              表示20位总线寻址的技术,应该是左移4位,即0x7c00,这就是BIOS加载boot.s到内存的位置
 14
 15
 16 entry start                                              !告知链接程序,程序从strat标号处开始执行
 17
 18 start:
 19         jmpi  go,BOOTSEG                                 !段间跳转。BOOTSEG指出跳转段的地址,标号go是偏移地址 ???????????????
 20 go:     mov   ax,cs                                      !段寄存器cs值-->ax,用于初始化数据段寄存器ds和es,ax是16位通用寄存器,cs段寄存器,经过上一条指令段寄存器的值
                                                              已经从0x0000变为0x07c0。
 21         mov   ds,ax                                      !ds数据段寄存器,
 22         mov   es,ax                                      !es附加段寄存器,
 23         mov   [msg1+17],ah                               !0x07-->替换字符串1个点符号,喇叭会鸣一声??????????????????
 24         mov   cx,#20                                     !共显示20个字符,包括回车换行符,dx可用于通用寄存器,还常用来保存计数值,如在移位指令,循环和串处理指令中                                                               用作隐含的计数器。
 25         mov   dx,#0x1004                                 !字符串显示在屏幕第17行,第5列处
 26         mov   bx,#0x000c                                 !字符显示属性(红色)
 27         mov   bp,#msg1                                   !指向要调用的字符串(中断调用要求)
 28         mov   ax,#0x1301                                 !写字符串并移动光标到串结尾处
 29         int   0x10                                       !BIOS中断调用0x10,功能0x13,子功能01
 30                                                          !Write string (EGA+, meaning PC AT minimum)    AH=13h  AL = Write mode, BH = Page Number, BL = Color, CX =                                                              String length, DH = Row, DL = Column, ES:BP = Offset of string这段是在外国网站找到的资料这样就能解释24-29.。网址http://en.wikipedia.org/wiki/INT_10H
                                                              行赋值的作用
 31 loop0:  jmp   loop0                                      !死循环
 32
 33 msg1:   .ascii "Loading system..."                       !调用BIOS中断显示的信息。共20个ASCII码字符。
 34         .byte  13,10                                     !在ASCII中13表示回车,10表示换行,这里注意回车的作用是使光标移动到行的开始
 35
 36
 37 .org    510                                              !表示以后语句从地址510(0x1FE)开始存放
 38         .word 0xAA55                                     !有效引导扇区标志,供BIOS加载引导扇区使用。
 39
 40 .text
 41 endtext:
 42 .data
 43 enddata:
 44 .bss
 45 endbss:
 *******************************************************************************************************

其间很多疑问已在程序的注释中表明,还有两个问题没有解决,上面注明???。

第一个是你如果把go该变成为制定 的值还是会正确运行,第二个是ah替换字符串最后一个字节就会响声????

 

 

其实这个程序的理解还远不止这么多,我觉得对于初学者最关键的是要搞明白两个值,0x07c0还有 0xAA55

这才是这段程序最神奇的地方。:-)呵呵呵。

关于0x07c0这个值看这篇文章:

http://blog.csdn.net/ccccdddxxx/archive/2011/06/07/6529721.asp

相信看完就理解的差不多啦

关于0xAA55这个值我也不是很清楚;

http://www.linkedin.com/answers/technology/software-development/TCH_SFT/648541-63552830

看完依然不清出。嘿嘿

 

 

 

抱歉!评论已关闭.