作为练习,我使用x86汇编语言创建了一个简单的解决方案来应对这一挑战。我正在Windows上使用FASM运行它。这是我的源代码:
format PE console
entry start
include 'WIN32A.inc'
section '.text' code executable
start:
push char ; Start at 'A'
call [printf] ; Print the current letter 4 times
call [printf]
call [printf]
call [printf]
inc [char] ; Increment the letter
cmp [char], 'Z' ; Compare to 'Z'
jle start ; char <= 'Z' --> goto start
section 'r.data' data readable writeable
char db 'A', 10, 0 ; Stores the current letter
section '.idata' data readable import
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf'
当我编译它时,我得到的可执行文件比我预期的要大。这是一个十六进制转储:
我注意到代码部分与数据和库导入部分之间有很多空白,并且在代码中嵌入了一条消息:“此程序无法在DOS模式下运行”。如何将源代码汇编成一个适合Code Golf的小文件?
作为附带说明,欢迎提出更好的打印方法stdout
而无需导入msvcrt
和调用printf
的建议。
@iBug很抱歉听到这个消息。您能给我一个更合适的地方吗?
—
vasilescur
@iBug提示在特定情况下,寻求高尔夫帮助的问题在这里绝对不是题外话。
—
AdmBorkBork
它必须是:开始:push char Lb:调用[printf]调用[printf]调用[printf]调用[printf] inc [char] cmp [char],'Z'jle Lb,因为如果没有,可能会消耗堆栈; 必须查看是否每次调用printf都必须添加调整esp的指令
—
RosLuP
代替了printf,你可以的WriteFile(标准输出),需要不超过KERNEL32等进口(这是目前在默认情况下,你只需要确定地址)
—
彼得·费利