2010-10-06 2 views
4

Я строю программу сборки Windows без какого-либо макроса. Поэтому я загрузил программу, использующую макросы, и я конвертирую ее в «чистый» код сборки.Windows Assembly Doubt - x86

Однако я столкнулся с одной проблемой здесь. Там есть ярлык @@:, который я не понимаю, а также скачок jne @F, что я его не понял. Что это за символы?

MyWndProc: 

    push ebp 
    mov ebp, esp 

    cmp DWORD PTR [ebp+12], 2 ;WM_DESTROY=2 
    jne @F 
     push ecx 
     push NULL 
     mov dword ptr ecx, 7e42ca5ah ;address of PostQuitMessage 
     call ecx 
     pop ecx 
    @@: 

    push DWORD PTR [ebp+20] 
    push DWORD PTR [ebp+16] 
    push DWORD PTR [ebp+12] 
    push DWORD PTR [ebp+8] 
    call DefWindowProc 
    ;mov dword ptr edx, 7e42c17eh 
    ;call edx 

    leave 
    ret 16 

Также для PostQuitMessage API я мог бы жестко закодировать адрес памяти (на WinXP 32bits SP3 английский), но для DefWindowProc компилирует, но он ломается при выполнении. Кто-нибудь знает, почему?

Спасибо за поддержку.

PS .: Я использую masm32

+0

Почему «без каких-либо макросов»? – Andrey

+1

Почему? Две причины: 1) Я хочу видеть детали двоичных файлов Windows. 2) Я хочу построить программу сборки внутри программы C. Зачем? Я просто * очень любопытный парень ... – jyz

+0

Адреса жесткого кодирования = нет-нет. –

ответ

4

@@ является анонимной локальной меткой. У вас может быть много из них в файле. jne @F означает переход к ближайшему @@ перед текущим местоположением.

+0

Хорошо спасибо. вопрос DefWindowProc? Любой идеал? – jyz

+0

Не могу рассказать вам без кода. Является ли DefWindowProc еще одной из ваших подпрограмм? –

+0

Нет, 'DefWindowProc' - это Windows API. Эта процедура отвечает за получение сообщений Windows ... I ' я нашел его адрес на своей машине с помощью инструмента arwin, но это единственный API, который я не могу жестко записать. но я не знаю, почему я не могу сделать то же самое с «PostQuitMessage» ... – jyz