11

重複の可能性:
Windows の下でアセンブラーで hello world を記述する方法は?

神々の言語であるアセンブリ言語を使用して作成されたアプリケーションについてよく耳にします。私は試したことはありませんが、それを行う方法についての手がかりさえありません。

手を出したい場合は、どうすればいいですか?おそらくある種のコンパイラとメモ帳ですが、何が必要かについてはまったく知りません。

純粋に好奇心から、「Hello World!」を書くには何が必要でしょうか。応用?

編集して追加します。Windows 7 64ビットを実行しています

編集して追加します。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

AT&Tの恐ろしい構文ではなく、IntelスタイルのASMをサポートするツールを見つけることをお勧めします。

于 2010-04-16T15:07:05.490 に答える
1

ファズム

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 に答える