2017-01-10 10 views
1

патроны.Использовать символические имена без пакета masm32

В настоящее время я изучаю аркановское искусство языка ассемблера.

Я написал программу, которая отображает диалоговое окно (на окнах 8.1). Я проверил ссылку msdn и выяснил, как изменить оптику и поведение указанного диалогового окна. Я также узнал, где хранится возвращаемое значение и как его читать. Поэтому мой вопрос не в том, что «помогите мне, я застрял».

Посмотрите на эту маленькую программу в диалоговом окне:

.386 
.model   flat, stdcall 
includelib  "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\user32.lib" 
includelib  "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\kernel32.lib" 

MessageBoxA  PROTO :DWord, :DWord, :DWord, :DWord 
ExitProcess  PROTO :DWord 

.data 
Caption   db "Masm shizzle",0 
Text   db "Click OK my friend",0 

.code 
start: 
       push 11h 
       push OFFSET Caption 
       push OFFSET Text 
       push 0 
       call MessageBoxA 

       push 0 
       call ExitProcess 
end start 

Это работает как шарм, и я понял, как нужно заказывать в стек параметры.
Затем я попытался улучшить код и сделать его более удобным для чтения и чище, поэтому я сломал раздел .Code вниз:

.code 
start: 
       invoke MessageBoxA, 0, addr Text, addr Caption, 11h 
       invoke ExitProcess, 0 
end start 

А потом я наткнулся на веб-страницу, объявленную вы могли бы сделать код еще более удобным для чтения используя символические имена с помощью «windows.inc». Он сказал, что мне даже не нужно писать functionA (ANSI).

Поэтому вызов Invoke будет выглядеть следующим образом:

invoke Messagebox, NULL, addr Text, addr Caption, MB_ICONINFORMATION 

Проблема заключается в том, что эти символические имена из пакета masm32, более конкретно от «windows.inc».
Хотя я вообще не против использования masm32, мне бы хотелось знать, есть ли эквивалентный файл на «стандартном» хосте Windows с установленной только Visual Studio, которую я могу использовать.
Чтобы быть более конкретным, если бы я захотел запустить (или даже скомпилировать) этот код на удаленной машине, я не мог предположить, что на хосте присутствует установка masm32, поэтому включенные объекты будут указывать в никуда. (как я понимаю, или это упаковано в исполняемый файл, если я прекомпилирована его?)

Если это не представляется возможным без masm32, то я думаю, мне нужно написать символическую библиотеку имени ....

+0

Параметр 'windows.inc' файл необходимо только присутствовать, когда код собран, не тогда, когда он запускается. И если конечный пользователь хочет перекомпилировать код, им все равно понадобится MASM32. (Или совместимый сторонний ассемблер, но такой ассемблер должен предоставить свою собственную версию включенных файлов.) Поэтому я не думаю, что у вас есть проблема. –

+0

Спасибо, что принесли некоторую ясность в это. Поэтому я думаю, что просто перекомпилирую все версии, которые мне нужны. Ради завершения, есть ли эквивалент Microsoft для этого файла? – clockw0rk

+0

На самом деле я не понял, что MASM32 является сторонним пакетом. Я не знаю, есть ли эквивалент Microsoft, по-видимому, нет. В зависимости от лицензирования вы можете просто скопировать соответствующий контент прямо в исходный код. –

ответ

1

Вы можете получить MASM32 package by Hutch from here.
Это, безусловно, самый простой способ справиться с этими проблемами.

Он также будет обрабатывать вашу ситуацию с ANSI/UniCode, как описано in this thread.

Используя этот пакет вы бы иметь ничего общего, если вы хотите использовать версию ANSI как

MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD 

И если вы хотите использовать версию UNICODE

MessageBoxW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD 

вы бы необходимо определить

__UNICODE__ EQU true ; or any other way of defining the __UNICODE__ define 

в начале файла (до включения).

После этого, что вы можете использовать - в обоих случаях - следующую строку

invoke MessageBox, 0, addr Text, addr Caption, 11h