Ответ 1
Посмотрите WinAsm.
Возможный дубликат:
как написать привет мир в ассемблере под окнами?
Я часто слышал о приложениях, написанных с использованием языка богов, языка ассемблера. Я никогда не пробовал, и я даже не знаю, как это сделать.
Если бы я захотел потрогать, как бы мне это сделать? Я абсолютно ничего не знаю о том, что требуется, хотя, вероятно, какой-то компилятор и "Блокнот".
Просто из любопытства, что мне нужно написать "Hello World!" приложение?
Изменить для добавления, я запускаю Windows 7 64bit
Изменить для добавления, интересно, есть ли плагин для ассемблера для Visual Studio?
Посмотрите WinAsm.
Для этого вы ничего не получаете, написав 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 параметров, которые достаточно малы для подгонки, входят в регистры.
В fasm:
include 'win32axp.inc'
.code
start:
invoke AllocConsole
invoke WriteConsole,<invoke GetStdHandle,STD_OUTPUT_HANDLE>,tex,tex.size,dummy,0
invoke Sleep,-1
.end start
.data
tex TCHAR 'Hello World!'
.size = ($-tex)
dummy rd 1
Я советую вам найти инструмент, поддерживающий Intel ASM, а не AT & T ужасный синтаксис.