发新话题
打印

电脑应用文件精华(让你从菜鸟到老鸟)

本主题由 执子之手 于 2008-6-18 15:09 解除置顶

电脑应用文件精华(让你从菜鸟到老鸟)

一、系 统 相 关

二、XP 实 用 技 巧

三、网 络 相 关

四、软 件 应 用

五、其 他

一系统相关:

1、Debug-PC之开山老祖(一)Debug-PC之开山老祖(二)
2、DEBUG主要命令(一)DEBUG主要命令(二)DEBUG主要命令(三)
DEBUG主要命令(四)DEBUG主要命令(五)
3、DOS初步
4、dos未公开的命令与参数
5、Java常见问题集锦(一)Java常见问题集锦(二)
6、ping的命令参数!
7、WinXP的十八般武艺
8、Win XP的十则超酷的应用技巧
9、Win XP系统中NetUser命令的另类用法
10、Windows XP Professional计算机启动过程概述
11、Windows XP 服务详解(一)Windows XP 服务详解(二)
12、Windows XP防火墙深层探索
13、WindowsXP全攻略Windows XP的一些小秘密 找回Windows XP的隐藏组件
Windows XP的几个小技巧修改注册表 Windows快捷键大全
14、Windows xp优化设置及相关问题的解决 (系统优化设置)
Windows xp优化设置及相关问题的解决(硬件优化)
Windows xp优化设置及相关问题的解决(网络优化、XP减肥方法、其他)
15、Windows XP鲜为人知的70招(一)Windows XP鲜为人知的70招(二)
16、Windows 罕见技巧全集大放送
17、Windows 蓝屏代码详解(一)Windows 蓝屏代码详解(二)Windows 蓝屏代码详解(三)
18、windows的一些操作技巧
19、windows实用技巧windows实用技巧(二)
20、Windows系统出现内存错误不用慌
21、Windows系统命令提示符八大特别技巧
22、Windows自启动程序十大藏身之所
23、XP系统文件大删除
24、XP优化技巧集
25、XP中增强DOS命令
26、安装LINUX
27、常见34种木马清除法常(一)见34种木马清除法 (二)
28、常见文件扩展名及简要说明(A)常见文件扩展名及简要说明(B-C)
常见文件扩展名及简要说明(D-E)常见文件扩展名及简要说明(F-G)
常见文件扩展名及简要说明(H-K)常见文件扩展名及简要说明(L-M)
常见文件扩展名及简要说明(N-P)常见文件扩展名及简要说明(Q-S)
常见文件扩展名及简要说明(T-W)常见文件扩展名及简要说明(X-Z)
29、程序进程(A-C)、程序进程(D-L)程序进程(M-N)
程序进程(O-U)程序进程(V-Y)
30、电脑启动故障分析思路
31、电子书(CHM)木马也疯狂
32、高手必备,专业主板词汇
33、防范Windows XP的安全策略
35、计算机病毒的故事
(一)计算机病毒的定义 (二)计算机病毒分类 (三)计算机病毒的发展
四)计算机病毒的危害性 (五)病毒检测的方法 (六)计算机病毒的破坏行为
(七)计算机病毒的防治策略 (八)Ramen是Linux的“病”而非“毒”
(九-十)专家谈计算机病毒高发季节的防护、及时升级反病毒软件的利器
(十一)合理搭配使用杀病毒软件 (十二)“我爱你”病毒创造者自白
(十三-十五)短消息接收也会传播手机病毒、专家警告新病毒无WAP不摧、您的PDA需要反病毒软件保护吗? (十六)新病毒时代 (十七)选择防病毒系统的七点注意
(十八—二十一)看似淫秽漫画,实是爱虫病毒变种、在线聊天当心“萨利姆”病毒、
手机病毒欲乘Java强势而来、病毒佯披Flash外衣
36、教你快速释放电脑系统资源的小绝招
37、警惕!装机过程中10大常规性错误
38、开始→运行→输入的命令集锦(补充版)
39、乱码翻译全攻略
40、明明白白Hotfix
41、木马病毒的通用解法
42、木马程序是如何实现隐藏的
43、木马小常识
44、木马隐藏地点全搜查
45、全面了解系统中svchost.exe文件
47、让你的硬盘更快,让系统更快更稳定!
48、如何对付蠕虫
49、如何根据名称识别计算机病毒
50、如何判断你的电脑是否中毒
51、在Windows XP中实现远程关机
53、拯救硬盘十大绝招大放送
54、正确的硬盘分区方式
55、注册表
56、注册表从入门到精通
58、硬件基础知识大全

二、XP 实 用 技 巧

1、搞定Windows XP鲜为人知的漏洞
2、在Win XP中让QQ跑得更快
3、在Windows XP中制作屏保
4、防范Windows XP的安全策略
5、
破解Windows XP中WPA的武器现身
7、
Windows XP精彩答辩
8、
为Windows XP添加五笔输入法
9、
活用XP安全模式
11、手工恢复Windows XP的欢迎登录界面
12、
慎用还原Wpa.dbl
13、WINDOWS XP终极減肥大法
14、
Win XP 键盘快捷键概述
15、Win XP中的网桥
16、Win98+Win2000+WinXP三操作系统共同使用安装实录
17、
WinXP安装参数
18、
Windows XP挂起到硬盘后的异常故障解决
19、
Windows XP优化指南
20、
Windows XP传真功能详解
24、
Windows XP的小秘密
25、
Windows XP的几个使用技巧
26、Windows XP安装问题解答精选
28、
WindowsXP不能正常关机的解决之道
29、
WindowsXP使用问题解答
30、XP的常用操作及技巧
31、全面实战Windows XP防火墙
32、扫描仪的安装和使用
33、硬件不兼容的处理
34、如何在WinXP下使用刻录机
35、如未蚩⒉岜肀嗉?/a>
36、
辅助操作和特殊功能命令
37、
消除WindowsXP中的复制乱码
38、
隔离组件和并列共享
39、
加速篇
41、
让你的Windows XP从此变得服服帖帖
42、
微软提供的超级大餐
44、
设置自动关机重启时间
46、
双剑合璧 在Win XP下刻录音乐CD
48、
减肥加速
49、运行菜单中的“快捷方式”
50、系统和磁盘操作命令
三、网 络 相 关

1、Cookie全攻略
2、FTP命令
3、Google搜索从入门到精通
4、IE全攻略
5、QQ可以上,IE开不了解决方法探讨!
6、简要介绍网络安全中防火墙和IDS的作用
7、建立全局的安全体系 防范“拒绝服务(DoS)”攻击
8、解除网页鼠标右键屏闭的十种方法

1、四、软 件 应 用

1、Cookie全攻略
2、
FTP命令
3、
Google搜索从入门到精通
4、
IE全攻略
5、
QQ可以上,IE开不了解决方法探讨!
6、
简要介绍网络安全中防火墙和IDS的作用
7、
建立全局的安全体系 防范“拒绝服务(DoS)”攻击
8、
解除网页鼠标右键屏闭的十种方法
1、Adobe Photoshop 鲜为人知的75个技巧
2、Norton Ghost使用详解
3、
photoshop图层模式详解
4、
WinRAR的几个精彩实用技巧
5、
电脑高手应用技巧荟萃
6、
七招挽回受损WORD文档
7、
全面解读软件版本的标志
五、其 他

1.加壳与脱壳
2、十天学会php之第1天
3、
十天学会php之第2天
4、
十天学会php之第3天
5、
十天学会php之第4天
6、十天学会php之第5天
7、十天学会php之第6天
8、
十天学会php之第7天
9、
十天学会php之第8天
10、
十天学会php之第9天
11、十天学会php之第10天

[此贴子已经被作者于2006-11-23 10:56:47编辑过]

TOP

Debug-PC之开山老祖 (二)

DEBUG主要命令

DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
一、DEBUG程序的调用
在DOS的提示符下,可键入命令:
C:\DEBUG [D:][PATH][FILENAME[.EXT>[PARM1][PARM2]
其中,文件名是被调试文件的名字。如用户键入文件,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的D指定驱动器PATH为路径,PARM1和PARM2则为运行被调试文件时所需要的命令参数。
在DEBUG程序调入后,将出现提示符,此时就可用DEBUG命令来调试程序。
二、DEBUG的主要命令
1、显示存储单元的命令D(DUMP),格式为:
_D[address]或_D[range]
例如,按指定范围显示存储单元内容的方法为:
-d100 120
18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...
18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.
7
18E4:0120 8B
其中0100至0120是DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。
2、修改存储单元内容的命令有两种。
·输入命令E(ENTER),有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:
-E address


    例如,-E DS:100 F3'XYZ'8D
    其中F3,'X','Y','Z'和各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的内容。
    第二种格式则是采用逐个单元相继修改的方法。命令格式为:
    -E address
    例如,-E DS:100
    则可能显示为:
    18E4:0100 89.-
    如果需要把该单元的内容修改为78,则用户可以直接键入78,再按"空格"键可接着显示下一个单元的内容,如下:
    18E4:0100 89.78 1B.-
    这样,用户可以不断修改相继单元的内容,直到用ENTER键结束该命令为止。
    ·填写命令F(FILL),其格式为:
    -F range list
    例如:-F 4BA:0100 5 F3'XYZ'8D
    使04BA:0100~0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定的范围,则重复使用list填入,直到填满指定的所有单元为止。
    3)检查和修改寄存器内容的命令R(register),它有三种格式如下:
    ·显示CPU内所有寄存器内容和标志位状态,其格式为:
    -R
    例如,-r
    AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC
    18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000
    ·显示和修改某个寄存器内容,其格式为:
    -R register name
    例如,键入
    -R AX
    系统将响应如下:
    AX F1F4

    即AX寄存器的当前内容为F1F4,如不修改则按ENTER键,否则,可键入欲修改的内容,如:

    -R bx
    BX 0369
    :059F
    则把BX寄存器的内容修改为059F。
    ·显示和修改标志位状态,命令格式为:
    -RF系统将响应,如:
    OV DN EI NG ZR AC PE CY-
    此时,如不修改其内容可按ENTER键,否则,可键入欲修改的内容,如:
    OV DN EI NG ZR AC PE CY-PONZDINV
    即可,可见键入的顺序可以是任意的。
    4)运行命令G,其格式为:
    -G[=address1][address2[address3…>
    其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
    5)跟踪命令T(Trace),有两种格式:
    ·逐条指令跟踪
    -T [=address]
    从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。
    ·多条指令跟踪
    -T [=address][value]
    从指定地址起执行n条指令后停下来,n由value指定。
    6)汇编命令A(Assemble),其格式为:
    -A[address]
    该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。
    7)反汇编命令U(Unassemble)有两种格式。
    ·从指定地址开始,反汇编32个字节,其格式为:
    -U[address]
    例如:
    -u100
    18E4:0100 C70604023801 MOV WORD PTR[0204],0138
    18E4:0106 C70606020002 MOV WORD PTR[0206],0200
    18E4:010C C70606020202 MOV WORD PTR[0208],0202
    18E4:0112 BBO4O2 MOV BX,0204
    18E4:0115 E80200 CALL 011A
    18E4:0118 CD20 INT 20
    18E4:011A 50 PUSH AX
    18E4:011B 51 PUSH CX
    18E4:011C 56 PUSH SI
    18E4:011D 57 PUSH DI
    18E4:011E 8B37 MOV SI,[BX]
    如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。
    ·对指定范围内的存储单元进行反汇编,格式为:
    -U[range]
    例如:
    -u100 10c
    18E4:0100 C70604023801 MOV WORD PTR[0204],0138
    18E4:0106 C70606020002 MOV WORD PTR[0206],0200
    18E4:010C C70606020202 MOV WORD PTR[0208],0202

    -u100 112
    18E4:0100 C70604023801 MOV WORD PTR[0204],0138
    18E4:0106 C70606020002 MOV WORD PTR[0206],0200
    18E4:010C C70606020202 MOV WORD PTR[0208],0202

    可见这两种格式是等效的。
    8)命名命令N(Name),其格式为:
    -N filespecs [filespecs]
    命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入存盘。filespecs的格式可以是:
    [d:][path] filename[.ext]
    例如,
    -N myprog
    -L
    -
    可把文件myprog装入存储器。
    9)装入命令(Load),有两种功能。
    ·把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:
    -L[address[drive sector sector]
    ·装入指定文件,其格式为:
    -L[address]
    此命令装入已在CS:5CH中格式化了文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。
    10)写命令W(Write),有两种功能。
    ·把数据写入磁盘的指定扇区。其格式为:
    -W address drive sector sector
    ·把数据写入指定的文件中。其格式为:
    -W[address]
    此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。
    11)退出DEBUG命令Q(Quit),其格式为:
    -Q
    它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。

    问题:初学者问一个低级问题,执行debug-a后,如果有一行输入错误,如何更改这一行?

    回答:
    加入进行如下输入:
    D:\PWIN95\Desktop>debug
    -a
    2129:0100movax,200
    2129:0103movbx,200
    2129:0106movcx,200
    2129:0109
    此时,发现movbx,200一句错误,应为movbx,20,可以敲回车返回"-"状态,然后输入:
    -a103
    2129:0103movbx,20
    如果多或者少若干行,不必重新输入,可以用M命令移动后面的程序来去掉或者增加程序空间。

    [此贴子已经被作者于2006-11-23 10:50:00编辑过]

TOP

DEBUG主要命令(一)

DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
一、DEBUG程序的调用
在DOS的提示符下,可键入命令:
C:\DEBUG [D:][PATH][FILENAME[.EXT]][PARM1][PARM2]
其中,文件名是被调试文件的名字。如用户键入文件,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的D指定驱动器PATH为路径,PARM1和PARM2则为运行被调试文件时所需要的命令参数。
在DEBUG程序调入后,将出现提示符,此时就可用DEBUG命令来调试程序。
二、DEBUG的主要命令
1、显示存储单元的命令D(DUMP),格式为:
_D[address]或_D[range]
例如,按指定范围显示存储单元内容的方法为:
-d100 120
18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...
18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.
7
18E4:0120 8B
其中0100至0120是DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。
2、修改存储单元内容的命令有两种。
·输入命令E(ENTER),有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:
-E address


    例如,-E DS:100 F3'XYZ'8D
    其中F3,'X','Y','Z'和各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的内容。
    第二种格式则是采用逐个单元相继修改的方法。命令格式为:
    -E address
    例如,-E DS:100
    则可能显示为:
    18E4:0100 89.-
    如果需要把该单元的内容修改为78,则用户可以直接键入78,再按"空格"键可接着显示下一个单元的内容,如下:
    18E4:0100 89.78 1B.-
    这样,用户可以不断修改相继单元的内容,直到用ENTER键结束该命令为止。
    ·填写命令F(FILL),其格式为:
    -F range list
    例如:-F 4BA:0100 5 F3'XYZ'8D
    使04BA:0100~0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定的范围,则重复使用list填入,直到填满指定的所有单元为止。
    3)检查和修改寄存器内容的命令R(register),它有三种格式如下:
    ·显示CPU内所有寄存器内容和标志位状态,其格式为:
    -R
    例如,-r
    AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC
    18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000
    ·显示和修改某个寄存器内容,其格式为:
    -R register name
    例如,键入
    -R AX
    系统将响应如下:
    AX F1F4

    即AX寄存器的当前内容为F1F4,如不修改则按ENTER键,否则,可键入欲修改的内容,如:

    -R bx
    BX 0369
    :059F
    则把BX寄存器的内容修改为059F。
    ·显示和修改标志位状态,命令格式为:
    -RF系统将响应,如:
    OV DN EI NG ZR AC PE CY-
    此时,如不修改其内容可按ENTER键,否则,可键入欲修改的内容,如:
    OV DN EI NG ZR AC PE CY-PONZDINV
    即可,可见键入的顺序可以是任意的。
    4)运行命令G,其格式为:
    -G[=address1][address2[address3…]]
    其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
    5)跟踪命令T(Trace),有两种格式:
    ·逐条指令跟踪
    -T [=address]
    从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。
    ·多条指令跟踪
    -T [=address][value]
    从指定地址起执行n条指令后停下来,n由value指定。
    6)汇编命令A(Assemble),其格式为:
    -A[address]
    该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。
    7)反汇编命令U(Unassemble)有两种格式。
    ·从指定地址开始,反汇编32个字节,其格式为:
    -U[address]
    例如:
    -u100
    18E4:0100 C70604023801 MOV WORD PTR[0204],0138
    18E4:0106 C70606020002 MOV WORD PTR[0206],0200
    18E4:010C C70606020202 MOV WORD PTR[0208],0202
    18E4:0112 BBO4O2 MOV BX,0204
    18E4:0115 E80200 CALL 011A
    18E4:0118 CD20 INT 20
    18E4:011A 50 PUSH AX
    18E4:011B 51 PUSH CX
    18E4:011C 56 PUSH SI
    18E4:011D 57 PUSH DI
    18E4:011E 8B37 MOV SI,[BX]
    如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。
    ·对指定范围内的存储单元进行反汇编,格式为:
    -U[range]
    例如:
    -u100 10c
    18E4:0100 C70604023801 MOV WORD PTR[0204],0138
    18E4:0106 C70606020002 MOV WORD PTR[0206],0200
    18E4:010C C70606020202 MOV WORD PTR[0208],0202

    -u100 112
    18E4:0100 C70604023801 MOV WORD PTR[0204],0138
    18E4:0106 C70606020002 MOV WORD PTR[0206],0200
    18E4:010C C70606020202 MOV WORD PTR[0208],0202

    可见这两种格式是等效的。
    8)命名命令N(Name),其格式为:
    -N filespecs [filespecs]
    命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入存盘。filespecs的格式可以是:
    [d:][path] filename[.ext]
    例如,
    -N myprog
    -L
    -
    可把文件myprog装入存储器。

    9)装入命令(Load),有两种功能。
    ·把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:
    -L[address[drive sector sector]
    ·装入指定文件,其格式为:
    -L[address]
    此命令装入已在CS:5CH中格式化了文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。
    10)写命令W(Write),有两种功能。
    ·把数据写入磁盘的指定扇区。其格式为:
    -W address drive sector sector
    ·把数据写入指定的文件中。其格式为:
    -W[address]
    此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。
    11)退出DEBUG命令Q(Quit),其格式为:
    -Q
    它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。

    问题:初学者问一个低级问题,执行debug-a后,如果有一行输入错误,如何更改这一行?

    回答:
    加入进行如下输入:
    D:\PWIN95\Desktop>debug
    -a
    2129:0100movax,200
    2129:0103movbx,200
    2129:0106movcx,200
    2129:0109
    此时,发现movbx,200一句错误,应为movbx,20,可以敲回车返回"-"状态,然后输入:
    -a103
    2129:0103movbx,20
    如果多或者少若干行,不必重新输入,可以用M命令移动后面的程序来去掉或者增加程序空间。

    如何除错和汇编你的第一个PC x86汇编语言程序呢?

    以下这些简单的解释可以让一个汇编语言新手使用DEBUG:

    0)在使用时,如何快速获得debug的使用帮助呢。
    1)让我们开始工作吧,例如:显示BIOS的日期。
    2)在你的电脑的COMMANG.COM文件里搜寻"IBM"这几个字符。
    3) 一位十六进制数的运算。
    4) 检查 x86寄存器内容。
    5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符。
    6) 我们现在用汇编语言指令来做和例5一样的事情。
    7)现在,我们不但要编写一个汇编程序,而且我们还要把它存盘。
    8) 现在,我们试一试查看一个已经编好的程序。
    9)你可以用DEBUG的计算功能计算程序的长度。
    10)另一种显示在屏幕上字符串的方法。
    11)让我们试一试反复输出。
    12)我们现在把两个程序连接起来。
    13) 让我们逐步运行这个刚刚修补的程序。
    14)如果一开始的命令不是跳转命令,那么可能就要用这种方法了。

    以下所有的命令都是可以运行在WIN9x的MS-DOS方式下的。
    进入MS-DOS的方式有:
    [开始][程序][MS-DOS方式]

    [开始][运行][打开]COMMAND[确定]

    或者你可以双击它:
    C:\Windows\Command.com

    0)在使用时,如何快速获得debug的使用帮助呢
    以下PROMPT>表示目录提示符:一般为:C:\WINDOWS\COMMAND\
    PROMPT> DEBUG /?<按回车press the enter key now>
    怎样?出错了吧。显示如下
    C:\WINDOWS>DEBUG/?
    Runs Debug, a program testing and editing tool.

    DEBUG [[drive:][path]filename [testfile-parameters]]

    [drive:][path]filename Specifies the file you want to test.
    testfile-parameters Specifies command-line information required by
    the file you want to test.

    After Debug starts, type ? to display a list of debugging commands.
    因为错了所以它给你显示一些提示。留意到最后一句了吗?


    现在我们再来试一试:
    PROMPT> DEBUG<按回车> (注意, DEBUG程序的命令是在一条横线"-"后出现的。)
    -?<在出现的横线后面输入?再回车> (下面的内容是按字母顺序排列的)
    (注意:Note: Don't type the dash or comments -- just the ?)
    显示如下,但是没有中文的哦,中文是我加上去的。


    汇编assemble A [address]
    比较compare C range address
    倾倒dump D [range]
    进入enter E address

      填充fill F range list
      进行go G [=address] [addresses]
      十六进制hex H value1 value2
      输入input I port
      装载load L [address] [drive] [firstsector] [number]
      移动move M range address
      命名name N [pathname] [arglist]
      输出output O port byte
      进行proceed P [=address] [number]
      离开quit Q
      纪录register R [register]
      搜寻search S range list
      描述trace T [=address] [value]
      反汇编unassemble U [range]
      写write W [address] [drive] [firstsector] [number]
      分配扩展内存allocate expanded memory XA [#pages]
      释放扩展内存deallocate expanded memory XD [handle]
      map expanded memory pages XM [Lpage] [Ppage] [handle]
      display expanded memory status XS
      -q<按回车> (这是退出DEBUG回到DOS状态)This quits out of debug, returning to the DOS prompt)

      Tested examples below walk the user thru the following debug examples:
      在下面的例子里读者必须明白以下几条DEBUG命令。
      -D 显示一定范围内存的内容Display the contents of an area of memory
      -Q 退出DEBUG程序Quit the debug program
      -S 搜寻Search for whatever
      -H 十六进制的运算Hex arithmatic
      -R 显示或者改变一个或者多个寄存器的内容Display or change the contents of one or more registers
      -E 输入数据进入内存,在一个详细的地址里Enter data into memory, beginning at a specific location
      -G 运行现在在内存里的程序。Go run the executable program in memory
      -U 反汇编,把我们不认识的机械代码变为我们可以认识汇编语言符号Unassemble machine code into symbolic code
      -T 描述一条指令的用法。Trace the contents of one instruction
      -P 进行或者执行一个相关的指令Proceed, or execute a set of related instructions
      -A 编译,把汇编命令变为机械代码Assemble symbolic instructions into machine code
      -N 命名一个程序Name a program
      -W 把一个已经命名的程序写进磁盘Write the named program onto disk
      -L 把程序装载进内存Load the named program back into memory

TOP

DEBUG主要命令(二)

1)让我们开始工作吧,例如:显示BIOS的日期
(以下PROMPT>表示目录提示符:一般为:C:\WINDOWS\COMMAND\)

PROMPT> DEBUG<按回车>
-D FFFF:0006 L 8<按回车> (显示 FFFFh, 偏移地址 6h, 长度 8 bytes)
在作者的电脑上这里显示为 "1/10/96."
译者的电脑显示" FFFF:0000 37 2F-30 36 2F 30 30 00 7/06/00."相信作者的电脑里也是用这种格式显示的。这里显示出来的是使用者BIOS的日期,有兴趣的话可以重新开机看看,注意开机时的显示。
-Q<按回车> (退出DEBUG)

思考:当只按DEBUG的时候,编辑的是什么?为什么可以找到BIOS的日期?(译者这里也不是很清楚所以请大家知道的也留言给斑竹,改正。译者认为可能是内存的真实物理地址。)

2)在你的电脑的COMMANG.COM文件里搜寻"IBM"这几个字符
下面的"C:\Win95\"是根据每不电脑不同的。像译者的电脑里就是"C:\WINDOWS"

PROMPT> DEBUG C:\Win95\Command.com<按回车>
-S 0 L FFFF "IBM"<按回车>(从0开始搜寻"IBM",搜寻FFFFh多个单元格)
-Q<按回车> (退出DEBUG)

以下是译者做的:

C:\WINDOWS>DEBUG C:\WINDOWS\COMMAND.COM
-S 0 L FFFF "IBM"
-S 0 L FFFF "COMMAND"
12A7:008D
12A7:04F7
12A7:3870
12A7:38BE
12A7:38DD
-S 0 L FFFF "PATH"
12A7:38AD
12A7:CCB7
12A7:CF55
-S 0 L FFFF "COMSPEC"
12A7:38D4
12A7:3A4D
12A7:CCC4
-Q

C:\WINDOWS>

(注意:搜寻是要区分大小写的)
(你可以看到上面是没有找到"IBM"的, 可以试一试"PATH" , "COMSPEC" , "COMMAND")
(注意: 这种方法用在查找加密资料和已被删除的资料等方面时是十分有用的)

3) 一位十六进制数的运算:

PROMPT> DEBUG<按回车>
-H 9 1<按回车> (加减两个十六进制的数, 9h+1h=Ah & 9h-1h=8h)
结果是显示: 000A 0008
-Q<按回车> (退出DEBUG)

C:\WINDOWS>debug
-h 9 1
000A 0008
-q
C:\WINDOWS>

4) 检查x86寄存器内容

PROMPT> DEBUG<按回车>
-R<按回车> (显示x86寄存器内容)
-Q<按回车> (退出DEBUG)

C:\WINDOWS>debug
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC
127C:0100 043C ADD AL,3C
-Q

下面是对寄存器的简单介绍:

数据存储器
在本类中,一般讲的AH就是AX的前八位,AL就是AX的后八位,后面的以此类推。
AX Accumulator;作为累加器,所以它是算术运算的主要寄存器。另外所有的I/O指令都使用这一寄存器与外部设备传送信息。
BX Base register;可以作为通用寄存器使用,此外在计算存储器地址时,它经常用作基地址寄存器。
CX Counting register;可以作为通用寄存器使用,此外在循环(LOOP)和串处理指令中作隐含的计数器。
DX Data register;可以作为通用寄存器使用,一般在作双字长运算时,把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。此外,对某些I/O操作,DX可用来存放I/O的端口地址。

指针及变址寄存器
BP Base pointers register ;机制指针寄存器
SI Source index register ;堆栈指针寄存器
DI Destiny index register ;目的变址寄存器
SP Battery pointer register ;堆栈指针寄存器

段寄存器
CS Code segment register ;代码段寄存器,存放正在运行的程序指令
DS Data segment register ;数据段寄存器,存放当前运行程序所用的数据
SS Battery segment register ;堆栈段寄存器,定义了堆栈所在区域
ES Extra segment register ;附加段寄存器,存放附加的数据,是一个辅助性的数据区,

控制寄存器
IP Next instruction pointer register;指令指针寄存器,它用来存放代码段中的偏移地址,在程序运行的过程中,它始终指向下一条指令的首地址,它与CS寄存器联用确定下一条指令的物理地址
F Flag register;标志寄存器 "NV UP EI PL NZ NA PO NC"就是了,也有人称之为PSW Program Status Wold程序状态寄存器

(这里有一点必须讲明白的现在在,其实从奔腾开始这些寄存器(除了所有段寄存器,标志寄存器 )都是32位的。并且加多了两个16位段寄存器FS,GS。dos下面看到这些寄存器是16位的。要看32位寄存器可以使用soft-ice。对于FS,GS的作用我也不是很清楚,希望有高手指点,谢谢。)

TOP

DEBUG主要命令(三)

5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符
(这里用机械语言的主要原因是考虑到有一些用户不懂汇编命令,现在就要让他有一个认识计算机程序实质是一些数字)

PROMPT> DEBUG<按回车>
-E 100<按回车> (在偏移地址为100的地方输入机械指令程序)
B4<按空格>02<按空格> (在AX寄存器的前八位存入02)
B2<按空格>41<按空格> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码,身边有ASCII表的朋友可以对着表改改数字试一试)
CD<按空格>21<按空格> (当AH=02时这是DOS显示输出的中断号)
CD<按空格>20<按回车> (退出DOS)
-G<按回车> (程序运行,并在屏幕上显示出"A")
程序运行完以后你将看到"Program terminated normally"(程序正常结束了).
-U 100<按回车> (我们把它反汇编,就是把机械命令变为汇编语言指令)
107F:0100 B402 MOV AH,02
:0102 B2 MOV DL,41
:0104 CD21 INT 21
:0106 CD20 INT 20
(下面会有一堆无用的东西)
(对了,你的段地址可能与我的段地址CS=107F不同哦)
-R<按回车> (让我们来看看寄存器的值; IP==100h, AX==0000h, DX==0000h)
好极了,我们看到电脑又做好了准备下一次运行程序了。
-T<按回车> (执行第一步操作... IP=>102h, AX=>0200h,指令指针寄存器指向下一条命令,AX的值被改变。
-T<按回车> (执行第二步操作... IP=>104h, , DX=>0041h,指令指针寄存器指向下一条命令,DX的值被改变。
-P<按回车> (继续执行 INT 21,IP=>106h, AX=>02h,)
-P<按回车> (继续执行INT 20)
-Q<按回车> (退出DEBUG)
(注意:你必须小心使用"T".因为如果你在程序完结以后继续执行这条命令,因为我们无法预知下面的指令是什么,所以我们也无法预知它可能带来的后果)
C:\WINDOWS>DEBUG
-E 100
127C:0100 B4.B4 02.02 B2.B2 41.41 CD.CD 21.21 CD.CD 20.20
-G
A
Program terminated normally
-U 100
127C:0100 B402 MOV AH,02
127C:0102 B241 MOV DL,41
127C:0104 CD21 INT 21
127C:0106 CD20 INT 20
127C:0108 C706F1E30900 MOV WORD PTR [E3F1],0009
127C:010E EB59 JMP 0169
127C:0110 57 PUSH DI
127C:0111 BFF1E3 MOV DI,E3F1
127C:0114 8BDF MOV BX,DI
127C:0116 06 PUSH ES
127C:0117 0E PUSH CS
127C:0118 07 POP ES
127C:0119 32D2 XOR DL,DL
127C:011B EB34 JMP 0151
127C:011D 006B12 ADD [BP+DI+12],CH
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC
127C:0100 B402 MOV AH,02
-T

AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0102 NV UP EI PL NZ NA PO NC
127C:0102 B241 MOV DL,41
-T

AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0104 NV UP EI PL NZ NA PO NC
127C:0104 CD21 INT 21
-P
A
AX=0241 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0106 NV UP EI PL NZ NA PO NC
127C:0106 CD20 INT 20
-P

Program terminated normally
-Q

C:\WINDOWS>




6) 我们现在用汇编语言指令来做和例5一样的事情

PROMPT> DEBUG<按回车>
-A 100<按回车> (在偏移地址为100的地方输入汇编语言程序)
MOV AH,02<按回车> (选用DOS的02号功能调用,显示输出)
MOV DL,<按回车> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码,身边有ASCII表的朋友可以对着表改改数字试一试)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"A")
INT 20<按回车> (退出DOS)
<按回车> (结束汇编语言编程状态,回到DEBUG命令状态)
-G =100<按回车> (运行程序,其实可以不要"=100"因为一般默认启始位置是100)
-Q<按回车> (退出DEBUG)


C:\WINDOWS>DEBUG
-A 100
127C:0100 MOV AH,02
127C:0102 MOV DL,41
127C:0104 INT 21
127C:0106 INT 20
127C:0108
-G
A
Program terminated normally
-Q


7) 现在,我们不但要编写一个汇编程序,而且我们还要把它存盘
(下面这个程序就要比原来的程序复杂一点了-显示输出:"ABC")

PROMPT> DEBUG<按回车>(运行DEBUG程序;系统默认启始IP寄存器值为100h)
-A 100<按回车> (用汇编语言编写一个程序,启始地址是100h)
MOV AH,02<按回车> (选择DOS的02号功能调用, 显示输出)
MOV DL,<按回车> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"A")
MOV DL,42<按回车> (在DX寄存器的后八位存入41h,41h就是大写B的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"B")
MOV DL,43<按回车> (在DX寄存器的后八位存入41h,41h就是大写C的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"C")
INT 20<按回车> (程序结束,退出DEBUG)
<按回车> (结束汇编命令输入,回到DEBUG命令输入)
-R BX<按回车> (查看寄存器BX的值)
:0000<按回车> (设置BX为0000h,这是程序的结尾地址是BX:CX)
(注意,只要BX = 0000, 文件的大小就小于 < 64 Kb.)
-R CX<按回车> (设置CX为Fh,这是程序的长度:16位)
:0010<按回车> (现在我们可以把这个16字节的程序写入硬盘了)
-N printabc.com<按回车> (将要存盘的程序命名)
-W<按回车> (把这十六字节写到文件里面)
-Q<按回车> (退出DEBUG)
PROMPT> DIR printabc.com<按回车>
这里将会报告这个文件的大小是16字节 (10h 字节).
PROMPT> printabc.com<按回车>
会马上在屏幕上打印出"ABC"

C:\WINDOWS>DEBUG
-A 100
127C:0100 MOV AH,02
127C:0102 MOV DL,41
127C:0104 INT 21
127C:0106 MOV DL,42
127C:0108 INT 21
127C:010A MOV DL,43
127C:010C INT 21
127C:010E INT 20
127C:0110
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC
127C:0100 B402 MOV AH,02
-R BX
BX 0000
:
-R CX
CX 0000
:0010
-N PRINTABC.COM
-W
Writing 00010 bytes
-Q
C:\WINDOWS>DIR PRINTABC.COM
Volume in drive C has no label
Volume Serial Number is 28FB-70BA
Directory of C:\WINDOWS
PRINTABC COM 16 03-21-01 11:02 PRINTABC.COM
1 file(s) 16 bytes
0 dir(s) 557,711,360 bytes free
C:\WINDOWS>RINTABC
ABC
C:\WINDOWS>

这里可以有人告诉我,为什么要存入是BX:CX代表程序长度吗?(写信给译者,谢谢)

8) 现在,我们试一试查看一个已经编好的程序:

PROMPT> DEBUG<按回车>(运行DEBUG程序在CS:IP = CS:0100h)
-N printabc.com<按回车> (告诉电脑你想装载的程序名)
-L<按回车> (装载那个名字的程序进入内存)
-U 100 L 10<按回车> (从偏移地址100开始反汇编16位字节)
-R<按回车> (现在看看寄存器里面的内容)
注意:DEBUG本身是没有自动纪录文件大小的。
-G (运行被命名的程序,打印"ABC")
你将看到"ABC",然后是"Program terminated normally")

C:\WINDOWS>DEBUG
-N PRINTABC.COM
-L
-U 100 L 10
12A4:0100 B402 MOV AH,02
12A4:0102 B241 MOV DL,41
12A4:0104 CD21 INT 21
12A4:0106 B242 MOV DL,42
12A4:0108 CD21 INT 21
12A4:010A B243 MOV DL,43
12A4:010C CD21 INT 21
12A4:010E CD20 INT 20
-R
AX=0000 BX=0000 CX=0010 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=12A4 ES=12A4 SS=12A4 CS=12A4 IP=0100 NV UP EI PL NZ NA PO NC
12A4:0100 B402 MOV AH,02
-G
ABC
Program terminated normally


9)你可以用DEBUG的计算功能计算程序的长度。

一开始的时候你的程序初始地址是在0100h:
107F:0100 MOV AH,02 <--这就是 100h
你的程序的最后一行在010Eh:
107F:010E INT 20 <--最后一行
然后,最后一条命令的下一行的地址是0110h:
107F:0110 <--这就是110h
所以,从0110h里减去100h我们得到得长度是10h 字节.

PROMPT> DEBUG<按回车>
-H 110 100<按回车> (这条命令将运算110h+100h和110h-100h)
0210 0010<按回车> (汇报 110h-100h=0010h; 16-byte 程序长度16位)
-Q<按回车> (退出DEBUG)


C:\WINDOWS>debug
-H 110 100
0210 0010
-Q

10)另一种显示在屏幕上字符串的方法

注意:在你输入数据的时候,按"-"键将会可以让你回退一格。

PROMPT> DEBUG<按回车>
-E 200<按回车> (从偏移地址200开始。输入"Hello,World")
48<按空格>65<按空格> (输入48h (H)和65h (e))
6C<按空格>6C<按空格> (输入6Ch (l)和6Ch (l))
6F<按空格>2C<按空格> (输入6Fh (o)和2Ch (,))
57<按空格>6F<按空格> (输入57h (W)和6Fh (o))
72<按空格>6C<按空格> (输入72h (r)和6Ch (l))
64<按空格>24<按空格> (输入64h (d)和24h ($))
<按回车> ("Hello,World" 已经输入完毕)
-D 200<按回车> (显示你刚刚输入的内容:
48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 ... HELLO,WORLD$...)
-A 100<按回车> (用汇编语言写一个新程序在IP-100h处开始)
MOV AH,09<按回车> (选择DOS的09号功能调用,显示字符串)
MOV DX,0200<按回车> (把输出地址(200h),放进寄存器)
INT 21<按回车> (执行DOS功能调用,显示"Hello,World")
INT 20<按回车> (退出程序回到DOS状态)
<按回车> (结束汇编语言输入,回到DEBUG输入状态)
-G<按回车> (从 CS:IP开始运行程序, 就是从107F:0100h开始执行程序)

现在,我们可以把这个程序保存进一硬盘

-D 100<按回车> (纪录:程序的起始点在100h)
-D 200<按回车> (纪录:程序数据单元的结束点是在020Bh)
-H 20B 100<按回车> (运算 20Bh-100h=10Bh;程序长度267字节)
-R BX<按回车> (检查BX寄存器的值)
:0000<按回车> (设置BX为0000h,程序的长度是BX:CX,实际上你可以把和CX写到一起,即实际长度为:0000010Bh,这样些的目的是使你可以计算更大的程序的长度)
-R CX<按回车> (设置CX 为010Bh, 这就是这个程序的长度了)
:010B<按回车> (现在你可以把这个108字节的程序写入硬盘了)
-N printhw.com<按回车> (将要写入硬盘的程序命名)
-W<按回车> (把这10Bh 即267个字节写入文件)
-Q<按回车> (退出DEBUG)
PROMPT> DIR printhw.com<按回车>
将会汇报程序的长度是267字节(10Bh字节).
PROMPT> printhw.com<按回车>
运行这个程序,这将会在屏幕上显示出"Hello,World" :

C:\WINDOWS>DEBUG
-E 200
127C:0200 2C.48 D5.65 BA.6C FF.6C FF.6F B8.2C 00.57 AE.6F
127C:0208 CD.72 2F.6C 3C.64 00.24 C3.
-D 200
127C:0200 48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 C3 A0 ED E3 Hello,World$
127C:0210 0A C0 74 09 56 57 E8 84-21 5F 5E 73 0A B9 04 01 ..t.VW..!_^s
127C:0220 FC 56 57 F3 A4 5F 5E C3-50 56 33 C9 33 DB AC E8 .VW.._^.PV3.
127C:0230 C3 23 74 19 3C 0D 74 15-F6 C7 20 75 06 3A 06 1E .#t.<.t... u
127C:0240 D4 74 0A 41 3C 22 75 E6-80 F7 20 EB E1 5E 58 C3 .t.A<"u... .
127C:0250 A1 F3 D8 8B 36 F5 D8 C6-06 37 DA 00 C6 06 33 DA ....6....7..
127C:0260 00 8B 36 F5 D8 8B 0E F3-D8 8B D6 E3 42 51 56 5B ..6.........
127C:0270 2B DE 59 03 CB 8B D6 C6-06 D7 DC 00 E3 31 49 AC +.Y.........
-A 100
127C:0100 MOV AH,09
127C:0102 MOV DX,0200
127C:0105 INT 21
127C:0107 INT 20
127C:0109
-G
Hello,World
Program terminated normally
-D200
127C:0200 48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 C3 A0 ED E3 Hello,World$
127C:0210 0A C0 74 09 56 57 E8 84-21 5F 5E 73 0A B9 04 01 ..t.VW..!_^s
127C:0220 FC 56 57 F3 A4 5F 5E C3-50 56 33 C9 33 DB AC E8 .VW.._^.PV3.
127C:0230 C3 23 74 19 3C 0D 74 15-F6 C7 20 75 06 3A 06 1E .#t.<.t... u
127C:0240 D4 74 0A 41 3C 22 75 E6-80 F7 20 EB E1 5E 58 C3 .t.A<"u... .
127C:0250 A1 F3 D8 8B 36 F5 D8 C6-06 37 DA 00 C6 06 33 DA ....6....7..
27C:0260 00 8B 36 F5 D8 8B 0E F3-D8 8B D6 E3 42 51 56 5B ..6.........
127C:0270 2B DE 59 03 CB 8B D6 C6-06 D7 DC 00 E3 31 49 AC +.Y.........
-H 20B 100
030B 010B
-R BX
BX 0000
:
-R CX
CX 0000
:010B
-N PRINTHW.COM
-W
Writing 0010B bytes
-Q
C:\WINDOWS>DIR PRINTHW.COM
Volume in drive C has no label
Volume Serial Number is 28FB-70BA
Directory of C:\WINDOWS
PRINTHW COM 267 03-22-01 11:53 PRINTHW.COM
1 file(s) 267 bytes
0 dir(s) 555,089,920 bytes free

TOP

DEBUG主要命令(四)

5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符
(这里用机械语言的主要原因是考虑到有一些用户不懂汇编命令,现在就要让他有一个认识计算机程序实质是一些数字)

PROMPT> DEBUG<按回车>
-E 100<按回车> (在偏移地址为100的地方输入机械指令程序)
B4<按空格>02<按空格> (在AX寄存器的前八位存入02)
B2<按空格>41<按空格> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码,身边有ASCII表的朋友可以对着表改改数字试一试)
CD<按空格>21<按空格> (当AH=02时这是DOS显示输出的中断号)
CD<按空格>20<按回车> (退出DOS)
-G<按回车> (程序运行,并在屏幕上显示出"A")
程序运行完以后你将看到"Program terminated normally"(程序正常结束了).
-U 100<按回车> (我们把它反汇编,就是把机械命令变为汇编语言指令)
107F:0100 B402 MOV AH,02
:0102 B2 MOV DL,41
:0104 CD21 INT 21
:0106 CD20 INT 20
(下面会有一堆无用的东西)
(对了,你的段地址可能与我的段地址CS=107F不同哦)
-R<按回车> (让我们来看看寄存器的值; IP==100h, AX==0000h, DX==0000h)
好极了,我们看到电脑又做好了准备下一次运行程序了。
-T<按回车> (执行第一步操作... IP=>102h, AX=>0200h,指令指针寄存器指向下一条命令,AX的值被改变。
-T<按回车> (执行第二步操作... IP=>104h, , DX=>0041h,指令指针寄存器指向下一条命令,DX的值被改变。
-P<按回车> (继续执行 INT 21,IP=>106h, AX=>02h,)
-P<按回车> (继续执行INT 20)
-Q<按回车> (退出DEBUG)
(注意:你必须小心使用"T".因为如果你在程序完结以后继续执行这条命令,因为我们无法预知下面的指令是什么,所以我们也无法预知它可能带来的后果)
C:\WINDOWS>DEBUG
-E 100
127C:0100 B4.B4 02.02 B2.B2 41.41 CD.CD 21.21 CD.CD 20.20
-G
A
Program terminated normally
-U 100
127C:0100 B402 MOV AH,02
127C:0102 B241 MOV DL,41
127C:0104 CD21 INT 21
127C:0106 CD20 INT 20
127C:0108 C706F1E30900 MOV WORD PTR [E3F1],0009
127C:010E EB59 JMP 0169
127C:0110 57 PUSH DI
127C:0111 BFF1E3 MOV DI,E3F1
127C:0114 8BDF MOV BX,DI
127C:0116 06 PUSH ES
127C:0117 0E PUSH CS
127C:0118 07 POP ES
127C:0119 32D2 XOR DL,DL
127C:011B EB34 JMP 0151
127C:011D 006B12 ADD [BP+DI+12],CH
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC
127C:0100 B402 MOV AH,02
-T

AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0102 NV UP EI PL NZ NA PO NC
127C:0102 B241 MOV DL,41
-T

AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0104 NV UP EI PL NZ NA PO NC
127C:0104 CD21 INT 21
-P
A
AX=0241 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0106 NV UP EI PL NZ NA PO NC
127C:0106 CD20 INT 20
-P

Program terminated normally
-Q

C:\WINDOWS>

返回目录

6) 我们现在用汇编语言指令来做和例5一样的事情

PROMPT> DEBUG<按回车>
-A 100<按回车> (在偏移地址为100的地方输入汇编语言程序)
MOV AH,02<按回车> (选用DOS的02号功能调用,显示输出)
MOV DL,<按回车> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码,身边有ASCII表的朋友可以对着表改改数字试一试)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"A")
INT 20<按回车> (退出DOS)
<按回车> (结束汇编语言编程状态,回到DEBUG命令状态)
-G =100<按回车> (运行程序,其实可以不要"=100"因为一般默认启始位置是100)
-Q<按回车> (退出DEBUG)


C:\WINDOWS>DEBUG
-A 100
127C:0100 MOV AH,02
127C:0102 MOV DL,41
127C:0104 INT 21
127C:0106 INT 20
127C:0108
-G
A
Program terminated normally
-Q

返回目录

7) 现在,我们不但要编写一个汇编程序,而且我们还要把它存盘
(下面这个程序就要比原来的程序复杂一点了-显示输出:"ABC")

PROMPT> DEBUG<按回车>(运行DEBUG程序;系统默认启始IP寄存器值为100h)
-A 100<按回车> (用汇编语言编写一个程序,启始地址是100h)
MOV AH,02<按回车> (选择DOS的02号功能调用, 显示输出)
MOV DL,<按回车> (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"A")
MOV DL,42<按回车> (在DX寄存器的后八位存入41h,41h就是大写B的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"B")
MOV DL,43<按回车> (在DX寄存器的后八位存入41h,41h就是大写C的ASCII码)
INT 21<按回车> (当AH=02时这是DOS显示输出的中断号,显示"C")
INT 20<按回车> (程序结束,退出DEBUG)
<按回车> (结束汇编命令输入,回到DEBUG命令输入)
-R BX<按回车> (查看寄存器BX的值)
:0000<按回车> (设置BX为0000h,这是程序的结尾地址是BX:CX)
(注意,只要BX = 0000, 文件的大小就小于 < 64 Kb.)
-R CX<按回车> (设置CX为Fh,这是程序的长度:16位)
:0010<按回车> (现在我们可以把这个16字节的程序写入硬盘了)
-N printabc.com<按回车> (将要存盘的程序命名)
-W<按回车> (把这十六字节写到文件里面)
-Q<按回车> (退出DEBUG)
PROMPT> DIR printabc.com<按回车>
这里将会报告这个文件的大小是16字节 (10h 字节).
PROMPT> printabc.com<按回车>
会马上在屏幕上打印出"ABC"

C:\WINDOWS>DEBUG
-A 100
127C:0100 MOV AH,02
127C:0102 MOV DL,41
127C:0104 INT 21
127C:0106 MOV DL,42
127C:0108 INT 21
127C:010A MOV DL,43
127C:010C INT 21
127C:010E INT 20
127C:0110
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC
127C:0100 B402 MOV AH,02
-R BX
BX 0000
:
-R CX
CX 0000
:0010
-N PRINTABC.COM
-W
Writing 00010 bytes
-Q
C:\WINDOWS>DIR PRINTABC.COM
Volume in drive C has no label
Volume Serial Number is 28FB-70BA
Directory of C:\WINDOWS
PRINTABC COM 16 03-21-01 11:02 PRINTABC.COM
1 file(s) 16 bytes
0 dir(s) 557,711,360 bytes free
C:\WINDOWS>RINTABC
ABC
C:\WINDOWS>

这里可以有人告诉我,为什么要存入是BX:CX代表程序长度吗?(写信给译者,谢谢)

返回目录

8) 现在,我们试一试查看一个已经编好的程序:

PROMPT> DEBUG<按回车>(运行DEBUG程序在CS:IP = CS:0100h)
-N printabc.com<按回车> (告诉电脑你想装载的程序名)
-L<按回车> (装载那个名字的程序进入内存)
-U 100 L 10<按回车> (从偏移地址100开始反汇编16位字节)
-R<按回车> (现在看看寄存器里面的内容)
注意:DEBUG本身是没有自动纪录文件大小的。
-G (运行被命名的程序,打印"ABC")
你将看到"ABC",然后是"Program terminated normally")

C:\WINDOWS>DEBUG
-N PRINTABC.COM
-L
-U 100 L 10
12A4:0100 B402 MOV AH,02
12A4:0102 B241 MOV DL,41
12A4:0104 CD21 INT 21
12A4:0106 B242 MOV DL,42
12A4:0108 CD21 INT 21
12A4:010A B243 MOV DL,43
12A4:010C CD21 INT 21
12A4:010E CD20 INT 20
-R
AX=0000 BX=0000 CX=0010 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=12A4 ES=12A4 SS=12A4 CS=12A4 IP=0100 NV UP EI PL NZ NA PO NC
12A4:0100 B402 MOV AH,02
-G
ABC
Program terminated normally

返回目录

2004-5-26 09:45

IceMe
正式会员





积分 170
发贴 305
注册 2004-3-15
来自 紫色星云
状态 离线 9)你可以用DEBUG的计算功能计算程序的长度。

一开始的时候你的程序初始地址是在0100h:
107F:0100 MOV AH,02 <--这就是 100h
你的程序的最后一行在010Eh:
107F:010E INT 20 <--最后一行
然后,最后一条命令的下一行的地址是0110h:
107F:0110 <--这就是110h
所以,从0110h里减去100h我们得到得长度是10h 字节.

PROMPT> DEBUG<按回车>
-H 110 100<按回车> (这条命令将运算110h+100h和110h-100h)
0210 0010<按回车> (汇报 110h-100h=0010h; 16-byte 程序长度16位)
-Q<按回车> (退出DEBUG)


C:\WINDOWS>debug
-H 110 100
0210 0010
-Q

返回目录

10)另一种显示在屏幕上字符串的方法

注意:在你输入数据的时候,按"-"键将会可以让你回退一格。

PROMPT> DEBUG<按回车>
-E 200<按回车> (从偏移地址200开始。输入"Hello,World")
48<按空格>65<按空格> (输入48h (H)和65h (e))
6C<按空格>6C<按空格> (输入6Ch (l)和6Ch (l))
6F<按空格>2C<按空格> (输入6Fh (o)和2Ch (,))
57<按空格>6F<按空格> (输入57h (W)和6Fh (o))
72<按空格>6C<按空格> (输入72h (r)和6Ch (l))
64<按空格>24<按空格> (输入64h (d)和24h ($))
<按回车> ("Hello,World" 已经输入完毕)
-D 200<按回车> (显示你刚刚输入的内容:
48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 ... HELLO,WORLD$...)
-A 100<按回车> (用汇编语言写一个新程序在IP-100h处开始)
MOV AH,09<按回车> (选择DOS的09号功能调用,显示字符串)
MOV DX,0200<按回车> (把输出地址(200h),放进寄存器)
INT 21<按回车> (执行DOS功能调用,显示"Hello,World")
INT 20<按回车> (退出程序回到DOS状态)
<按回车> (结束汇编语言输入,回到DEBUG输入状态)
-G<按回车> (从 CS:IP开始运行程序, 就是从107F:0100h开始执行程序)

现在,我们可以把这个程序保存进一硬盘

-D 100<按回车> (纪录:程序的起始点在100h)
-D 200<按回车> (纪录:程序数据单元的结束点是在020Bh)
-H 20B 100<按回车> (运算 20Bh-100h=10Bh;程序长度267字节)
-R BX<按回车> (检查BX寄存器的值)
:0000<按回车> (设置BX为0000h,程序的长度是BX:CX,实际上你可以把和CX写到一起,即实际长度为:0000010Bh,这样些的目的是使你可以计算更大的程序的长度)
-R CX<按回车> (设置CX 为010Bh, 这就是这个程序的长度了)
:010B<按回车> (现在你可以把这个108字节的程序写入硬盘了)
-N printhw.com<按回车> (将要写入硬盘的程序命名)
-W<按回车> (把这10Bh 即267个字节写入文件)
-Q<按回车> (退出DEBUG)
PROMPT> DIR printhw.com<按回车>
将会汇报程序的长度是267字节(10Bh字节).
PROMPT> printhw.com<按回车>
运行这个程序,这将会在屏幕上显示出"Hello,World" :

C:\WINDOWS>DEBUG
-E 200
127C:0200 2C.48 D5.65 BA.6C FF.6C FF.6F B8.2C 00.57 AE.6F
127C:0208 CD.72 2F.6C 3C.64 00.24 C3.
-D 200
127C:0200 48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 C3 A0 ED E3 Hello,World$
127C:0210 0A C0 74 09 56 57 E8 84-21 5F 5E 73 0A B9 04 01 ..t.VW..!_^s
127C:0220 FC 56 57 F3 A4 5F 5E C3-50 56 33 C9 33 DB AC E8 .VW.._^.PV3.
127C:0230 C3 23 74 19 3C 0D 74 15-F6 C7 20 75 06 3A 06 1E .#t.<.t... u
127C:0240 D4 74 0A 41 3C 22 75 E6-80 F7 20 EB E1 5E 58 C3 .t.A<"u... .
127C:0250 A1 F3 D8 8B 36 F5 D8 C6-06 37 DA 00 C6 06 33 DA ....6....7..
127C:0260 00 8B 36 F5 D8 8B 0E F3-D8 8B D6 E3 42 51 56 5B ..6.........
127C:0270 2B DE 59 03 CB 8B D6 C6-06 D7 DC 00 E3 31 49 AC +.Y.........
-A 100
127C:0100 MOV AH,09
127C:0102 MOV DX,0200
127C:0105 INT 21
127C:0107 INT 20
127C:0109
-G
Hello,World
Program terminated normally
-D200
127C:0200 48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 C3 A0 ED E3 Hello,World$
127C:0210 0A C0 74 09 56 57 E8 84-21 5F 5E 73 0A B9 04 01 ..t.VW..!_^s
127C:0220 FC 56 57 F3 A4 5F 5E C3-50 56 33 C9 33 DB AC E8 .VW.._^.PV3.
127C:0230 C3 23 74 19 3C 0D 74 15-F6 C7 20 75 06 3A 06 1E .#t.<.t... u
127C:0240 D4 74 0A 41 3C 22 75 E6-80 F7 20 EB E1 5E 58 C3 .t.A<"u... .
127C:0250 A1 F3 D8 8B 36 F5 D8 C6-06 37 DA 00 C6 06 33 DA ....6....7..
27C:0260 00 8B 36 F5 D8 8B 0E F3-D8 8B D6 E3 42 51 56 5B ..6.........
127C:0270 2B DE 59 03 CB 8B D6 C6-06 D7 DC 00 E3 31 49 AC +.Y.........
-H 20B 100
030B 010B
-R BX
BX 0000
:
-R CX
CX 0000
:010B
-N PRINTHW.COM
-W
Writing 0010B bytes
-Q
C:\WINDOWS>DIR PRINTHW.COM
Volume in drive C has no label
Volume Serial Number is 28FB-70BA
Directory of C:\WINDOWS
PRINTHW COM 267 03-22-01 11:53 PRINTHW.COM
1 file(s) 267 bytes
0 dir(s) 555,089,920 bytes free

TOP

DEBUG主要命令(五)

11)让我们试一试反复输出:

PROMPT> DEBUG<按回车>
-A 100<按回车> (用汇编语言写一个新的程序,起始地址是100h)
JMP 125<按回车> (从102h接跳到125h)
<按回车> (结束输入汇编命令。译者注:这里是为了例12做准备)
-E 102 'Hello World' 0d 0a '$'<按回车> (把字符串输入内存)
-A 125<按回车> (从125h开始继续编写我们的汇编语言程序)
MOV DX,0102<按回车> (把字符串的首地址(102h)放入DX寄存器)
MOV CX,0005<按回车> (指定这条指令将被显示5次)
MOV AH,09<按回车> (选择DOS的09号功能调用, 显示字符串)
INT 21<按回车> (执行DOS的功能调用, 显示"Hello, World")
DEC CX<按回车> (每次运行到这里CX都减去1)
JCXZ 0134<按回车> (如果计数器CX=0,那么跳到地址0134h)
JMP 012D<按回车> (其他情况下,即CX≠O时跳到012Dh)
INT 20<按回车> (程序退出DOS状态)
<按回车> (结束汇编语言程序输入,回到DEBUG)
-U 100<按回车> (从地址100h 开始反汇编)
-U<按回车> (继续执行反汇编指令,直至你看到INT 20)
-H 0136 100<按回车> (运算程序长度为36h)
-U 100 L 36<按回车> ( 从100h反汇编到136h ,来确认你的计算)
-R BX<按回车> (查看寄存器BX的值)
:0000<按回车> (设置BX为0000h)
-R CX<按回车> (把CX 设置为36h, 这就是程序长度36字节)
:0036<按回车> (现在你可以把这36字节写入文件了)
-N printhw5.com<按回车>(命名我,我们要写入的文件名)
-W<按回车> (把这36字节的内容写进新文件)
-G<按回车> (运行程序,在屏幕上显示"Hello-World ")
-Q<按回车> (退出DEBUG)
PROMPT> DIR printhw5.com<按回车>
将会汇报文件大小为54字节,换算为十六进制就是36h字节
PROMPT> printhw5.com<按回车>
将在屏幕上显示五次"Hello World"

返回目录

12)我们现在把两个程序连接起来。

我们现在把printhw.com做为修补程序 写进printhw5.com, 新版本的printhw5 将先执行原来的printhw.com再执行原来的printhw5.com

PROMPT> COPY printhw5.com printhw5.bak<按回车>
首先,备份printhw5.com,以后可以用于比较
PROMPT> DIR printhw5.com<按回车>
现在,查看到得仍然是以前的54字节(36h 字节)
PROMPT> DEBUG printhw5.com<按回车>
-R<按回车> (现在查看仍然是BX:CX=0000 0036h bytes)
-U 100<按回车> (查看到最后的是 EB 23 (JMP 0125))
-H 100 36<按回车> (最后的指令是在 100h+36h=136h)
-H 136 1<按回车> (下一个可用的存储器位置是136h+1h=137h)
现在你拥有足够的资料,去修补那个程序
-E 110<按回车> (把"Hello,World"输入内存)
48<按空格>65<按空格> (输入48h (H)和65h (e))
6C<按空格>6C<按空格> (输入6Ch (l)和6Ch (l))
6F<按空格>2C<按空格> (输入6Fh (o)和2Ch (,))
57<按空格>6F<按空格> (输入57h (W)和6Fh (o))
72<按空格>6C<按空格> (输入72h (r)和6Ch (l))
64<按空格>24<按空格> (输入64h (d)和24h ($))
<按回车> (停止输入"Hello,World")
-D 110<按回车> (显示更才输入内存的数据:
48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 ...HELLO,WORLD$...)
-A 100<按回车> (在IP地址的(100h)开始夺取原来的程序的控制权,原来这里是"JMP 125")
JMP 137<按回车> (代替原来运行的程序首先运行我们现在的修补程序)
<按回车> (结束汇编命令输入,回到DEBUG命令输入)
-A 137<按回车> (在下面的可用通奸编译这个修补程序)
MOV AH,09<按回车> (选择DOS的09号功能调用,显示输出)
MOV DX,110<按回车> (把我们要输出的字段的首地址(110h)给DX寄存器)
INT 21<按回车> (执行DOS 的功能调用,显示"Hello,World")
JMP 0125<按回车> (这里用跳转到原程序来代替退出到DOS命令(INT 20))
<按回车> (结束汇编命令输入,回到DEBUG命令输入)

-U 125<按回车> (确认一下源程序没有被我们误改了,如果无改了就马上退出DEBUG重新来过)
-U 100 L 1<按回车> (确认已经使程序跳转到我们的修补程序地址137h)
-D 110 L C<按回车> (确认数据区已经有了我们想要的数据)
-U 137<按回车> (确认我们的新程序已经输入了)

现在我们可以把这个小程序存入硬盘了:
(注意:在现在整个程序的最后一条命令"JMP 0125" 的后面一条的地址是0140h)
-H 0140h 100<按回车> (计算140h-100h=40h; 答案是我们现在有一个长度为64字节的小程序)
-RBX<按回车> (检查BX寄存器的值是否为"0")
:<按回车> (如果BX是0000h那么就不需要改动啦)
-RCX<按回车> (要把CX改为40h。这是我们的程序的长度)
:40<按回车> (现在你可以把这0000:0040h个字节的小程序放入硬盘啦)
-W<按回车> (覆盖我们的原程序)
-G<按回车> (尝试运行我们的新程序)
-Q<按回车> (退出DEBUG回到DOS)

PROMPT> DIR printhw5.com<按回车>
现在你再看就发现文章大小不再是54字节, 变成了64字节.
PROMPT> printhw5.com<按回车>
现在是首先在屏幕上打印 "Hello,World"一次,然后再打印"Hello,World" 5 次(译者注:这里其实可以在编程的时候换一换内容试一试.

返回目录

13) 让我们逐步运行这个刚刚修补的程序:

PROMPT> DEBUG printhw5.com<按回车>
-R<按回车> (第1步:地址0100h内容是 EB35 "JMP 0137")
-T<按回车> (第2步:地址0137h内容是B409 "MOV AH,09")
-T<按回车> (第3步:地址0139h内容是BA1001 "MOV DX,0110")
-T<按回车> (第4步:地址0139h内容是CD21 "INT 21")
-P<按回车> (运行第5:"Hello,World"地址013Eh内容是EBE5 "JMP 0125")
-T<按回车> (到这里控制权已经回到了原程序)
如果你想的话,你可以一步一步的执行完全部程序;方法就是一直按"T",直至到达下一个功能调用运行完成后。到那时按一个"P"就可以继续按"T".

返回目录

14)如果一开始的命令不是跳转命令,那么可能就要用这种方法了:

例如:如果我们想叫程序printhw 先打印"ABC",就要获取控制权了。然后打印"ABC"的程序把控制权给回原来的printhw.

在这个事例里 ,printhw在100h的地址有两字节的程序;
不能象上面那样简单的替代(一个JMP代替另一个JMP)就完事。
解决办法就是使用NOP命令。


PROMPT> DIR printhw.com<按回车>
将汇报程序的长度为267字节(10Bh 字节).

PROMPT> DEBUG printhw.com<按回车>
-R<按回车> (IP=100h 并且printhw's 的文件大小=BX:CX=0000:010Bh)
-U 100<按回车> (第一条指令B4 09 (MOV AH,09)是两个字节的)
(第二条命令是三个字节的 BA 00 02 (MOV DX,0200))
-H 100 10B<按回车> (最后一条printhw的指令是在100h+10Bh=20Bh)
(DOS的INT 21功能调用是在105h开始的)
现在你有足够的资料输入你的程序了!
-A 100<按回车> (要在printhw 的IP开始位置就夺取程序的控制权)
JMP 20B<按回车> (跳到20Bh增加一个程序)
NOP<按回车> (用空指令填充直至你去到下一条完整的指令)
NOP<按回车> (你可以用它来覆盖你不想只执行的原程序命令 ,而不改变原来的地址。但是在这里我们只需要两个NOP)
译者注:为了使大家更加明白所以我将各条命令对应的机械命令的长度写在下面
B409 MOV AH,09
BA0002 MOV DX,0200
E90301 JMP 020B
90 NOP
这样我们就很清楚的看到JMP 020B的长度比MOV AH,09多了1个字节,但是MOV DX,0200有是3个字节,而NOP是空指令,是不执行任何操作的,它只是占1个字节。所以我们现在把前两条指令用一个JMP 020B和两个NOP代替。后面再加上去。
<按回车> (结束汇编命令回到DEBUG命令输入)
-U 100<按回车> (看一看前面我们做了些什么)
(注意DOS INT 21中断任然是在 IP=105h的地方开始)
-A 20B<按回车> (现在把我们的原程序写在后面)
MOV AH,02<按回车> (选择DOS 的 2号功能调用, 字符显示输出)
MOV DL,41<按回车> (在DL寄存器存入"A"的ASCII码41h)
INT 21<按回车> (执行DOS 的功能调用,显示字符"A")
MOV DL,42<按回车> (在DL寄存器存入"B"的ASCII码42h)
INT 21<按回车> (执行DOS 的功能调用,显示字符"B")
MOV DL,43<按回车> (在DL寄存器存入"C"的ASCII码43h)
INT 21<按回车> (执行DOS 的功能调用,显示字符"C")
MOV AH,09<按回车> (现在重新输入原来在100h的程序指令)
MOV DX,0200<按回车> (现在要打扫寄存器了,还原原来的200h的值)
JMP 105<按回车> (跳到INT 21指令的位置105h)
<按回车> (请注意一下你这里最后的地址是0221h)
-H 221 100<按回车> (计算221h-100h=121h 就是289字节的程序)
-R CX<按回车> (把CX的值设为121h, 这就设定了程序的新长度)
:0121<按回车> (现在用121h (也就是289字节)覆盖原值)
-W<按回车> (把这289个字节写回原程序)
-Q<按回车> (退出DEBUG)

PROMPT> DIR printhw.com<按回车>
现在在看就会是新程序的长度289字节而不是,267字节)
现在在屏幕上先出现"ABC"再出现"Hello,World"

TOP

§2.2 DOS初步

重点及难点分析:掌握DOS的常用命令的灵活使用。

2. DOS是单用户、单任务的磁盘操作系统,WINDOWS是多任务、用于管理微机的各种软、硬件资源。

§2.2.1 DOS磁盘文件、目录与路径

重点及难点分析:掌握文件、目录与路径的概念。

1.文件:掌握文件的概念,详见P22。

2.文件名的组成:掌握文件名的组成,详见P22。

3.目录:掌握文件的概念,详见P22。

4.路径:掌握绝对路径与相对的区别,详见P22。

练 习 题:

⒈文件名由主文件名和两部分组成,两者之间需用圆点“.”隔开。

⒉在DOS中,文件是以 结构存储在磁盘上。

⒊从根目录起寻找文件,这种路径叫 ,否则是从当前目录开始寻找文件,这种路径称为 。

§2.2.2 DOS命令

1.DOS命令分两种:内部命令和外部命令,掌握两种命令的区别。

2.DOS命令的使用:

⑴盘符及转换磁盘操作:(内部命令)

①A:\>D:

②C:\>A:

③C:\>D:

④C:\>F:

按回车键后,屏幕显示:

Invalid drive specification 表示指定了无效的驱动器标识符。

⑵建立子目录命令MKDIR(MD)

①命令格式:MKDIR [D:] [PATH]〈子目录名〉或 MD [D:] [PATH]〈子目录名〉

②C:\>MD STUDENT

③C:\>MD STUDENT\STUDENT

④C:\STUDENT>MD TEACHER

⑤A:\>MD BOY

⑥A:\>MD BOY\888

①②③④⑤⑥⑦⑧

①②③④⑤⑥⑦⑧

⑶显示文件目录命令DIR

①C:\>DIR

②A:\>DIR

③C:\>DIR/S/W

④D:\>DIR C:\/S/W/P

⑤C:\WINDOWS>DIR D:\/S

⑥C:\WINDOWS>DIR D:\/W

⑦ D:\>DIR C:\WINDOWS/S/P

⑷改变当前目录命令CHDIR(CD)

①命令格式: CHDIR [D:] [PATH]或CD [D:] [PATH]

②C:\>CD WINDOWS

③C:\>CD WINDOWS\SYSTEM

④C:\WINDOWS\SYSTEM>CD..

C:\WINDOWS>

⑤C:\WINDOWS\SYSTEM\COMMAND>CD\

C:\>

⑥C:\WINDOWS\SYSTEM>CD

C:\WINDOWS\SYSTEM>

⑸删除子目录命令RMDIR(RD)

①RMDIR [D:][PATH] 〈子目录名〉或RD [D:][PATH] 〈子目录名〉

②注意:一.根目录不能删除.

二.必须保证该目录为空,即该目录下没有任何文件和子目录.

三.当前目录下不能删除当前目录.

③C:\>RD C:\ (错误)

④A:\>RD A:\ (错误)

⑤C\:STUDENT>DEL *.*

C:\>RD STUDENT

⑥C:\WINDOWS>RD WINDOWS (错误)

⑦D:\>RD C:\STUDENT

⑧A:\>RD C:\STUDENT

①②③④⑤⑥⑦⑧⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆

①②③④⑤⑥⑦⑧

①②③④⑤⑥⑦⑧

⑹删除子目录及其文件命令DELTREE

2 命令格式: DELTREE [D:] [PATH] <子目录名>

3 C:\WINDOWS\COMMAND>DELTREE AB

③C:\DOS>DELTREE A:\888\999

⑺文件拷贝命令COPY

①命令格式: COPY [D:] [PATH] <filename.ext1> [D:] [PATH] <filename.ext2>

②注意: I .filename.ext1:待拷贝的源文件名,它前面是该文件的盘符和路径.

II . filename.ext2:复制的目标文件名字,它是可选项.

COPY命令可以写成以下3种常用格式:

A:命令格式: COPY [PATH1] <filename.ext1> D: [PATH2] <filename.ext2>

I .C:\DOS>COPY COMMAND.COM A:\

II .A:\>COPY *.* C:\

III .C:\>COPY *.COM D:\

B. 命令格式: COPY [PATH1] <filename.ext1> D: [PATH2] <filename.ext2>

filename.ext2:复制的目标文件名字,它是可选项.

①C:\DOS>COPY *.COM D:\*.EXE

②A:|>COPY 568.* C:\888.*

C:文件合并命令:

A:命令格式: COPY D: [PATH1] <文件名>+ D: [PATH2] <文件名> D:[PATH3]<文件名>

注意: D: [PATH3] <文件名 >是可选项

①C:\>COPY A:\1.TXT+C:\2.TXT+D:\3.TXT D:\4.TXT

②C:\>COPY A:\1.TXT+C:\2.TXT+D:\3.TXT

⑻文件易名命令RENAME(REN)

命令格式: RENAME [d:][PATH] <oldname.ext> <newname.ext>

注意:目标文件名前不允许带盘符和路径.

①C:\>REN A:\KEYCAI\*.DAT A:\KEYCAI\*.TXT(错误)

②C:\>REN A:\KEYCAI\*.DAT c:\CAI\*.TXT(错误)

③C:\>REN A:\KEYCAI\*.DAT *.TXT

④A:\>REN A:\KEYCAI\*.DAT *.TXT

⑼删除文件ERASE(DEL)

命令格式: DEL [d:][PATH] <filename.ext>

①C:\>DEL *.COM

②C:\>DEL C:\TY\TT\*.COM

③C:\>DEL A:\KV300\KV300.COM

④C:\>DEL D:\WINDWOWS\ *.EXE

⑤C:\>DEL *.*

⑽显示文本文件内容命令TYPE

命令格式: TYPE [d:][PATH] <filename.ext>

注意:每次只能显示一个文本文件.

①C:\>TYPE C:\TT\A.BAT

②C:\>TYPE C:\TY\TT\568.TXT

③C:\>TYPE C:\TY\TT\*.COM(错误)

④D: \>TYPE C:\WINDWOS\*.*(错误)

⑤C:\>TYPE A:\YES.EXE(错误)

⑾清屏命令CLS

①C:\>CLS

②A:\TT>CLS

③D:\>CLS

⑿显示DOS版本号命令VER

①C:\>VER

②A:\8898>VER

练 习 题:

⒈删除文件的命令是 ,显示当前目录的命令是 。

⒉将文件1.TXT、2.TXT、3.TXT、4.TXT合并成5.TXT命令是 .

⒊磁盘上的文件以 型结构存在于磁盘上。

⒋有如下目录树:

C:\ TA

TB TC 2.TXT

1.TXT

写出如何清除目录TB的命令.

⒌ 路径是从当前目录开始但不包括当前目录.

TOP

dos未公开的命令与参数

dos系统中有许多未公开的命令与参数。我经过收集整理,发现了很多。由于dos的有好几种,所以下面仅以ms-dos为例,介绍一下常用命令中的未公开的命令与参数。经过比较,我发现在ms-dos的各版本中,7.x版中的未公开命令与参数是最多的,这些7.x版本中的未公开命令与参数在其它dos版本中通常是没有的,但却是非常实用的,例如command /z命令,这是用dos自带的命令显示errorlevel(错误返回代码)值的唯一方法(当然,用其它的附加工具,如err2env等也可以做到)。

dos未公开命令:

truename:用于显示实际的路径,对subst等命令很有用。
installhigh:用在config.sys中,将文件调入umb。
logo和comment:仅用在dos7中的config.sys中,用法未知。

dos未公开参数:

command /f 使fail作为abort,retry,fail中的默认选项。
command /d 在dos5中是禁止autoexec.bat自动执行;在6.0+版本中是禁止/f参数。
command /z 显示errorlevel(错误返回代码)信息。
command /t 在dos7.x中强制将command.com永久性调入常规内存。

format /autotest 自动完成格式化过程。
format /backup 自动完成格式化过程,并提示输入卷标。
format /select 只在磁盘上备份系统区数据,相当于mirror程序。
format /select /u 将引导区和文件分配表用f6h填之。
format /z:n 设置fat32分区上的簇大小。

fdisk /mbr 重写硬盘主引导记录。
fdisk /cmbr drive 重写指定驱动器上的主引导记录。
fdisk /pri:size 创建主分区。
fdisk /ext:size 创建扩展分区。
fdisk /log:size 在扩展分区上创建逻辑驱动器。
fdisk /prmt|/q 提示行动/安静模式。
fdisk /partn 将分区表信息保存到partsav.fil中。
fdisk /actok 用于dos7中,跳过完整性测试。
fdisk /fprmt 用于dos7中,自动采用fat32,并跳过提示信息。

doskey /appedit 使doskey也应用于其它程序(如debug等)中。
doskey /command和/permanent和/scrsize和/xhistory 用法未知。

scandisk /clip 用于dos7中,将长文件名剪为短文件名。
scandisk /nolost 用于dos7中,不提示表面测试或丢失簇。
scandisk /noui和/text 用于dos7中,使用标准的dos界面。
scandisk /mount 相当于scandisk.ini中的mount=always。
scandisk /time 相当于scandisk.ini中的scantimeout=on。

qbasic /qhelp 进入dos6的全屏幕帮助系统,相当于执行help命令。
qbasic /edcom 进入dos6的文件编辑器,相当于执行edit命令。

mem /a或mem /all 显示hma信息。

ver /r 显示扩展的版本信息。

dir /z 用于dos7中,表示不显示长文件名。

dos=single 用在dos7中的config.sys中,启动单一模式的dos。

device=himem.sys /q 当himem.sys加载时使用安静模式。

device=emm386.exe notr 不要检测token ring网络适配器。

dos未公开用法:

if exist xmmxxxx0 ... 此命令可以判断当前是否安装了himem.sys驱动程序。
if exist emmxxxx0 ... 此命令则用来判断当前是否安装了emm386驱动程序。

dir , 用在dos7以前的版中中,显示所有文件,相当于dir /a。

:: 此符号可在批处理文件中代替rem注解命令,可以加快运行速度。

以上是ms-dos中的未公开命令与参数,其中有些是非常实用的,大家不妨一试。

TOP

Java常见问题集锦(二)

问:用JDK实现的签名applet,可否在Netscape或IE中运行?

答:用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行.不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行.如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行.

问:用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?
答:

如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台):
编写调用C库的Java文件,并编译.
javac java文件名
产生C程序头文件
javah -jni java文件名(不带后缀.java)
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译.
cc -G -Iinclude路径名 C2.c -o libC2.so
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so
设置环境变量
setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径
{;LD_LIBRARY_PATH};
运行java应用

问:在Java语言中,如何列出PC机文件系统中的所有驱动器名?

答:在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.

问:为什么Runtime.exec("ls")没有任何输出?

答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:
try
{;
process = Runtime.getRuntime().exec (command);
InputStreamReader ir=newInputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
String line;
while ((line = input.readLine ()) != null)
System.out.println(line);
};
catch (java.io.IOException e){;
System.err.println ("IOException " + e.getMessage());
};

问:如何产生签名applet,以使applet能够访问本地资源?

答:在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:
//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中
keytool -genkey -alias joe -keypass sign12 -keystore joestore
//将SignedApplet.class及相关文件打包成jar文件
jar cvf SignedAppletDemo.jar
//利用keytool生成的自签名的证书产生签名applet(jar文件)
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe
//将自签名证书从keystore中输出到文件
keytool -export -keystore joestore -alias joe -file joe.cer
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行
Joe编写的签名applet:
//得到Joe的证书并将之读入到密钥库中susanstore中
keytool -import -alias joe -file joe.cer -keystore susanstore
//运行policytool产生满足Susan要求的policy文件
policytool
//用appletviewer运行之,或在浏览器中安装java plugin来运行之.
关于签名applet在Java Plugin中的部署请参考以下网页:
http://java.sun.com/security/signExample12/
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以
使用keytool -certreq向商业CA中心申请电子证书.

问:若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?

答:使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.

问:对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?

答:目前,没有直接的方法可以将对象写入到随机存取文件中.但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.

问:运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?

答:可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.

问:使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性?

答:使用如下方法可以获得PrintJob的实例用于控制打印操作:
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:
awt.print.destination: 可以是"printer"或"file"
awt.print.printer: 打印机名
awt.print.fileName: 打印文件名
awt.print.numCopies: 打印份数
awt.print.options: 打印命令的打印选项
awt.print.orientation: 打印方向,可以是"portrait"或"landscape"
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4"

问:在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?

答:Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.

问:使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?

答:在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括:
ResultSet.first():将数据指针移到结果集的第一行
ResultSet.last(): 将数据指针移到结果集的最后一行
ResultSet.previous(): 将数据指针上移一行
以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .

问:哪几种Web Server支持Servlet?如何使IIS支持Servlet?

答:目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.
此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等.

问:如何在Java应用中将图像存储到图像文件中?

答:Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码:
OutputStream os = new FileOutputStream(fileToWriteTo);
BMPEncodeParam param = new BMPEncodeParam();
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);
enc.encode(img);
os.close();
有关存储图像文件的编程指南请参考以下网页:
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/

问:如何用Java语言向串口读写数据? font>

答:Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制.

TOP

发新话题