演習として、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'
これをコンパイルすると、予想よりも大きな実行可能ファイルが得られます。hexdumpは次のとおりです。
コードセクションとデータおよびライブラリインポートセクションの間に多くの空きスペースがあり、コードに「このプログラムはDOSモードで実行できない」というメッセージが埋め込まれていることに気付きました。コードゴルフに適した小さなファイルにソースコードをアセンブルするにはどうすればよいですか?
補足として、stdout
インポートmsvcrt
や呼び出しを行わずに印刷するためのより良い方法の提案をprintf
歓迎します。
@iBugそれを聞いてすみません。私が尋ねるのにより適した場所を提案してもらえますか?
—
vasilescur
特定のケースでゴルフの助けを求める@iBug Tipsの質問は、ここではほとんど間違いありません。
—
AdmBorkBork
start:push char Lb:call [printf] call [printf] call [printf] call [printf] inc [char] cmp [char]、 'Z' jleLb。そうでない場合、スタックを消費する可能性があるため; printfを呼び出すたびに、espを調整する命令を追加する必要があるかどうかを確認する必要があります
—
RosLuP
printfの代わりに、WriteFile(stdout)を使用できます。kernel32以外のインポートは不要です(デフォルトで存在するため、アドレスを決定する必要があります)
—
peter ferrie