2010-04-16 4 views
11

Можно создать дубликат:
how to write hello world in assembler under windows?Как написать приложение «Hello World» на ассемблере?

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

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

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

Изменить, чтобы добавить, я бег Windows 7 64bit

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

+2

Дубликат http://stackoverflow.com/questions/1023593/how-to-write-hello-world-in-assembler-under-windows –

ответ

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

+0

почему написание утешать так сложно? Когда я делал сборку, запись строки была тривиальным вызовом прерывания ... Я думаю, что это было int 10h, но я не могу вспомнить наверняка. Это было как 4 инструкции, не требуя внешних библиотек. – rmeador

+0

@rmeador: длина в основном связана с тем, что они обрабатывают консоль как обычный файл, а WriteFile принимает дополнительные параметры, которые в данном случае нам не очень-то нравятся. Теоретически вы можете использовать 'WriteConsoleOutput' или что-то в этом порядке, но это также нетривиально. –

+0

Это действительно все, что нужно? Я думал, вам придется настраивать множество разделов кода и прочее. Как приложение ASM _Windows_ должно быть намного короче, чем требуется весь код на C++? Это немного больше, чем консоль C++ «Hello Word»! –

0

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

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 
+1

Кажется немного обманом. –

+1

Как вы считаете ? –