世界编程大赛第一名作品解读

这个作品的程序在博客中很早就发过了,原文请移步这里:

世界编程大赛第一名写的程序http://hi.baidu.com/hacklzt/blog/item/70c1cdcfa875580492457eaa.html

下面解读一下该代码的大致原理:

其实他是用机器语言写的,除了结尾,主程序中都是 0-f 组成,也就是 16 进制数,
大家可以看到程序左边竖着一列都是以 e 开头的,如 e 100 ,
e 是 debug 的一个命令,是写入内存的意思,100 是偏移地址
在这里他没有给出基址,也就是取默认的ds中的值。
以第一行为例:e100后面的33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1
每一组16进制数代表着特定的意义,如 mov bx 2200H 的机器指令是 BB0022
每一组占一个字节,大家数一数,第一行有多少字节,对是27个字节,
所以第二行的起始地址是 11b,以此类推。
至于具体的每一句的意思,大家有了一定的汇编语言经验,就会知道了,
因为在DOS中用debug命令可以看到汇编指令对应的机器指令,
如刚才说的mov bx 2200H 的机器指令是 BB0022

再说程序最后,
g
rcx
fff
n1.com
w
q

g是debug的命令,执行代码的意思,如果没有g,则command只将程序读入内存,而不执行,
rcx也是debug 的命令,rcx fff意思是修改cx的内容为fff。
注意不要把n1.com看成一个文件名,其实 n 是debug的一个命令,1.com 才是文件名,
n的意思是指定 Debug l(加载)或 w(写入)命令的可执行文件的名称,或者指定正在调试的可执行文件的参数。
q是degug的命令,退出的意思,
用debug命令的U命令就可。你可以看到上面每一句机器码与汇编指令的对应关系还有内存位置。