請找出或寫出體積最小的Windows可執行程式,要求:
此程式必須「效果上」等價於以下C程式碼編譯出的程式,換言之,向STDOUT輸出 "Hello, world!\n" 十四個位元組:
#include <stdio.h>
int main() { printf("Hello, world!\n"); return 0; }
必須是單個合法的Windows x86 32或64位PE可執行檔案(.exe)必須能在沒有裝第三方軟體的Windows上正常執行檔案大小以 .exe的大小為準
回覆列表
-
1 # i家保
-
2 # TonyDeng
這個問題暴露題主不明白程式的大小是怎麼回事。C語言的原始碼短,並不等於它的程式也小,你肯定不知道C庫的printf()函式有多巨型和低效(低效處是帶了文字語法分析和資料轉換,實際上是一個微型解釋語言功能函式),而僅僅輸出一個字串是不需要使用這個函式的。這段標準C程式縱然在DOS下也要2-3k的可執行程式碼,你無法想象輸出一個字串要這麼多的程式碼幹嘛!哪怕把原始碼改一下用puts(),也比用printf()版本縮小許多。
那麼現實中C程式大量使用printf()和scanf()函式速度也槓槓的是怎麼回事呢?首先這是對較大規模的程式而言其效率影響可算忽略,其次這些函式實際上是嵌入在作業系統核心中實現的專用共享程式碼,不同的商家發行的編譯器是針對平臺特製的,C語言只在原始碼上看起來可以跨平臺,但真跨平臺時是需要用對應目標平臺的編譯器重新編譯和連結的,因為目的碼級別上根本不能跨平臺——甚至在原始碼上也不能真正的跨平臺,光是整數尺寸就夠要讓你跨平臺夢想破滅了。現在所謂的跨平臺程式語言,之所以都是偽編譯模式就是這個道理,是不同平臺和裝置帶有可以執行你程式的環境,不是什麼Java語言真的跨平臺。
給你一個xp/DOS下的最小程式,284位元組足矣。原理是dos中斷,設定DS:DX為字串首址,AH為功能號9,再呼叫系統21號中斷即可顯示字串。系統自帶Debug程式,無需安裝任何三方程式設計軟體,N年前玩過,回憶一下而已。生成的程式是COM,如果是exe的話,不借助程式設計軟體的話,只能手寫彙編碼,碼二進位制唯一的方法就是用VBS輸出二進位制到檔案,先碼一個PE頭,找到msvcrt庫中的printf函式基址(固定的),push字串的地址,call一下基址即可,這裡就不寫了。exe要求4k對齊,理論上最小大小就是4k