11

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

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

如果我想涉猎,我会怎么做呢?我对需要什么一无所知,尽管大概是某种编译器和记事本。

纯粹出于好奇,我需要什么来写一个“Hello World!” 应用?

编辑添加,我运行的是 Windows 7 64bit

编辑添加,不知Visual Studio有没有汇编语言插件?

4

4 回答 4

7

为此,编写 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 个小到足以容纳的参数进入寄存器。

于 2010-04-16T14:55:28.477 回答
2

看看WinAsm

于 2010-04-16T14:51:13.677 回答
1

我建议你找到一个支持 Intel 风格 ASM 的工具,而不是 AT&T 可怕的语法。

于 2010-04-16T15:07:05.490 回答
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   
于 2010-04-16T15:08:39.333 回答