Для этого вы ничего не получаете, написав 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-битного кода несколько сложное, и вы не можете использовать MASM invoke
для 64-битного кода. Рабочий код не будет в целом более сложным, но получение кода работает, вероятно, будет немного больше работы. Общая идея заключается в том, что для 64-битного кода вы выделяете место в стеке для всех ваших параметров, но первые N параметров, которые достаточно малы для подгонки, входят в регистры.
Дубликат http://stackoverflow.com/questions/1023593/how-to-write-hello-world-in-assembler-under-windows –