Трюк заключается в том, что вам необходимо создать приложение Windows, а не консольное приложение. Как это сделать лучше всего демонстрировать с помощью приложения с минимальным примером.
Начнем с установки модели памяти.
.386
.model flat
Затем мы включаем windows.inc
, который дает нам доступ к различным константам, что мы, возможно, потребуется в вызовах API. Вам probaby не понадобится, если вы не очень много работаете с Windows API.
include windows.inc
Далее мы добавляем внешние функции для функций, которые мы хотим назвать. По крайней мере, вам нужно позвонить ExitProcess
. В этом примере мы также собираемся позвонить MessageBoxA
, чтобы мы могли видеть, как приложение что-то делает.
extrn ExitProcess : near
extrn MessageBoxA : near
Далее идет сегмент данных с сообщением «Hello World» для окна сообщения.
.data
hello db "Hello World!",0
И, наконец, код. Он просто вызывает MessageBoxA
, чтобы отобразить сообщение, а затем ExitProcess
для выхода из приложения.
.code
start:
push MB_ICONHAND or MB_OKCANCEL
push offset hello
push offset hello
push 0
call MessageBoxA
push 0
call ExitProcess
end start
Предполагая, что вы сохранили этот код в файле wintest.asm, вы бы затем скомпилировать его с помощью следующей командной строки:
tasm32 /ml wintest.asm
Опция /ml
указывает, что вы хотите использовать чувствительные к регистру символы. Без этого вызовы функций Windows не будут найдены компоновщиком.
Если вы получаете ошибку о невозможности найти windows.inc включаемый файл, вы можете также необходимо включить /i
вариант с путем к Борланду включает каталог.
Наконец, вы связываете с помощью следующей командной строки:
ilink32 wintest.obj,,,import32.lib,,
import32.lib
является библиотека импорта, которая связывает код с Windows API.
Предполагая, что все скомпилировано и связано успешно, вы должны иметь приложение Windows под названием wintest.exe, которое при запуске откроет окно сообщения, но не откроет окно консоли.
Как вы это сделаете для программы, которую вы написали на другом языке? Этот вопрос касается не только языка ассемблера, но и того, как заставить вашу систему вести себя по-разному. –
Поиск «прекратить и остаться резидентом», если вы программируете для DOS. – Michael
Не могли бы вы назвать основную функцию 'WinMain' или' wWinMain'? – Aaron