このため、64 ビット コードを記述しても何も得られません。32 ビット コードに固執することもできます。
MessageBox への出力が必要な場合は、次のようになります。
.386
.MODEL flat, stdcall
MessageBoxA PROTO near32 stdcall, window:dword, text:near32,
windowtitle:near32, style:dword
.stack 8192
.data
message db "Hello World!", 0
windowtitle db "Win32 Hello World.", 0
.code
main proc
invoke MessageBoxA, 0, near32 ptr message, near32 ptr windowtitle, 0
ret
main endp
end main
コンソールへの出力が必要な場合は、(奇妙なことに) もう少し複雑です。
.386
.MODEL flat, stdcall
getstdout = -11
WriteFile PROTO NEAR32 stdcall, \
handle:dword, \
buffer:ptr byte, \
bytes:dword, \
written: ptr dword, \
overlapped: ptr byte
GetStdHandle PROTO NEAR32, device:dword
ExitProcess PROTO NEAR32, exitcode:dword
.stack 8192
.data
message db "Hello World!"
msg_size equ $ - offset message
.data?
written dd ?
.code
main proc
invoke GetStdHandle, getstdout
invoke WriteFile, \
eax, \
offset message, \
msg_size, \
offset written, \
0
invoke ExitProcess, 0
main endp
end main
理論的には、64 ビット コードに移行しても大きな違いはありません。たとえば、両方で同じ関数を使用できます。実際には、64 ビット コードの呼び出し規則はやや複雑であり、MASMinvoke
を 64 ビット コードに使用できないため、少し面倒です。作業コードはそれほど複雑ではありませんが、コードを機能させるのはおそらくもう少し手間がかかります。一般的な考え方は、64 ビット コードの場合、すべてのパラメーターに対してスタックにスペースを割り当てますが、収まるほど小さい最初の N 個のパラメーターはレジスターに格納されます。