建立一个好的调试环境 --介绍CV.EXE在DOS下的反汇编功能 四川 王盛华 1994-09-02 一、采用窗口技术,将反汇编程序和命令、寄存器内容分别在不同窗口内进行显示。 当我们使用DEBUG调试程序时,命令的输入,屏幕结果的显示,寄存器内容的显示中依次进行的,这样,当监视程序执行时,屏幕不断的上卷,产生顾此失彼的感觉。特别是寄存器值的显示,由于缺少执行前后的比较,不容易发觉有那些寄存器的值发生了变化,给分析带来一定的困难。 CodeView的显示方式则设计得完全不同,使人一看就有一种赏心悦目的感觉。它将屏幕分成三个部分,分别作为反汇编程序、命令输入和寄存器的显示窗口,如果需要还可以增加一个监视窗口,当监视程序执行时,各自的变化在本身的窗口内显示,互不干扰。特别是寄存器窗口的设计,使得各寄存器的显示位置固定不变,其值的变化一目了然,对于FLAG值的显示更具特色,不同的状态采用不同的颜色来显示,变化更加醒目。 二、采用不同类型的输出格式来显示表达式和存贮器的值 在DEBUG中使用D命令时,存贮器的值仅能用十六进制的值来显示;而使用H命令时,也只能计算十六进制的值,如果要知道这些值的十进制的值等于多少,就无能为力了。为克服这些缺点,CodeView在显示表达式和存贮器的值时,可以自行设定不同的输出格式。例如,从DS:200处开始放入了字符串“ABCD”,使用不同输出格式时的显示结果为: 输出格式 显示结果 8-bit 十六进制 DS:200 L4 41 42 43 44 16-bit 十进制 DS:200 L4 16961 17475 ASCII码 DS:200 L4 ABCD 这的确给调试者带来极大的方便。 三、采用多种的方式来设置断点,在重新调入程序时原有断点并不消失,使调试时更加容易。 DEBUG中,只有G命令可以设置断点,这需要我们首先对程序有一基本了解之后才能进行设置,如果某一断点设置失败,将程序再次调入时,精心设置的断点全部消失,原来的调试全部白费;即使记得调试过程,也要重新将这些断点再次输入,这种多次重复性的工作,很容易使人感到厌倦。 CodeView在设置断点方面作了重大的改进,第一,它采用了多种多样的方式来设置断点,除了保留DEBUG中的G命令以外,还可以监视或者跟踪的方式来设置断点,使程序调试更加方便。例如,如果要想在下面一程序行 MOVE AH,24 设置断点,利用监视方式,只要键入下面的命令 WP? AH-24==0 就可以了。又如,要跟踪存贮器CS:204内数值的变化,只要键入下面的命令 TP CS:204 则当CS:204的值发生变化时,程序将停止运行。 其次,对于同一程序,凡是已设置过的断点,尽管程序多次调入,它们也不会消失,这种方式使你重新调入程序时,可以在前一次的调试的基础上继续往下进行,换句话说,虽然程序是多次调入的,但调试却是连续的。 四、将实际屏幕显示和调试显示分开,两者互不干扰,但调试者可以在两者之间自由转换。 当我们设计一个软件的屏幕封面时,为使其更加美观,一般都是采用图形方式,如果使用DEBUG来调试这种程序,就十分棘手。 CodeView采用了一种全新的方式来解决此问题,它将实际的屏幕显示和供调试用的屏幕显示看成是两个独立的窗口,用户在调试窗口内工作时,可以随时转换到实际屏幕显示来观察显示结果,两者互不干扰。这种设计方式巧妙地解决了两者同时使用屏幕的矛盾。 五、适用于各种语言的表达式 在CodeView调试程序时,如果要求出表达式的值,由于不同的语言采用了不同的规范,因而书写时必须加以注意。CodeView可以根据原程序的类别来选择C、FORTRAN、BASIC等语言的表达方式,这就给程序调试者多种选择。例如:要求出A和B的“与”运算值,C语言的表达式为 A&&B 而BASIC语言的表达式为 A AND B 在DOS状态下使用CodeView时,可以根据自己对程序熟悉的程度来设置相适应的语言方式,一般说来,使用C语言比较好,这样能获较高的运行速度。 六、增加一种慢速运行的方式,使用者可以观察到程序的运行状况,并可以随时利用任何键使程序停止运行。 用DEBUG来调试程序时,为了监视某一数值的变化,需要不断使用Tn命令或Pn命令,但由于屏幕不断的滚动,观察十分不方便,稍不留意,则前功尽弃。CodeView为了改善这一不足之处,在控制运行程序时,增加了一种慢速运行方式,调试者可以通过这种方式,很清楚的看到程序的运行情况,可以在不同窗口内观察运行时各值的变化;当我们认为需要程序停止时,可以按任一键中断,然后继续以后的调试工作。 CodeView还具有很多独特的优点,使用者可以随时通过热键ALT-H获得帮助,在此就不再赘述了。 (四川 王盛华)