Как написать приложение "Hello World" на ассемблере?

Возможный дубликат:
как написать привет мир в ассемблере под окнами?

Я часто слышал о приложениях, написанных с использованием языка богов, языка ассемблера. Я никогда не пробовал, и я даже не знаю, как это сделать.

Если бы я захотел потрогать, как бы мне это сделать? Я абсолютно ничего не знаю о том, что требуется, хотя, вероятно, какой-то компилятор и "Блокнот".

Просто из любопытства, что мне нужно написать "Hello World!" приложение?

Изменить для добавления, я запускаю Windows 7 64bit

Изменить для добавления, интересно, есть ли плагин для ассемблера для Visual Studio?

Ответ 1

Посмотрите WinAsm.

Ответ 2

Для этого вы ничего не получаете, написав 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 параметров, которые достаточно малы для подгонки, входят в регистры.

Ответ 3

В 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   

Ответ 4

Я советую вам найти инструмент, поддерживающий Intel ASM, а не AT & T ужасный синтаксис.