一个简单的小题目[无积分或安天币奖励]
这是一个简单但完整的dos/com格式的程序,长度为22个字节,功能为输出“Hello World!”字符串后退出。
运行windows自带的debug.exe,使用“a”命令将这段代码输入,再用“g”命令运行,就能看到输出结果。
也可以将其保存为com格式的程序文件,以后直接运行(其实是在ntvdm下运行),如图。具体方法自行baidu或google吧。
题目是这样的:
1、谁能通过对这段代码的修改,以更短的长度完成同样的功能(要求还是dos/com格式)?短者获胜。
2、谁能通过对这段代码的修改,将整个程序(如下图)全部转为可显示字符(中英文皆可,要求还是dos/com格式)?修改后长度最短且内容最有趣者获胜(内容是否有趣最终由投票决定)。
字符串偏移09正好等于中断的参数……还怎么缩短……
美国某高校以前每年搞一次整数排序的比赛,时间少的获胜。有一次的结果是:
第一名,时间为负3秒,作者精心编码,覆盖了时间值使其溢出;
第二名,1秒不到,作者写了两个程序,第一个排序,并将结果输出到本地一个文件之中;第二个程序读出这个文件,然后将两个程序分别提交;
第三名对编译结果做了各种优化,考虑了评测服务器的CPU结果并为缓存结构等专门设计,最后在10秒左右计算完成——这是组委会的本意。
最后的结果是组委会对第一名和第二名应不应该获奖争论不休……最后比赛不了了之。
我想问的是:在DOS下,先运行一个程序把Hello, world!$写到内存中一个固定位置,然后用int21(ah=09, dx=addr.),算不算? 回复 2# bughouse
思路很有趣!但我相信会有高人出现的。 本帖最后由 bughouse 于 2011-4-13 20:03 编辑
第二题的一个答案(45字节):
X5:!P%ZAP
复制到windows记事本保存再改名无效,记事本在保存时会给文件增加三个字节的不可见头部,用十六进制工具去掉以后才可以运行。
或者直接下载附件试吧。附件hello.com.txt可以看到明文,改名为hello.com可以执行。
我在代码里面嵌入了自己姓名的缩写,O(∩_∩)O哈哈~
反汇编:
回复 4# bughouse
不错,有创意!另外提醒一下,中文也是可以使用的。 正经写就少一个字节。
不需要写这么花。
MOV DX,0108
MOV AH,09
INT 21
RET
第二题的一个答案(45字节):
复制到windows记事本保存再改名无效,记事本在保存时会给文件增加三个 ...
bughouse 发表于 2011-4-13 19:57 http://bbs.antiy.cn/images/common/back.gif
用其他的编辑器比如 editplus 就没有BOM(Byte Order Mark)了。 正经写就少一个字节。
不需要写这么花。
MOV DX,0108
MOV AH,09
INT 21
RET
ceshi 发表于 2011-4-16 15:05 http://bbs.antiy.cn/images/common/back.gif
哈哈,新记录产生了(21个字节),还可以再短么?有木有?——那个OR其实是用来误导大家的。
页:
[1]