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

Содержание

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

1. Введение

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

Когда я впервые пробовал программировать в 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. пожалуйста, перейдите к http://masm32.com/install.htm и следуйте инструкциям.

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

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

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

    3. После сохранения кода щелкните меню Project и выберите Console Assemble and Link ( NOT Assemble и ссылку (см. Разное))

    4. Перейдите в ПУСК и нажмите «Выполнить», затем введите cmd и нажмите ENTER. Должно появиться черное поле с серым текстом.

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

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

  • 4. Разное

    Почему мне нужно нажимать «Сборка и запуск консоли», а не только «Сборка и запуск» в меню проекта?

    Причина, по которой вы должны нажимать «Сборка и запуск консоли», заключается в том, что существует два типа приложений, есть графические интерфейсы а также есть приложения для текстовой консоли (DOS). Приложение Hello Have основано на тексте, поэтому при сборке оно должно иметь настройки консольного приложения, а не графического интерфейса.

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

    5. Вопрос

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

    5
    задан rkhb 9 April 2017 в 04:56
    поделиться