2011年5月12日

第四章调试问题。用bochs调试boot.asm

摘要: 第四章的调试开始有点困难,没有摸到门道。后来陡然有了感觉,发现bochs用a.img启动时,停在了bios的开始的f000:fff0这个地方,有一句代码:jmp far f000:e05bs 后发现 xor ax,ax| out 0x0d,al 等等都是对硬件操作的代码,其中会把软驱中引导扇区的代码,拷贝到0000:7c00h所以灵感乍现,何不用bochs在0000:7c00h处下个断点看看呢、赶紧下了一个断点:vb 0x0000:0x7c00c过去,发现代码是mov ax,cs 哈哈终于看到boot.asm的代码了,可以用bochs调试boot.asm代码了。好高兴啊。u /100 查看并找 阅读全文

posted @ 2011-05-12 22:17 wanghj_dz 阅读(684) 评论(0) 推荐(1) 编辑

第四章: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 阅读(388) 评论(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 阅读(660) 评论(0) 推荐(0) 编辑

汇编cld ,std语句

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

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

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

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

posted @ 2011-05-12 10:02 wanghj_dz 阅读(2295) 评论(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 阅读(1958) 评论(0) 推荐(0) 编辑

突破512K字节限制

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

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

2011年5月10日

中断门和陷阱门的区别

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

posted @ 2011-05-10 22:14 wanghj_dz 阅读(514) 评论(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 阅读(1017) 评论(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 阅读(1466) 评论(0) 推荐(0) 编辑

导航