2011年5月12日

第四章:LABEL_FILENAME_FOUND,LABEL_GOON_LOADING_FILE,GetFATEntry ,ReadSector四段代码一起详细解释

摘要: LABEL_FILENAME_FOUND:; 找到 LOADER.BIN 后便来到这里继续movax, RootDirSectors ;mov ax,14anddi, 0FFE0h; di -> 当前条目的开始adddi, 01Ah; di -> 首 Sectormovcx, word [es:di] ;mov cx,3 通过bochs调试本例中是3pushcx; 保存此 Sector 在 FAT 中的序号addcx, ax ; 3+14addcx, DeltaSectorNo; cx <- LOADER.BIN的起始扇区号3+14+17=34,34是loader.bin的起 阅读全文

posted @ 2011-05-12 21:51 wanghj_dz 阅读(404) 评论(0) 推荐(0)

详细注释GetFATEntry(转载)

摘要: 转载与http://daikof622.wordpress.com/2009/12/18/%E6%B3%A8%E9%87%8Agetfatentry/花了将近两天的时间,反复比对书上的概念和网上前辈们的总结,总算把这段代码给搞清楚了。(这里使用的是FAT12软盘结构)函数GetFATEntry。参数存放在ax寄存器中,表示一个簇号。输出结果是该簇号在FAT表中的FATENTRY,它的内容仍然是一个簇号,表示文件下一部分所在簇的簇号。这里要仔细地体会“簇号”和“簇”之间的差别,否则在看代码的时候,很容易就会迷失。“簇”表示一个或多个扇区的集合。FAT12中,一个簇就是一个扇区,512字节。簇号, 阅读全文

posted @ 2011-05-12 14:55 wanghj_dz 阅读(675) 评论(0) 推荐(0)

汇编cld ,std语句

摘要: 清除方向标志,在字符串的比较,赋值,读取等一系列和rep连用的操作中,di或si是可以自动增减的而不需要人来加减它的值cld即告诉程序si,di向前移动std指令为设置方向,告诉程序si,di向后移动 阅读全文

posted @ 2011-05-12 13:18 wanghj_dz 阅读(2731) 评论(0) 推荐(0)

为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢

摘要: 这是因为.com 载入内存后的起始偏址就是100h. 前面的100h字节是该程序的PSP 部分. 所以,为了程序中对地址引用的正确, 必需加上org 100h语句。-------------------------------------------------------------------------------------------------------------------------------------------------FFFF0h与07C00h,这两个都是机器启动后默认访问的内存地址。曾经让我一度很晕,搞不清他们之间的关系。现在终于搞明白了,写到博客司上与大家分 阅读全文

posted @ 2011-05-12 10:02 wanghj_dz 阅读(2394) 评论(1) 推荐(0)

2011年5月11日

第四章 boot.asm代码详解

摘要: 第四章 boot.asm 代码详解;%define _BOOT_DEBUG %ifdef _BOOT_DEBUG org 0100h %else org 07c00h %endif这段代码的意思是,如果定义了_BOOT_DEBUG 则 org 0100h,如果没有定义则 org 07c00h如果把;%define _BOOT_DEBUG前面的;去掉则该语句执行,_BOOT_DEBUG定义了。如果加上;则被注释掉了,_BOOT_DEBUG没有定义。--------------------------------------------------------------------------- 阅读全文

posted @ 2011-05-11 17:04 wanghj_dz 阅读(2062) 评论(0) 推荐(0)

突破512K字节限制

摘要: 512B是软盘第一扇区的大小,称为引导扇区。系统要进入保护模式,512B是不够用的。所以在软盘的其他地方存放一个文件,通过512B的引导扇区,加载到内存,并把控制权交给该它。一个操作系统从开机到开始运行,大致经历“引导---加载内核入内存--跳入保护模式---开始执行内核”这样一个过程。也就是说在内核开始执行之前不但要加载内核,还要准备保护模式等一系列工作,如果全部交给引导扇区来做,512B很可能不够用所以不妨把这个过程交给另外的模块来完成,我们把这个模块叫做Loader。引导扇区负责把Loader加载入内存并且把控制权交给它。其他工作放心地交给Loader来做。整理一下这一章的思路。目的是突 阅读全文

posted @ 2011-05-11 08:41 wanghj_dz 阅读(1093) 评论(0) 推荐(0)

2011年5月10日

中断门和陷阱门的区别

摘要: 对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位不变,即如果IF位原来是1,那么通过陷阱门转移到处理程序之后仍允许INTR中断。因此,中断门最适宜于处理中断,而陷阱门适宜于处理异常。 阅读全文

posted @ 2011-05-10 22:14 wanghj_dz 阅读(530) 评论(0) 推荐(0)

中断与异常 代码 总结

摘要: ICW (Initialization Command Word)初始化命令字。主8259A对应的端口地址是20A和21A从8259A对应的端口地址是A0h和A1h。初始化过程:1、往端口20h(主片)或A0h(从片)写入ICW12、往端口21h(主片)或A1h(从片)写入ICW23、往端口21h(主片)或A1h(从片)写入ICW34、往端口21h(主片)或A1h(从片)写入ICW4这4步的顺序是不能颠倒的。ICW1负责启动8259A和进行初始化工作ICW2中断类型号的设置ICW3主从片初始化设置ICW4方式控制设置Init8259A: mov al,011h out 020h,al ;主82 阅读全文

posted @ 2011-05-10 20:18 wanghj_dz 阅读(1059) 评论(0) 推荐(0)

对8259中断控制器

摘要: 补充知识:对8259中断控制器的说明23. 8259A的编程因为8259A是可编程的中断控制器,所以它的操作是用软件通过命令进行控制的。8259A的编程命令字有两类:一是初始化命令字(ICW),二是操作命令字(OCW)。相应的8259A的控制部分有一些可编程的位,它们分布在7个8位寄存器中。这些寄存器分成两组,一组用作存ICW,另一组存OCW。当计算机刚开机时,用初始化程序设定ICW,即由CPU按次序发送2~4个不同格式的ICW,用来建立起8259A操作的初始状态,此后的整个工作过程中该状态保持不变。相反操作命令字(OCW)用于动态控制中断处理,是在需要改变或控制8259A操作时发送的。注意: 阅读全文

posted @ 2011-05-10 13:42 wanghj_dz 阅读(1758) 评论(0) 推荐(0)

中断与异常机制

摘要: 我们在说到中断通常将它与异常相提并论,实际上它们都是程序执行过程中强制性转移,转移到相应的处理程序。中断通常在程序执行时因为硬件而随机产生,他们通常用来处理处理器外部的事件。异常则通常在处理器执行指令过程中检测到错误时发生,比如遇到零除的情况。处理器检测的错误条件有很多,比如保护违例、页错误等。假设处理器可以处理A、B、C三种中断(异常),分别进行a,b,c三种处理,我们得有一种方法把A、B、C与a、b、c对用起来,实际上解决这个问题的方法就是我们前面提到的中断向量。每一种中断和异常都会对应一个中断向量号,而这个向量号通过IDT就与相应的中断处理程序对应起来。Fault,Trap和Abort是 阅读全文

posted @ 2011-05-10 08:57 wanghj_dz 阅读(639) 评论(0) 推荐(0)

导航