hex-редактор показывает истинное лицо MessageBoxA
Все равно ни хрена не понятно! Мы же уже сказали в модели памяти "stdcall" и транслятор послушно добавил ко всем функциям знак прочерка, но "забыл" дописать аргументы. А как бы он их дописал? Ведь прототип функции объявлен как "PROC"! Вот ассемблер и постеснялся разводить самодеятельность!
В комплекте с полной версией MASM'а идут inc-файлы, в которых все прототипы объявлены правильно, однако, в DDK ничего подобного нет и потому эту работу нам приходится выполнять самостоятельно и писать так: "extern MessageBoxA@16:near" или так: "extern _imp__MessageBoxA@16:dword" (в последнем случае функция будет вызвана через "переходник"). Если слово "stdcall" в модели памяти не указано и, следовательно, знак прочерка транслятором не добавляется, обе конструкции будет выглядеть так: "extern _MessageBoxA@16:near" и "extern __imp__MessageBoxA@16:dword" соответственно. Чтобы не вызывать каждый раз по "длинному" имени, создайте короткий алиас, обозвав ее хоть msgbox, хоть mb, хотя, во избежании путаницы, большинство программистов все-таки сохраняет оригинальные API-имена и убирает только "_" и "$x".
Законченный вариант программы будет выглядеть так.
.386
.model flat
extern _ExitProcess@4:near
extern _MessageBoxA@16:near
.data
s0 db 'hello, world',0
.code
_start:
push 0
push 0
push offset s0
push 0
call _MessageBoxA@16
push 0
call _ExitProcess@4
end _start