Вывод Hello World в MASM с использованием функций WIN32

содержание

  1. вступление
  2. Код
  3. Сборка и запуск
  4. Разнообразный
  5. Вопрос

1. Введение

Это не вопрос как таковой (хотя он и есть внизу), а приложение HelloWorld, с которым люди в Stackru могут экспериментировать.

Когда я впервые пытался программировать на MASM, я пытался найти работающее приложение HelloWorld, которое использовало вызовы API WIN32 (поэтому не связывались с библиотеками C), но не смогло найти ни одного (в синтаксисе MASM). Итак, теперь, когда у меня есть некоторый опыт, я написал один для других, желающих научиться играть на ассемблере.

2. Код

.386 ; 386 Processor Instruction Set

.model flat,stdcall ; Flat memory model and stdcall method

option casemap:none ; Case Sensitive

;Libaries and Include files used in this project

; Windows.inc defines alias (such as NULL and STD_OUTPUT_HANDLE in this code
include \masm32\include\windows.inc 

; Functions that we use (GetStdHandle, WriteConsole, and ExitProcess)
; Listing of all available functions in kernel32.lib
include \masm32\include\kernel32.inc 
; Actuall byte code available of the functions
includelib \masm32\lib\kernel32.lib  

.data
; Labels that with the allocated data (in this case Hello World!...) that are aliases to memory.
output db "Hello World!", 0ah, 0h; This String Hello World! and then a the newline character \n (0ah) and then the null character 0h

.code 
start: 

; --------------------------------------------------------------------------------------------------------------------------------------
; Retrieves that handle to the output console
;
; ====Arguments===
;
; STD_OUTPUT_HANDLE - alias for -11 and indicates that we want the handle to 
;                     write to console output
;
invoke GetStdHandle, STD_OUTPUT_HANDLE
; --------------------------------------------------------------------------------------------------------------------------------------

; --------------------------------------------------------------------------------------------------------------------------------------
; Writes the text in output (.data section) to the console
;
; ====Arguments===
;
; eax - the handle to the console buffer
;
; addr output - pass by reference the text of output (Hello World!)
;
; sizeof output - the size of the string so that the WriteConsole knows when to 
;                 stop (doesn't support NULL terminated strings I guess);
;
; ebx - secondary "return" value that contains the number of bytes written (eax
;       is used for an error code)
;
; NULL - this is reserved and MSDN says just to pass NULL
;
; MSDN Link: http://msdn.microsoft.com/en-us/library/ms687401(v=VS.85).aspx
;
invoke WriteConsole, eax, addr output, sizeof output, ebx, NULL
; --------------------------------------------------------------------------------------------------------------------------------------

; --------------------------------------------------------------------------------------------------------------------------------------
; Exits the program with return code 0 (default one that usually is used to 
; indicate that the program did not error
;
; ====Arguments===
;
; 0 - the exit code
;
; MSDN Link: http://msdn.microsoft.com/en-us/library/ms682658(VS.85).aspx
;
invoke ExitProcess, 0
; --------------------------------------------------------------------------------------------------------------------------------------

end start 

3. Сборка и запуск

Я предполагаю, что у вас установлен MASM32 в вашем каталоге C:\MASM32.

  • Если у вас не установлен MASM, перейдите по http://masm32.com/install.htm и следуйте инструкциям.

  • Если MASM32 установлен в другом каталоге, пожалуйста, измените инструкции соответствующим образом.

    1. Откройте редактор MASM32 (QEditor), щелкнув ярлык на рабочем столе или, если ярлык отсутствует, перейдите в C:\MASM32\ и дважды щелкните файл qeditor.exe.

    2. Скопируйте код в разделе кода (только текст с серым фоном), вставьте его в редактор MASM32 (QEditor) и сохраните его.

    3. После сохранения кода нажмите меню "Проект" и выберите "Консоль" Сборка и связывание "(НЕ" Сборка и связывание "(см. Разное)).

    4. Перейдите в START и нажмите Run, затем введите cmd и нажмите ENTER, появится черный ящик с серым текстом.

    5. Перейдите с помощью Проводника к тому месту, где вы сохранили код на шаге 3. Теперь должен быть файл с тем же именем, что и у вашего исходного файла (шаг 3), но должен быть исполняемым. Перетащите exe-файл из окна проводника в окно cmd (шаг 4, черный ящик)

    6. Выберите черный ящик и нажмите ENTER, текст "Hello World!" должен появиться.

4. Разное

Почему я должен щелкнуть Консоль "Собрать и запустить", а не просто "Собрать и запустить" в меню "Проект"?

Причина, по которой вы должны нажать Console Assemble and Run, заключается в том, что есть два типа приложений, есть GUI, а затем приложения для текстовой базовой консоли (DOS). Hello Hello Application является текстовым приложением, поэтому при сборке должны иметь настройки, которые будет иметь консольное приложение, а не GUI.

См. Третий абзац под примечаниями в этой ссылке для более подробного объяснения.

5. Вопрос

Хорошо, теперь вопрос, кто-нибудь здесь видит какие-либо проблемы, ошибки или общие проблемы с этим кодом или есть какие-либо предложения

3 ответа

Решение

Программа в порядке. Это действительно "Hello World" версия Win32. Однако помните, что это консольная программа. В Win32 вы будете в основном иметь дело с Windows, диалоговыми окнами и очень мало с консолью (Incase, вы хотите иметь дело именно с консолью, это другая история).

Если вы хотите использовать Win32 Assembly, я настоятельно рекомендую вам взглянуть на Iczelion Tutorials.

Вот "Hello World", чтобы начать с его учебников:

https://web.archive.org/web/20120709024212/http://win32assembly.online.fr/tut2.html

Этот пример кода проще и понятнее

.386
.model flat, stdcall
option casemap: none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
    szCaption   db  'Hello', 0
    szText      db  'Hello, World!', 0

.code
    start:
            invoke MessageBox, NULL, offset szText, offset szCaption, MB_OK
            invoke ExitProcess, NULL        
    end start

StdOut - консольная функция

Вы можете использовать функцию MessageBox...

.model small,pascal,nearstack
.386
?WINPROLOGUE=1
include win.inc
includelib libw.lib
extern __astart:proc

.data
text sbyte "Hello f*** World!",0
title sbyte "Win",0

.code
WinMain    PROC, hInstance:HANDLE, hPrevInstance:HANDLE, lpszCmdLine:LPSTR, nCmdShow,WORD
  LOCAL msg:MSG

 invoke MessageBox, NULL, addr text, addr title, 0
 invoke PostQuitMessage,0

 .while TRUE
     invoke GetMessage,addr msg,NULL,0,0
     .break .if (ax == 0)
     invoke TranslateMessage,addr msg
     invoke DispatchMessage,addr msg
 .endw
WinMain    ENDP
END        __astart
Другие вопросы по тегам