创意安天

 找回密码
 注册创意安天

一个简单的小题目[无积分或安天币奖励]

  [复制链接]
发表于 2011-4-13 10:32 | 显示全部楼层 |阅读模式
2.jpg
这是一个简单但完整的dos/com格式的程序,长度为22个字节,功能为输出“Hello World!”字符串后退出。
运行windows自带的debug.exe,使用“a”命令将这段代码输入,再用“g”命令运行,就能看到输出结果。
也可以将其保存为com格式的程序文件,以后直接运行(其实是在ntvdm下运行),如图 out.jpg 。具体方法自行baidu或google吧。
题目是这样的:
1、谁能通过对这段代码的修改,以更短的长度完成同样的功能(要求还是dos/com格式)?短者获胜。
2、谁能通过对这段代码的修改,将整个程序(如下图)全部转为可显示字符(中英文皆可,要求还是dos/com格式)?修改后长度最短且内容最有趣者获胜(内容是否有趣最终由投票决定)。

21.jpg

hello.zip

140 Bytes, 下载次数: 754

发表于 2011-4-13 14:27 | 显示全部楼层
字符串偏移09正好等于中断的参数……还怎么缩短……

美国某高校以前每年搞一次整数排序的比赛,时间少的获胜。有一次的结果是:
第一名,时间为负3秒,作者精心编码,覆盖了时间值使其溢出;
第二名,1秒不到,作者写了两个程序,第一个排序,并将结果输出到本地一个文件之中;第二个程序读出这个文件,然后将两个程序分别提交;
第三名对编译结果做了各种优化,考虑了评测服务器的CPU结果并为缓存结构等专门设计,最后在10秒左右计算完成——这是组委会的本意。
最后的结果是组委会对第一名和第二名应不应该获奖争论不休……最后比赛不了了之。

我想问的是:在DOS下,先运行一个程序把Hello, world!$写到内存中一个固定位置,然后用int21(ah=09, dx=addr.),算不算?
 楼主| 发表于 2011-4-13 15:31 | 显示全部楼层
回复 2# bughouse


    思路很有趣!但我相信会有高人出现的。
发表于 2011-4-13 19:57 | 显示全部楼层
本帖最后由 bughouse 于 2011-4-13 20:03 编辑

第二题的一个答案(45字节):

  1. X5:!P%ZAP[4:PZX5A(P^)7CC)7H+H*XZHello world!$
复制代码


复制到windows记事本保存再改名无效,记事本在保存时会给文件增加三个字节的不可见头部,用十六进制工具去掉以后才可以运行。
或者直接下载附件试吧。附件hello.com.txt可以看到明文,改名为hello.com可以执行。

我在代码里面嵌入了自己姓名的缩写,O(∩_∩)O哈哈~

反汇编:
hello.jpg

hello.zip (380 Bytes, 下载次数: 729)
 楼主| 发表于 2011-4-13 20:50 | 显示全部楼层
回复 4# bughouse


    不错,有创意!另外提醒一下,中文也是可以使用的。
发表于 2011-4-16 15:05 | 显示全部楼层
正经写就少一个字节。
不需要写这么花。

MOV     DX,0108
MOV     AH,09
INT     21
RET

h.zip (165 Bytes, 下载次数: 709)
发表于 2011-4-16 15:22 | 显示全部楼层
第二题的一个答案(45字节):



复制到windows记事本保存再改名无效,记事本在保存时会给文件增加三个 ...
bughouse 发表于 2011-4-13 19:57



   

用其他的编辑器比如 editplus 就没有BOM(Byte Order Mark)了。
 楼主| 发表于 2011-4-16 23:43 | 显示全部楼层
正经写就少一个字节。
不需要写这么花。

MOV     DX,0108
MOV     AH,09
INT     21
RET
ceshi 发表于 2011-4-16 15:05



    哈哈,新记录产生了(21个字节),还可以再短么?有木有?——那个OR其实是用来误导大家的。
您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

小黑屋|手机版|Archiver|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2024-3-28 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表