登录注册
社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
主题 : [ZT]我和电脑亲密接触的心路历程
伍胥之 离线
级别: 军区司令员

显示用户信息 
60楼  发表于: 2015-08-29   
初见中文版HTML类语言 l|JE#  
SuJ aL-;  
oi&VgnS k  
大约在93或94年的时候,四通MS2401已经在打字社用得不多了,学校印刷厂用华光激光照排系统。 HSE!x_$  
bQg:zww  
学校里有一个研究所出一个小杂志,自己有台电脑可以用这个华光/方正的排版系统,我不知道是华光[在山东潍坊]和北大方正是谁山寨谁,不过,反正都是王选他们搞出来的。 Ha0M) 0Anv  

p J! mw\:  
够复杂吧? jjB~G^n  
taHJ ub  
但是它可以排出我们在中文书本上的所有格式,很神奇。直接就是一门语言。 8yR.uMI$/  
n`?aC|P2s  
确实, 人家就叫BD排版语言。我猜是代表北大吧!
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
61楼  发表于: 2015-08-29   
一般的文字还是比较简单的,就是如【HT4K】汉字4号楷体【HT5XBS】汉字5号小标宋  这样的东东。 ?4#Li~q  
F4-$~ v@  
+aCv&sg  
此为小样,可以用任何文字编辑器,然后经过一次扫描,生成一个文件,再经二次扫描生成一个可以由专门显示程序显示的实际格式,此为大样。 ^+>laOzC`8  
D(@S+r_ota  
在没有所见即所得的年代,打字员完全在脑子里想像它最终的格式。结果不理想再回去重新编辑。 hc(#{]].  
-n~1C {<  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
62楼  发表于: 2015-08-29   
我也想玩玩它了。 zOAd~E  
%8B}Cb&2c  
但是,它有一个硬件加密卡,插在电脑里面的ISA总线接口上。 A7Cm5>Y_S  
9IdA%RM~mH  
没有它,扫描1程序就不work. \$~|ZwV{  
Fh&G;aEq  
肿么办呢?里面有啥秘密呢? Fc)@,/R"v  
2G & a{  
一个假期里,人家不上班的时候,我找一个相熟的女打字员偷偷借出来了,她电脑坏了也常找我修修补补。 K^)Eb(4  
}z'8Bu  
^qvZXb  
我家里那时候没有电脑啊! !I{0 _b{  
Zgp4`)}:  
带着它去了门口的LQ公司,自己组装了一台286兼容机。 XB;7!8|  
jE.N ev/  
那个时候我连ISA总线接口规范也不懂,只是知道一点,它里面绝对没有通过DMA总线访问的存贮器。因为电脑开机后,从0-640KB RAM中没有它的地方,而从A000:0 - F000:0FFF的ROM中可以看到除了固有的BIOS外,没有别的。实模式下就这些东东。 !3c \NbU  
w_ "E*9  
先DEBUG找找有没有小虫再说吧! V# }!-Xj  
e9Wa<i 8  
72小时!!!! hE'-is@7  
hlvK5Z   
整 整 3天,我跟踪了它2天半! 店里给我准备了水和方便面,下班就把我关在里面。 &.)^ %Tp\z  
t9GR69v:?  
发现它总是在扫描1时写入1个特定的端口,然后从另一端口读出点东东。 @muRxi  
xC?6v '  
然后,不管三七二十一,把pass1全部反汇编成一个巨大的文本文件,找出了所有IN 和 OUT 指令。这个好办,咱有DOS的FIND命令,那时叫管道或过滤操作。   K-^\" W8  
z>1Pz(   
type  pass1.txt | find "IN 7E" >in.txt     T$)^ gHS  
type  pass1.txt | find "OUT 7F" >out.txt .ljnDL/  
kUL' 1!j7  
再看看它们是不是真的 in 和 out 指令,因为许多字符也会被反汇编成莫名其妙的指令。debug比较笨,不会反汇编伪指令,所以它是不会给我反汇编成类似    db "this is a string other than a series of 8086 instruction$"这样的东东的。 <[a=ceL]|  
8rAg \H3E  
其实,那个年代实际上是有专门的反汇编程序的,能根据内容反汇编出不同的段,类似于: ?8H8O %Z8  
?um;s-x)  
Identfier1 segment 8?B!2  
   msg01 db "this is a data segment", 0dh,0ah z}77Eh<  
ends kf\PioD8  
Hp|kQJ[LE  
但是,俺不是圈内人,不知道有这好东东啊! niMsQ  
m^!Z_]A![  
^  glri$m  
不管如何,我找到了它的读写端口的真实指令和地址。 60^`JVGWH  
Pf")e,u$  
再跟踪它就好办了,直接运行了所有读写 7E和7F端口的地方。看看它到底读出了什么东东。 <6%?OJhp  
Di,^%  
b i',j0B  
XFVE>/H  
59 T 8r  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
63楼  发表于: 2015-08-29   
说白了就很简单了,它和接在LPT:口上的加密狗一样。向特定端口发送一个要读的字节地址,然后从另一端口读出来一个字节。 gMi0FO'  
]\-A;}\e  
发现它只是从加密卡出读出来32个字节而已。 Co9^OF-k  
H5/6TX72N  
而且,每次运行读出来的字符序是完全一致的! OR P\b  
\i>?q   
把加密卡取出来,重新运行。在读端口时停下来,然后跳过去,但是把我记下的字符序列传给DX寄存器。当然把这个序列用完了以后,一个Go指令,它开始给我处理排版文件了,而PASS2 也是同样处理。 Fk&c=V;SU  
|"q5sym8Y_  
{LI=:xJJv  
哈哈哈!这个加密卡被我破解了!!! <)C#_w)-  
*P[ hy  
这三天,太TMD值了!比打任何游戏通关都兴奋,而且特别好玩!
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
64楼  发表于: 2015-08-29   
接下来的就比较简单了。 F> Ah0U0  
[Q~#82hBhY  
把所有的IN DX, 7F指令变成一个 INT 80, 然后在华光的中文系统加载后,自己写一个简单的TSR程序,安装一个INT 80的软中断服务程序,在其中把这32个字节放在服务程序中,再用一个字节做个计数器。 每次有程序调用这个中断时,它返回一个序列中的字节,计数器加1,达到序列末尾时计数器复位。  C#.->\  
do hA0  
完工!
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
65楼  发表于: 2015-08-29   
后来呢?没有什么后来了。 Y sC>i`n9  
/aCc17>2V{  
我把这个盗版的东东,给好几个朋友装上了,其实我也不知道它值多少钱,反正学校门口的打字社我去了不论打字复印人家都不收钱。 8L=HW G!1  
^cC,. Fdw  
u= *FI  
中间出了一个插曲。 c1(R uP:S  
nQZx= JK  
上班以后,我给人家那个研究所的电脑上装上了我的解密版,而把加密卡自己留下来装到我自己的机器上了。不厚道吧? +%z> H"J.  
/s&9SYF  
过了两年,她突然找到我,问我那个卡是不是还用? 我都快忘了这事了,因为那个386SX被我扔到床底下去了,我已经免费换了一套386DX. |w~nVRb  
EmWn%eMN  
而她的电脑也换了,再装上正版的方正不干活了。 '`[&}R  
oi7@s0@  
赶紧从床底下扒拉出来那个破电脑。好在,加密卡还在。 JJ-( Sl  
4d4ZT?V[  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
66楼  发表于: 2015-08-29   
其实,我是做了很多无用功的。 GRIti9GD  
[T4J{y64Y  
因为那个时候,在386平台上已经有比DEBUG好5倍的调试器了。 /|m2WxK)  
>{n,L6_ t  
叫SoftICE, 因为ICE是一块硬件调试板,当然是专业级的。而Soft ICE只是一个软件,但是它利用了386 CPU的调试寄存器,所以有了条件中断。 例如,可以设置一个条件而不必逐条指令跟 踪,符合条件时程序会中断运行,回到SOFTICE控制台。比如当BX寄存器为1000h时则运行中断。 ,$L4dF3  
.^33MWu6  
那可是省事省时多了。 >0y'Rgfe  
kOrZv,qFG[  
S/hQZHZHg,  
不过,这个东东我还没用热乎,它就不能用了。因为有程序自己使用了调试寄存器,所以在监控条件下运行和非监控下运行结果可以完全不同,会把跟踪都引向歧路。 wD}l$ & +  
Vi$~-6n&  
从此,跟踪与反跟踪就变成了道和魔。 i$"F{|Z0  
.bl/*s  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
67楼  发表于: 2015-08-29   
那个时候,自己玩得不亦乐乎,已经开始把它当游戏玩了。 V]6dscQ  
;6 D@A  
我自己写过一个反跟踪的小程序,只有几条指令,做成一个宏,可以插在任意地方。很有效,但也可能很危险。 ea2ayT  
z]y.W`i   
那个年代对指令和数据没有什么严格区分的,只要把DS取成CS一样的值,就可以在运行过程中修改代码。现在,则有人会利用一此漏洞,在数据中插入代码,然后利用这些代码来窃取点什么。 ~8Fk(E_  
@Sn(lnlB  
这个反跟踪程序利用了CPU的指令预取(prefetch)特征,在绝大多数情况下,CPU在运行一条指令时,除非是跳转指令,下面的几条指令已经在CPU中排队了,并不需要从内存中读指令。 |Pax=oJ\M  
%)8}X>xq  
所以,如果正在运行的指令修改了下一条指令,在全速运行且不中断时,这个修改只改变了内存中的东东,而CPU指令流水线中的并不会改变。但是,如它在被跟踪进,这条指令修改后,下一条指令已经被上条修改,所以,运行结果就会完全不同了。 ?#G$=4;i  
uk:(pZ-uJ  
antitrace macro 2DDtu[}  
nsC3  
pusha .k%72ez  
CLI Zd%k*BC  
mov dx, CS i v38p%Zm  
mov DS,DX 2%Ri,4SRb  
nextInst: oG?Xk%7&\  
lea BX, nextinst+8 ;%9|k U  
mov [bx],DX |kg7LP3(8,  
STI Y;M|D'y+  
POPA "Qc7dRmSxm  
#$07:UJ  
endm V#$RR!X'  
Hyl%mJ  
我在8086-80486系统上试过,都没有问题,当然测试次数也没有像那些Benchmark程序那么多,反正只要插入这个宏,在所有有此宏的代码段,程序都不能被跟踪,因为一跟踪,在mov [bx],dx后,后面两条指令就变成随机的了(DX只是当前的DS段值,与程序加载内存位置有关)。所以,它到底可靠性多高,吃不准。不过,这东东一旦出错,后果也是完全不可预料的。 .p3,O6y2(F  
'3tCH)s  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
68楼  发表于: 2015-08-29   
年轻时玩的胆子不小,但是跳槽的勇气却没有。 ;7V%#-  
L|7R9+ZG  
现在老了,就只能YY了。 bl;1i@Z*M  
_4So{~Gf1  
如果当初跨专业读个CS硕士,我现在会做什么呢? b94DJzL1z  
` p-cSxR_  
估计不如现在好玩。 %p=M;  
3z?> j]  
s~g *@K>+  
因为分子生物学注定只能是个full time工作,而CS则是可以当作业余爱好玩的。 n5NsmVW\x  
I;|B.j  
如果我转了CS, 难道能在半夜三更玩分子生物学? sY Qk  
YnAm{YyI  
所以,命中如此吧!人老了就认命了。 j{A y\n(  
杺栫杣杊椌柮栬,䒴蓉艿芖。
ostasia 离线
级别: 排长
显示用户信息 
69楼  发表于: 2015-08-29   
这是伍sir自传吗?那个唯一一次恋爱就修成正果了?
伍胥之 离线
级别: 军区司令员

显示用户信息 
70楼  发表于: 2015-08-30   
引用
引用第69楼ostasia于08-29-2015 21:09发表的  : "_NN3lD)X  
这是伍sir自传吗?那个唯一一次恋爱就修成正果了? C1n> M}b  
qWPkT$ u  
算是吧! 是成了正果,但是20年后又abortion了, 正在考虑: rcG"o\ g@+  
s$ `0yGmQ  
R U sure? [Ignore? Retry? Restart? ]
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
71楼  发表于: 2015-08-30   
10、DOS的Abort,Retry, Fail?错误 %pL''R9VF  
85年以后出生的人可能不知道DOS是什么了,只有那老家伙还知道这是什么。 0znR0%~  
_8UU'1d  
我还记得当时的我对于Abort和Fail这两个选择还是比较清楚的,不过,今天完全忘记了Abort和Fail的差别是什么? z,p~z*4  
0pd'93C  
这个出是DOS下的经常出现,也相当的经典,以至于在Wikepedia上都有专门的业面 Abort, Retry, Fail?。 s-Tv8goNV  
Moza".fiN  
简称为ARF。当然,ARI – Abort, Retry, Ignore?
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
72楼  发表于: 2015-08-30   
这个SideKick是个好东东。 u `6:5k  
!z3jTv  
下面的程序不是我写的。 /7F:T[  
})Vi  
用汇编编写DOS下的内存驻留程序(1) E*K;H8}s  
;dgp+  
0GCEqQy8  
&n:.k}/P  
Aw.qK9I  
hnhd{$2Z  
`1fY)d^ZS  
绪言 >0TxUc_va  
0 /U{p,r6`  
r[iflBP  
0.1 内存驻留与中断 {hrX'2:ClT  
Ai3*QX  
cR<fJ[*  
内存驻留程序英文叫Terminate and Stay Resident Program,缩写为TSR.这些程序加载进内存,执行完后,就驻留在内存里,当满足条件时,调到前台来执行。 B W*rIn<?G  
Lnl=.z`jK  
Iit; F  
内存驻留程序的常用形式有: 7;wd( 8  
{_p_%;  
t-bB>q#3>  
>诸如Borland 的SideKick弹出式实用程序 Lk}J8 V^2  
R-d:j^:f  
+',S]Edx  
>日历系统 +#@I~u _}D  
&d^m 1  
+a{1)nCXe  
>网络服务器 DsCcK3 k  
+VOK%8,p  
SoSb+\* @h  
>通讯程序 'I6i ,+D/q  
>_T-u<E  
/t$d\b17pX  
>本地的DOS扩展(如CCDOS,UCDOS等中文系统都属于这个范畴) >U27];}y  
T+H!_ky`A  
JU&c.p /  
>一些可恶的人利用TSR技术制作很多可恶的病毒程序,几乎所有的病毒程序都是TSR程序. $DaNbLV  
tFOhL9T  
g (CI;f}y  
就象多任务系统调度一个进程有一个调度程序一样,在PC中从前台程序进入到一个TSR,也要有一个调度者,只是PC操作系统的调度不称为调度程序,而只称为触发机制.触发机制调度TSR执行在PC机上党称为激活一个TSR.触发机制主要有以下几种: Txb#C[`  
Z,Dl` w  
^8N}9a  
>硬件中断:党用的是键盘中断INT 9H,时钟中断INT 8H,通讯中断INT 14H,磁盘中断INT 13H等等. sS'm !7*(3  
1^JS Dd  
56kI 5:  
>软件中断:党用的是键盘中断INT 16H,时钟中断INT 1CH,DOS中断INT 21H,等等. !wh8'X*  
#?- wm  
'e'cb>GnA  
>以上各种的结合. ?J~_R1Z  
4O!ikmY:t  
ar+9\  
从以上的触发机制可以看出,TSR和PC机的中断系统有着密切的关系.每种激活方式实际上都是与中断有关的.常用特殊的击键序列的识别码是通过截获INT 9H和INT 16H来实现.实际上不管TSR程序的哪一个环节,都与中断有着密切的关系.因此在具体进行TSR和程序设计之前,先介绍PC中断系统.在此只作简单说明. x7<K<k;s  
v;D~P a  
K`fuf=  
在PC机内存的最低端(0000H开始)的1K字节中,存放着256个指针即常说的中为向量或中断矢量(Interrupt vertor),每个中断向量都指向一个子程序,该程序称为中断处理程序(Interrup handler).一个中断向量由四个字节组成,有一个字是中断处理程序的偏移量值,后一个字是中断处理程序的段值.256中断向量一起称为中断向量表. ?J >  
7?w*]  
$}<e|3_  
手式计算中断向量的首址,可通过以下的公式来求得: N2< !}Eyu  
{q^[a-h>  
q(W3i^778  
X号中断向量的首址=0000H:X*4 FP4P|kl/9'  
*#+An<iT ;  
n<R?ffy  
当产生一个中断时,处理器都按顺序执行以下步骤: Ry6@VQ"NLb  
R`E~ZWC4V  
$suzW;{#  
>在堆栈上压入处理器的标志(相当于指令PUSHF). U0P~  
V/9!K%y  
Y\g3h M  
>在堆栈上压入当前CS和IP值(相当于指令PUSH CS和PUSH IP). pG;U2wE  
vy :Z/1q  
0[W:d=C`a  
>关闭中断(CLI) 8P&:_T!  
t!7-DF|N  
Fd9 [pU  
>从中断向量加载的CS和IP,执行中断处理程序. 0*{%=M  
N6i Q8P -  
A;?|& `f  
当执行完中断处理程序后,一般用IRET返回,它的作用是: &`2)V;t  
D_zZXbNc  
suDQ~\ n  
>从堆栈上取出保存的IP和CS(相当于指令POP CS和PUSH CS). bq0zxg%  
)irEM  
ml }{|Yz  
>同时恢复中断前的处理器标志(相当于指令POPF). -r]W  
~q25Yx9W@  
J)p l|I  
中断有多种分类,由触发的原因和实现的性质来分,可分为硬件中断和软件中断,从操作系统分层实现来说,可以分成BIOS中断,BOS中断和用户中断. @_}P-h  
oj+hQ+>  
0{-q#/  
一方面,BIOS和DOS通过中断系统向用户提供一个操作系统功能界面.也就是说用户(一般来说是前台程序)的功能主要是通过调用DOS和BIOS的中断服务来实现的,具体来说就是通过INT指令来实现的.另一方面,BIOS和DOS由中断系统所构成,BIOS对硬件成为高层的功能,并通过中断的形式向用户提供. NyNXP_8  
_u QOHwn  
8&b,qQ~  
如果在当前程序执行的同时,能将一块代码放在内存,把中断向量指向代码中的子程序,那么在当前程序执行中产生中断时,就有可能执行不属于当前程序和操作系统的代码,产生的中断可能是当前程序产生的软件中断,也可能是由硬件产生的硬件中断.这就是单任务的PC操作系统可能执行多于一个进程的简单说明. <x>M o   
&\*(Q*2N  
qF;|bF  
在PC中断系统中有几个中断具有周期性,即INT 8H,INT 1CH和INT 28H.它们或者周期性被执行用于时间计时,或者周期性产生用于等待.它们是在实现TSR时进行轮询触发的基础.键盘中断(INT 9H和INT 16H)当用户击键时发生,利用它们是进行热键处理的基础.串行口通讯也是触发的一个重要机制.此外众多的软件中断也是触发的媒介. 9V*qQS5<p  
Se =`N  
> /caXvS  
"oO%`:pb  
0.2 DOS的可重入性分析 }b.%Im<3R  
J<jy2@"tXo  
WCixKYq  
一个多任务操作系统之所以能使多个进行并存,是因为操作系统的大部分代码是可以了重的,对于临界资源有相应的PV操作,使得当调度一个新的进程时,能完整地保存前一个里程的现场,当再一次调度被挂起的进程时能象没有被中断一样继续执行. X$W~mQma6  
B \2 SH%\  
PALc;"]O  
对于PC机来说,代码的重入性比较弱,对临界资源没有PC操作.当我们用中断程序启动用户的TSR时,如果只保存标志和寄存器,以及当前进程一些信息,那么只保存了当前程序的一部分现场,DOS的临界资源不会自动保存.在进行TSR设计时,一定要了解PC操作系统的重入性和临界资源. :,6\"y-  
>}6%#CAf  
3L}A3de'  
重入性总是体现在代码上,所谓可重入代码的指这样的代码,即该代码被执行时还没有从中退出,由于某种原因又一次或者多次进入相同的代码,该代码每次的执行结果都是正确的,就说该代码是可重入的.相反,如果结果不正确,那么就就该代码是不可重入的.下面是一个可重入的子程序的例子: {&1/ V  
f9{Rb/l!BQ  
T1=fNF  
Add proc near d>qY{Fdz  
q^<?]8  
sD#.Oq4&]y  
cmp DS:word ptr [si],0 ,r\o}E2  
p H2Sbs:Tk  
]Er$*7f  
je DonotAddTheValue dDLeSz$b  
Y`a3t O=Pd  
C1 *v,i  
add ax,DS:word ptr [si] r3UUlR/Do  
E+;7>ja  
TAW/zpps$  
DonotAddTheValue: t;\Y{`  
I9ep`X6Y  
< h *4Q  
ret &0JI!bR(  
A^<jy=F&  
O3kA;[f;  
Add endp k~w*W X'  
2g! +<YZ~  
BLD gt~h#  
上面的例子不管在其中任何一处再一次执行该子程序,执行结果不变.为了说明,只举多种可能性中的一种. V1M.JU  
=Jb>x#Y  
., 6-u  
mov ds,0100h ;ds=0100h -e:`|(Mo  
c9h6C  
XlR@pr6tw  
mov si,0010h ;si=0010h tK\~A,=  
l2Rb\4  
cSV aI  
mov ax,0001h ;ax,=0001h $*fMR,~t&  
SO0PF|{\r  
[`7ThHX  
call Add wz%Nb Ly-  
o&$A]ph8X  
^k9I(f^c-_  
cmp 0100h:word ptr [0010h],0 ;Call Add subroutine wI/iuc  
xU`p|(SS-  
eehb1L2(b  
push ds ;Interrupted v y I!]p  
)\$|X}uny&  
9'bwWBf7  
push si R8'RA%O9J  
8bld3p"^  
0n{=%Q  
push ax I b5rqU\  
* 0=j?~&  
 *J`O"a  
mov ds,0200h ;ds=0200h brUF6rQ  
gRcQt:  
(SAs-  
mov si,0200h ;si=0020h {bY%# m  
h@ry y\9  
<wD-qTW  
mov ax,0003h ;ax=0003h [/8%3  
f ) L  
f4|rVP|x  
call Add b d!Y\OD  
t*w/{|yO  
`<d }V2rdz  
cmp 0200h:word ptr [0020h],0 ;0200:0020h=0004h _X x/(.O  
z~s PXGb  
13x p_j  
jne 5:_}zu|!u  
/cP"h!P}~~  
h <<v^+m  
add ax,0200h:word ptr [0020h] ;ax=0007h `e}B2;$A3  
X!EP$!  
' S/gmn  
ret ;Return $ $mV d+  
5`p.#  
\qJXF|z<K  
pop ax ;ax=0001h x7 ,5  
o?Oc7 $+u  
"f OV^B  
pop si ;si=0010h nAlQ7 '  
`'7R,  
YPI-<vM~  
pop ds ;ds=0100h -aCKRN85  
S3Jo>jXS "  
{E|$8)58i  
iret ;Return to Add subroutine (TT} 6j  
SXP]%{@ R/  
f]sr RYSR  
jne c@L< Z`u  
X 0+vXz{~g  
 a0)QH  
add ax,0100h:word ptr [0100h] ;ax= 0001h l+0oS'`V*L  
BnF^u5kv%  
5]:U9ts#  
;0100h:0010h= 0002h }i&/ G +_  
FGBbO\< /  
X|]A T9W  
;---------------------------------------- >Cq<@$I2EB  
~})e ?q;b  
_7_Y={4=`  
;ax = 0003h 19%i mf  
@-`*m+$U6  
5wU]!bxr  
ret gL /9/b4  
`C'H.g\>2Q  
Z6MO^_m2  
mov bx,ax O+x!Bg7   
F#5~M<`.o  
'i|YlMFIg  
而下面的子程序是不可重入的: <t!W5q  
S)"Jf?  
b^vQpiz  
Add proc near ) Hr`M B  
g2Z`zQA7  
mgU<htMr1  
mov Temp,ax Q\sK"~@3  
5~DJWi,  
Xne1gms  
mov ax,DS:word ptr [si] b4Ekqas  
s_p!43\J  
+k R4E23:  
cmp ax,0 ":N9(}9  
t\O16O7S  
>9Vn.S  
je DonotTheValue n|yO9:Uw<  
<<O$ G7c  
,64 -1!  
add ax,Temp aw&,S"A@  
AbW6x  
<b*DQ:N  
DonotTheValue: A?OQE9'  
!C.4<?*|  
B&"Q\'c  
ret {R{=+2K!|k  
EU Fa5C:  
6j|{`Zd)G  
Temp: |CbikE}kL  
@oGcuE  
+:/%3}`  
dw 0 ?:eV%`7  
#fM`}Ij.A  
"_?nN" A7  
Add endp {?7Uj  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
73楼  发表于: 2015-08-30   
$<[79al#  
可以利用检查可重入子程序的方法检查这个子程序的不可重入性,尝试一下在" mov ax,DS:word ptr [si]"指令后再次执行该子程序,那么就会出第一次调用返回的结果不对. 4s oJ.j8  
<IW$m!{VG  
WUTowr  
mov ds,0100h ;ds=0100h z`b,h\  
5 SQ 8}Or3  
3=V &K-  
mov si,0010h ;si=0010h &5!8F(7  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
74楼  发表于: 2015-09-05   
转战VB 6.0 _,*r_D61S  
KqP#6^ _  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
75楼  发表于: 2015-09-05   
等我用熟了Turbo C后,TC已经又面临淘汰了。 IdN41  
U #0Cx-E  
因为早已进入视窗时代了。 Windows 2.0被译为视窗,我觉得还是很贴切的。 EKN~H$.  
HjwE+:w  
可是, Borland C++ for Windows 和 Visual C++ 的程度我都看不懂。 b7ZSPXV  
=-Ck4e *T  
因为我错过了Windows编程,只对X86的实模式非常熟悉,对保护模式一窍不通。 'Z]w^<  
1{.9uw"2S  
所以,也没有学过事件、消息啥的,因为全系最好的电脑是联想的80286,386以上的机器我只能去家对门的电脑公司。那里从来不缺各种兼容机,但是都是新机器,没有一台相对固定的有全套开发系统的电脑,因为装出来都是卖的,要么是别人送修的。 X5w$4Kj&4l  
/g.U&oI]D  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
76楼  发表于: 2015-09-05   
公司一个长期固定客户是济钢采购部的,常常没事过来聊天,到点一起吃饭,当然是公司请客,我作陪。 W} ofAkF  
-tU'yKhn  
而我这个时候帮公司干了一个活,用Visual FoxPro帮他们写一个程序,是给济南电视台广告部的广告管理系统。 ?&uu[y  
Rk8P ax/JK  
其实比较简单,就是客户、联系方式、广告、要求播出时间(每周的一个模式)、时长、每天执行播出的时间、和广告带子编号、在磁带上的位置。这样比较容易安排播出计划和便于查找磁带目录。 NX&_p!_V  
@'|~v <<WZ  
连续用了48小时,算是搞定了。但最后是不是采用了,我就不得而知了,我只对公司负责。 6wg^FD_Q  
dgP 3@`YS  
老板希望我在他们公司兼职,但是我不同意。因为拿了人家的钱就得受人家管,而我是自由惯了的人。如果遇事请我帮忙,我有兴趣有时间就做,没兴趣可以推掉。只要我想找台电脑试试时有电脑可用,钱对我不重要。我那时的状态是我没有什么钱,可是从不缺钱,因为我不需要花钱。 #p{4^  
J9 I:Q<;  
作完这个后,济南的这个人告诉我VB很好用,可以简单地定义按钮、窗口啥的。不过他用的VB是DOS版的,但是对鼠标支持不错。 _(zG?]y0P  
u]G\H!Wk Q  
我去软件市场看了看,有Windows版的VB, 当然是D版的。5块钱买了再说吧! H%{+QwzZ[j  
A?0Nm{O;3v  
"EJ~QCW*Yh  
'0,^6'VWOV  
f,Ghb~y  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
77楼  发表于: 2015-09-05   
在此之前我用过微软最传统的Basic,深恶而痛绝之,后来的Quick Basic 支持了结构化编程,基本可以避免使用Goto语句,感觉还不错。 bs1Rvx1:J%  
;9'OOz|+1  
再看VB, 原来语法是完全一样的并略有扩充,而且窗口、事件都有现成的。 oD@7 SF  
@KUWxFak  
倒是很容易学习的。 =WJ NWt>  
EBmt9S  
公司有一本Windows 32位函数参考,发现VB可以直接利用。这样多数编码效率低的缺陷也可以基本弥补了。 >C~6\L`c  
bQ5\ ]5M  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
78楼  发表于: 2015-09-05   
在用DOS年代,教务处组织了一帮人写题库,除了计算机系的人外,只有我一个外行。 &Hnz8 Or!  
FE;x8(;W8  
那个时候我们用FoxPro 2.5 for DOS,我的工作除了参与题库设计外,主要的活儿是将组卷结果加入BD排版语言指令,卷子可以直接送印刷厂印刷就可以,不用再排版。 uvS)8-o&F  
8a"%0d#  
换了VB以后,自然就把数据库换成了Access 97,那时不会用OLE DB,只好用ODBC数据库引擎,将组卷结果写成一个RTF文件,然后可以用Windows下的Word来打开并编辑了。因为我把想到的在所有试卷中出现在格式编出一个文件,再存成.rtf格式,就知道这个“HTML”的各种标记了。 xe$_aBU  
Vf1^4 t  
杺栫杣杊椌柮栬,䒴蓉艿芖。
伍胥之 离线
级别: 军区司令员

显示用户信息 
79楼  发表于: 2015-09-05   
其间给公司干了一个小活,但是虎头蛇尾没有做完。 A+?`?pOm&  
Uoix  
公司的另一个客户是黄台电厂,在电厂进煤的专用线上有一个运态轨道衡,也就是在火车以一定速度通过后,它可以称出每节车皮的重量,操 作人员记下车厢号后,就知道车厢自重。 28u_!f[  
f`66h M[  
我不知道怎么实现的,他们说里面有很多猫腻,就是说可以多算煤净重,也可以少算。 )BfAw  
{+b7sA3  
所以,他们要求用CCD拍下车厢,自动识别出车号,另外测出车辆通过的速度。结果存入一个数据库。 k~z Iy;AZ  
2I{"XB  
就是一个我并不懂的模式识别问题。 Qe(:|q _  
ku M$UYTTX  
想拍下火车再说吧! _h1mF<\ X^  
S$X Sei_q  
在铁路对面的柱子上,设置了一个标记,当检测到图像变化时,开始录像。居然没有与轨道衡联动,那是别的公司的东东,接口不明。 S`Rs82>  
[=`q>|;pOv  
逐帧保存是一个问题,写盘数据量非常大,因为不能实时识别车号(事实上到最后我也没有学会),所以只能全存。就用BMP格式吧!我也只了解这一种格式。 5Jnlz@P9  
zp?`N;  
但是不能将每帧保存为一个文件,这样太慢了。 11;zNjD|  
| VDV<g5h  
我的办法是只存原始数据,图像的XY值是固定的,不必记入文件,所以也不用文件头了。将一列火车的所有图像写入一个文件,你想想会有多大吧!每秒大约20帧,单色的灰度CCD,每像素8位(1字节,256级灰度)。 IO:G1;[/2L  
)}O8?d`  
Win32API除了一个写文件的函数(writefile)外,还有一个特别的WriteDisk函数,它从内存中一个页面对齐的地址开始,将与扇区字节数(0x200)整数位的内存块,直接写入磁盘上的一个特殊方式打开的文件中。这个写操作速度特别快。 B#1;r-^P<  
*}W_+qo"  
我猜想,Windows的交换文件pagefile.sys 就是用这种方式读写的。 7E!5G2XX~~  
sW8dPw O  
所以,就需要除了变量声明外,需要用Win32API申请一块存贮区域作为读写的buffer(这个词在CS中叫缓冲区,后来我开始做分子生物学,才知道我天天用的缓冲溶液也叫buffer)。然后用Win32API 打开一个固定的文件,并且保证它是一个连续的磁盘区域(这在编程中是做不到的,需要用Defrag去优化)。 "tpSg  
Rbv;?'O$L  
如此,我写了一个监控程序,就是各种看守所里用的经常在需要的情况下损坏的摄像头记录仪。  "-V"=t'  
C+&l< fM&  
火车通过后的时间,就把图像再调出来分析,我最后只能把含有车厢编号的图像块分离出来,但是却不会识别出车号来。 DLNb o2C  
]')RMg zM*  
这个识别工作后来交给了别人,我知道黄台电厂用上了,但最后结果是否理想我并不清楚。 JOBhx)E  
^T-V ^^#(  
公司好像给了我一笔挺多的钱,4或5K吧!在当时,算是我见到的最多的钱了,这时工资才1K多点嘛! R0-j5&^jju  
?=pT7M  
FHI ;)wn=  
,5<Cd,`*  
杺栫杣杊椌柮栬,䒴蓉艿芖。
描述
快速回复

验证问题:
3 * 6 = ? 正确答案:18
按"Ctrl+Enter"直接提交