Ассемблирование без секретов


Рисунок9 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




- Начало -  - Назад -  - Вперед -