讨论在纯DOS下的编程技术
北京市 海淀区 双鱼座
发消息 写留言
| 自我介绍 | 1984年大学毕业,1985年底有机会开始接触PC机,1986年开始在PC机上做开发工作,曾接触过MS-DOS、CP/M、UNIX、VMS、LINUX、iRMX等众多的操作系统并在上面从事技术开发,擅长做底层与硬件相关的软件开发,讨厌在windows下进行软件开发,目前主要在DOS和LINUX平台下工作,主要从事软件,在硬件开发上也有一定造诣,亦有在8051系列、6502系列(凌阳)、z80系列下开发软硬件的经历。 |
| 近期心愿 | 大家都快快乐乐地活着 |
| 博客等级 | 加载中... |
| 今日访问 | 加载中... |
| 总访问量 | 加载中... |
| 最后登录 | 加载中... |
· 从汇编调用C程序
2008-7-22 6:36:26 阅读(664) 评论(52)
从一开始我就知道我会很孤独,我知道我写的东西不会有太多的人看,因为我写的这些东西太不入流,不仅生僻,而且有点深奥,对这些选题感兴趣的人少,看的明白的人也不多,即便有几个感兴趣的发现了这个地方,能一篇一篇地看完这些文章并看明白的确不是一件容易的事。
可是,我还是要不断地写下去,其实从一开始,我就没有准备给其它人看,全当是把自己的经验做一个总结,这其中的很多东西,对不需要的人来说一文不值,但对那个别的需要的人来说,他可能已经苦苦找寻了好久,或者为此苦恼了几天,我希望我能给他们带来一个惊喜,让他们忽然觉得,原来世界上还有另一个人曾经琢磨过他所苦恼的事情,仅此而已。
2009-2-3 11:31:35 阅读(510) 评论(6)
2009-9-3 10:53:08 阅读(173) 评论(1)
前一篇文章,我们一起分析了一下DOS的主引导扇区,在网上分析DOS主引导扇区的文章比较多,如果看我写的感觉有困难,到网上随便搜一下,应该一抓一大把。
写人家写过的东西,似乎不是我的风格,我写DOS主引导扇区的分析其实还是为了引出后面的两个主题,一个是GRUB主引导扇区的分析,还有就是主引导扇区的应用。
DOS的主引导程序,实际已经很少有地方用了,因为DOS的分区最大只能有2G,4个分区也只能是8G,大于8G以后的分区,DOS是引导不了的,个中原因,我不说,大家可以想一想。
2009-8-16 22:43:58 阅读(420) 评论(2)
从这篇文章开始,准备用2----3篇的篇幅写一下主引导扇区的分析,先完成DOS下主引导扇区的分析,再分析一下grub下的主引导扇区,同时会简单介绍一下主引导扇区的利用。
一直以来一直想写一篇关于PC机启动过程的文章,就是从机器上电到BIOS读取主引导扇区并把控制权交给主引导扇区中的引导程序开始,但每次想到这个问题,都感到过程比较复杂,一是自己也不能彻彻底底地搞清楚,二是想不出能写出什么新意,所以就一直没有动笔。但是写这篇文章,是不得不涉及到PC机的启动过程了,好在不是这篇文章的重点,而且只需泛泛说说就可以,所以估计不会出什么大问题。
1、PC机的启动过程
2009-3-24 13:10:10 阅读(749) 评论(1)
最近有台湾的网友写EMAIL给我说从汇编语言调用C程序的时候遇到了一些麻烦,我想了一下,确实,可能介绍C程序调用汇编程序的文章相对要多一些,而反过来的情况可能用到的人不多,所以决定以此为题写一个短篇。
首先,如果想从MASM编译的汇编程序调用DJGPP的GCC编译的C程序,这个可能性不大,两个编译出的差异恐怕太大了,本文使用MASM 6.11和TURBO C 3.0作为例子,完成一个从汇编调用C的小范例,这样的调用比较靠谱。
使用过TURBO C的人都知道,TC把编译出来的程序结构分成6种模式:Tiny、Small、Medium、
2009-2-10 11:23:14 阅读(618) 评论(2)
本文主要介绍CPUID指令返回扩展信息的部分
8、EAX=80000001h:最大扩展功能号
mov eax, 80000001h
cpuid
该功能除了能够向(一)中介绍的那样返回CPU支持的最大扩展功能号外,并没有其它作用,EBX、ECX、EDX都不返回有意义的信息。
9、EAX=80000002h:返回CPU支持的扩展功能
mov eax, 80000002h
cpuid
执行CPUID指令后,扩展功能标志在EDX和ECX中返回,EDX中的定义如下:
2009-2-6 23:12:55 阅读(791) 评论(0)
我们接着上篇继续。
6、EAX=2:高速缓存描述符(Cache Descriptor)
mov eax, 2
cpuid
执行完CPUID指令后,高速缓存描述符和TLB(Translation Lookable Buffer)特性将在EAX、EBX、ECX和EDX中返回,每个寄存器中的4个字节分别表示4个描述符,描述符中不同的值表示不同的含义(后面有定义),其中EAX中的最低8位(AL)的值表示要得到完整的高速缓存的信息,需要执行EAX=2的CPUID指令的次数(一般都为1,在我这里的数台机器里,还没有为2的),同时,寄存器的最高位(bit 31)为0,表示该寄存器中的描述符是有效的,下面是描述符值的定义(资料来源与Intel):
Value Cache or TLB Descriptor Description
2009-2-5 14:16:38 阅读(1887) 评论(2)
Intel有一个超过100页的文档,专门介绍cpuid这条指令,可见这条指令涉及内容的丰富。
记得去年的时候,曾经有个“英布之剑”问过我这条指令,当时并没有给出一个满意的回答,现在放假,想起来,把资料整理了一下。很久以前确实用过这条指令,其实指令本身并没有什么难的,关键是看你有没有耐心研读完繁琐的资料,当然还得对CPU有一定的了解,如果“英布之剑”看到这篇文章,而且仍然需要更详细的资料,可以给我一个联系方式,或者相互之间可以交流一下。
cpuid就是一条读取CPU各种信息的一条指令,大概是从80486的某个版本开始就存在了。似乎是
2009-2-3 14:41:10 阅读(293) 评论(3)
近日从以前的书籍里找到了一张以前记录的笔记,发现了一些早已被我淡忘的关于早期CPU的细节,或者永远也用不上了,但还是决定记录下来,或者......
2009-2-1 10:43:29 阅读(511) 评论(5)
在80x86的CPU里,描述符的概念实在是太重要了。
在实模式下,大家都知道物理地址是由段地址和偏移地址两部分组成,其公式如下:
物理地址 = 段地址 × 16 + 偏移地址
或者:物理地址 = 段地址 << 4 + 偏移地址
其结果都是一样的,由于段地址和偏移地址的长度都是16位,所以这种方式能够表达的最大地址为:ffff:ffffH,也就是10ffefH,大致是1088KBytes,有由于8086CPU的地址线只有20位,所以在8086上实际的寻址能力仅为1024KBytes,在80286和80386CPU上,通过A20的使用,可以实际寻址到1088KBytes,这个问题在《关于A20 gate》的文章中有过介绍。