我经常听说使用神灵汇编语言编写的应用程序。我从来没有尝试过,我甚至都不知道该怎么做。
如果我想涉猎,我该怎么做呢?我完全不知道需要什么,虽然可能是某种编译器和记事本。
纯粹出于好奇,我需要写一个“Hello World!”应用
编辑添加,我正在运行Windows 7 64位
编辑添加,我想知道是否有Visual Studio的汇编语言插件?
答案 0 :(得分:6)
为此,您只需编写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个参数足够小,可以放入寄存器。
答案 1 :(得分:2)
查看WinAsm。
答案 2 :(得分:1)
在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
答案 3 :(得分:0)
我建议你找一个支持英特尔风格ASM的工具,而不是AT&amp; T糟糕的语法。