如何用汇编语言编写"Hello World"应用程序?

Nib*_*Pig 11 x86 assembly x86-64

可能重复:
如何在windows下的汇编程序中编写hello world?

我经常听说使用神灵语言汇编语言编写的应用程序.我从来没有尝试过,我甚至都不知道该怎么做.

如果我想涉猎,我该怎么做呢?我完全不知道需要什么,虽然可能是某种编译器和记事本.

纯粹出于好奇,我需要写一个"Hello World!" 应用?

编辑添加,我正在运行Windows 7 64位

编辑添加,我想知道是否有Visual Studio的汇编语言插件?

Jer*_*fin 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
Run Code Online (Sandbox Code Playgroud)

如果你想要输出到控制台,它(奇怪的是)有点复杂:

.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
Run Code Online (Sandbox Code Playgroud)

从理论上讲,迁移到64位代码并没有太大区别 - 例如,您可以在两者中使用相同的功能.实际上,它有点痛苦,因为64位代码的调用约定有点复杂,并且您不能将MASM invoke用于64位代码.工作代码不会是一个整体复杂得多,但得到的代码可能工作会更多的工作.一般的想法是,对于64位代码,您在堆栈上为所有参数分配空间,但是前N个参数足够小以适应,进入寄存器.


kgi*_*kis 2

看看WinAsm