int 20 中断撕下美国技术*由来已久的面纱

int 20 中断撕下美国技术*由来已久的面纱

叙说程序猿眼中的人文世界,分享的主题内容如下:

程序那点事:软件中断指令之int 20 未公开中断

程序猿看世界:未公开中断如同一道隐秘的技术*线

有趣的HOOKs:微软Windows操作系统的发展历史

 

 程序那点事:软件中断指令之int 20未公开中断

软件中断指令是在汇编程序(assembly language)中经常使用的语句,汇编程序可以理解成是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。与JAVA、C等高级语言相比较,汇编语言与机器指令“更亲近”,而不同的机器语言指令集通常是不完全相同的,所以特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。记得我们上学的时候,就会有诸如8086汇编程序、长城0520汇编程序等可以去学习。

在今天的实际应用中,汇编程序通常被应用在底层,硬件操作和高要求的程序优化的场合。虽不如高级程序设计语言简便、直观,但是汇编产生的目标程序占用内存较少、运行效率较高,且能直接引用计算机的各种设备资源。所以汇编程序通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的程序段。

 

int 20 中断撕下美国技术*由来已久的面纱

那软件中断指令是怎么回事呢?应该说中断指令在CPU执行中享有优先执行的“特权”指令。正常情况下CPU本来好好的做自己的事情, 突然来了一个外部命令(就是这个中断指令),这时候CPU这时不管之前在做什么都会自动被暂停下来,然后转去做新的任务(也就是执行中断函数中定义好的任务)。

打个比方,一场足球比赛正在进行中(CPU正常执行原来的程序),突然裁判吹哨判了国安队犯规(来了一个中断指令),罚国安队换人(CPU执行中断指令内容),然后比赛继续进行(CPU继续执行原来程序内容)。

 

int 20 中断撕下美国技术*由来已久的面纱

 

int指令所引起的中断,int的一般用法是int n,这个n就是指中断类型码,通常有256个类型码。具体每个指令的类型具体完成什么功能,大家可以去查书即可。关键的问题是,int 20这个中断指令,往往得到的说明是“INT 20 - 终止程序运行”或者直接告诉我们“INT 20 - 未公开的中断”,似乎这是一个我们不需要了解,也无法了解的中断,我们当然也就在实际编程中不会去使用int 20这个指令了。一切真的如此吗?我的回答是NO! 

 

程序猿看世界:未公开中断如同一道隐秘的技术*线

正如我们前面提到的,所有公开的材料和资料告诉我们的情况是“INT 20 - 未公开的中断”,而我们在实际的编程中,最多也就只能将“INT 20作为“终止程序运行”这一唯一可以使用的功能来用,而事实上,int 20指令可以做的事情远远超越了我们的想象,这泄露天机的原因,还得从1990年后微软Windows操作系统说起。

int 20 中断撕下美国技术*由来已久的面纱

 

背景1:1990年-1994年Windows 3.X操作系统是不支持简体中文的

在1992年4月6日微软公司推出了Windows 3.1版本,当时的版本只是支持英文的版本,还不能够支持中文。“扫雷”游戏不知道还有多少人记得?那时候玩“扫雷”游戏就像现在吃完饭玩“吃鸡”一样的令人愉悦。说起玩游戏,哪一个年轻男孩不曾入迷过,记得当年为了玩“警察抓小偷”,我求系里的机房管理员下班的时候把自己反锁在了机房里,抱着286的PC机(采用INTEL 80286微处理器的PC机),整整打了一宿直到第二天早上老师来上班,那个时候还没有“网吧”也没有互联网,“警察抓小偷”真的好刺激,至今都记忆犹新。

 

int 20 中断撕下美国技术*由来已久的面纱

 

Windows 3.1之后发行的Windows 3.11版本,我有用过,但是估计大多数人都略过去了,之后到1994年才发行了Windows 3.2版本,大家注意一下,Windows 3.2只发行了简体中文版。换句话说,在1990年Windows 3.0革命性出现后,到1994年Windows 3.2出现时其间的近4年的时间内,是没有简体中文版的Windows操作系统可以用的。

 

背景2:90年代初流行的两个C语言集成开发环境IDE是Microsoft Visual C和Borland C

当时这两个C语言的集成开发环境IDE被大家广泛的使用,当然用微软Visual C++的程序猿应该更多一些,而Borland C++的引入也与我转业后的第一个东家太平洋软件技术PTS有关。

由于1994年前大家在用的Windows操作系统无非是3.0/3.1/3.11而已,都是不支持汉字的,回顾历史,就知道汉字能够被计算机处理对于中国的重要性是怎么评价也是不过分的,当年做汉字输入法的那些程序猿前辈们,又有多少独领了风骚。说用过王安民五笔输入法的都是暴露了年龄的,而北京大学的朱守涛先生发明的“智能ABC汉字输入法”这时到了Windows 9X的时代。

 

int 20 中断撕下美国技术*由来已久的面纱

 

 

说重点:不管是微软Visual C++还是Borland C++,你在那个时候的集成开发环境IDE中写程序代码的时,都是不能够输入汉字的!不能够输入汉字的!

 

撕开隐秘面纱的时候到了

当时间来到1994年微软推出令中国程序猿激动人心的简体中文版Windows 3.2 时,程序猿的世界都要炸了!争先恐后,一睹为快地安装Windows 3.2成为了时下必须的时髦。

当时由于工作原因需要左右开弓,同时使用微软Visual C++和Borland C++ IDE开发环境的我,很快被一件事情困扰到了。那就是:当我在Visual C++的IDE输入汉字后发现有问题我按删除键希望删除这个汉字的时候,按一次删除键,记住是只要按一次删除键,整个汉字就没有了(大家都习惯这样子的,因为今天都是这样子的),可是!!!当我在Borland C++的IDE环境中删除一个汉字的时候,我按一次删除键,居然只被删除了半个汉字,剩下的汉字变成了乱码,再按一次删除键,才能够完全的删除整个汉字!!

int 20 中断撕下美国技术*由来已久的面纱

为什么?为什么?为什么?

被好奇心充斥内心的我,决定弄明白为什么Visual C++的IDE比Borland C++的IDE屌这么多。我开始将微软Visual C++的IDE和Borland C++的IDE都进行了反汇编(怎么反汇编,此处省略一万字。。。),采用各种工具开始跟踪分析程序的执行轨迹,当我截取到“按删除键”触发的消息处理部分的时候,一个令人吃惊的语句出现了,int 20中断,一个未公开的中断!而仅仅只是微软的微软Visual C++的IDE中才调用了这个中断,而Borland C++的IDE并没什么特殊的操作,还是正常执行一个删除操作。

在微软Visual C++的IDE中,按删除键触发的这个int 20中断做了什么呢?进一步的跟踪分析的结论是:int 20中断会去系统常驻内存的某个地址,读取256个字节的内容,如果256个字节全部是1,则返回2,如果仅仅是前127位字节是1,后127位字节是0的话,则返回1。这个意味着什么?就是返回2就是告诉程序此时的Windows操作系统是中文版的操作系统,返回1则是说Windows操作系统采用的是英文的版本!

 

int 20 中断撕下美国技术*由来已久的面纱

 

这一切仔细思考就会明白,微软的Visual C++在中文版推出之前就是预留有了不对外公开的int 20中断来判断采用的操作系统是否支持中文,所以虽然Visual C++的版本在Windows 3.2推出之前,但是它借助int 20中断聪明地“知道”未来的事情。可是,Borland 公司由于并不能掌握和了解这个int 20中断,所以当Windows 3.2推出时,之前的Borland C++的版本就完全没有办法去处理删除汉字这么一个简单的问题!

无独有偶,在稍后的1997年,我需要独立完成了Rational 测试产品SQA Suite6.1/6.2汉化的工作,因为SQA是个黑盒测试工具,需要录制和回复操作应用软件的全部过程,因为没有源码的汉化,我同样需要反汇编进去研究修改,再次发现了无数的int 20中断的不同的使用方法,我当时有充足和充分的理由相信,这个对外号称“未公开的中断”,在美国内部的某些核心团体中,是十分公开的,可以彼此交流的,这是一个具有十分强大功能的中断,一个了不起的int 20中断!

 

附带解释一下,Rational 的全线产品在1997年前对中国也是禁运的!

 

有趣的HOOKs:微软Windows操作系统的发展历史

微软Windows操作系统准确得说是个“80后”,它问世于1985年,起初仅仅是Microsoft-DOS操作系统的模拟环境,出生也是“字符型”的,只是Windows较早地明白了,美观的外表才是王道,颜值担当才是竞争力的道理,认为GUI(Graph User Interface)才是竞争的王道,所以1990年5月22日,微软公司荣誉出品了16位的Windows 3.0版本,不仅仅是颜值哦,16位可比8位领先了不少,实力可见一斑。

Windows 3.0的推出应该说开启了微软“视窗”的开挂人生,尤其是在Windows 3.2首次推出简体中文版后,更是锦上添花。不过说句实在话,Windows 的视窗设计与苹果公司之前的麦金塔计算机(香港俗称Mac机)操作系统绝对像孪生兄弟,人家可是在1984年1月发布的MAC电脑中就采用了的。上研究生的时候,也就是1990年的时候,用过Windows 2.0/3.0版本,而在本科的时候用过Mac机,那个时候一点知识产权的概念也没有,看完两个就认定GUI界面就是发展方向嘛。下面就是Mac机。

 

int 20 中断撕下美国技术*由来已久的面纱

 

微软的 Windows在不断升级中越来越知名,也越来越得到广泛的应用。Windows1从架构的16位、32位再到64位,而操作系统版本也从最初的Windows1.0到Window 3.x ,再到现在大家都很熟知的 Windows95、 Windows98、 Windows2000、 Windows XP、 Windows Vista、 Windows7、Windows8、Windows8.1、Windows 10和Windows Server服务器企业级操作系统。

微软中国也承载了我们这代IT人许多的故事,曾经不少的中国HP的老同事去了微软,还有在微软工作过后来与我创业的朋友,也有部队转业去了微软的,至今还在微软的好朋友,TA们曾经在我的世界中都还很重要,留下了太多的记忆。当然,还有几次与微软的合作,发生在中国HP和酷六网工作的时候,尤其是与酷六网合作的事情,虽然最后没有达成,但是我却一直保留着当时写的方案,留作纪念。

 

int 20 中断撕下美国技术*由来已久的面纱

 

公众号文章著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。