Содержание
- Введение
- код
- Сборка и запуск
- Разное
- Вопрос
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.
Если у вас не установлен MASM
пожалуйста, перейдите к
http://masm32.com/install.htm
и следуйте инструкциям.
Если MASM32 установлен в другом
каталог, пожалуйста, измените
инструкции соответственно.
Откройте редактор MASM32 (QEditor), щелкнув ярлык на рабочем столе или, если ярлык отсутствует, перейдите в C: \ MASM32 \ и дважды щелкните qeditor.exe
Скопируйте код в разделе кода (только текст с серым фоном), вставьте его в редактор MASM32 (QEditor) и сохраните его.
После сохранения кода нажмите меню «Проект» и выберите «Сборка и связь консоли» ( НЕ Сборка и связь (см. Разное))
Перейдите в START и нажмите Run, затем введите cmd и нажмите ENTER, появится черный ящик с серым текстом
Перейдите, используя Проводник, к тому месту, где вы сохранили код на шаге 3. Теперь должен быть файл с тем же именем, что и у вашего исходного файла (шаг 3), но должен быть исполняемым. Перетащите exe-файл из окна проводника в окно cmd (шаг 4, черный ящик)
Выберите черный ящик и нажмите ENTER, текст «Hello World!» должно появиться.
4. Разное
Почему я должен щелкнуть Консоль «Собрать и запустить», а не просто «Собрать и запустить» в меню «Проект»?
Причина, по которой вы должны нажать Console Assemble и Run, заключается в том, что существует два типа приложений, есть графические интерфейсы и затем приложения с текстовой базовой консолью (DOS). Hello Hello Application является текстовым приложением, поэтому при сборке должны иметь настройки, которые будут иметь консольное приложение, а не GUI.
См. Третий абзац под примечаниями в по этой ссылке для более подробного объяснения.
5. Вопрос
Хорошо, теперь вопрос, кто-нибудь здесь видит какие-либо проблемы, ошибки или общие проблемы с этим кодом или есть какие-либо предложения