· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Файлы inc

Посл.отвђт Сообщенiе


Дата: Дек 3, 2003 09:12:42

Вот программа (Простое окно):
=================================
include windows.inc
include user32.inc
include kernel32.inc
.386
.model flat,stdcall
.const
class db "window class 1",0
name_ db "Da window!",0
.data
wc wndclassex<4*12,cs_hredraw or cs_vredraw,offset win_proc,0,0,?,?,?,color_window+1,0,offset class,0>
.data?
msg_ msg <?,?,?,?,?,?>
.code
_start:
xor ebx,ebx
push ebx
call Getmodulehandle
mov esi,eax
mov dword ptr wc.hInstance,eax
push IDI_Application
push ebx
call loadicon
mov wc.hIcon,eax
push idc_arrow
push ebx
call LoadCursor
mov wc.hCursor,eax
push offset wc
call registerclassEx

mov ecx,CW_usedefault
push ebx
push esi
push ebx
push ebx
push ecx
push ecx
push ecx
push ecx
push ws_overlappedwindow
push offset name_
push offset class
push ebx
call createwindowex
push eax
push sw_shownormal
push eax
call showwindow
call updatewindow
mov edi,offset msg_

main_:
push ebx
push ebx
push ebx
push edi
call Getmessage
test eax,eax
jz exit_
push edi
call translatemessage
push edi
call dispatchmessage
jmp main_
exit_:
push ebx
call exitprocess

win_proc proc
push ebp
mov ebp,esp

wp_hWnd equ dword ptr [ebp+08h]
wp_uMsg equ dword ptr [ebp+0Ch]
wp_wParam equ dword ptr [ebp+10h]
wp_lParam equ dword ptr [ebp+14h]
cmp wp_uMsg,2
jne not_
push 0
call postquitmessage
jmp end_
not_:
leave
jmp DefWindowProc
end_:
leave
ret 16
win_proc endp
end _start

end _start
================================================

incы для неё написанны в таком виде: ПРИМЕР "extrn __imp__ExitProcess@4:dword ExitProcess equ __imp__ExitProcess@4". Если же я заменяю их на inc файлы с прототипами, (тотже ExitProcess уже будет ExitProcess PROTO :DWORD)асм выдает ошибку в каждой строчке inc файла "language type must be specified".

В чем дело?

Компилю так:
ml /c /coff Window.asm
link window.obj /subsystem:windows

MASM32 v7


Дата: Дек 3, 2003 11:47:18

В чем разница между 2-мя inc'ами:
Стандартно (вариант PROTO), masm создает специальную таблицу (lookup table) которая используется для привязки твоего екзешника к dll'ам. Т.е когда ты пишешь call exitprocess, на самом деле переход будет не в dll, а сначала в эту таблицу, а там jmp.
2-й вариант - inc'и созданные L2EXTIA.EXE (т.е. ПРИМЕР "extrn __imp__ExitProcess@4:dword ExitProcess equ __imp__ExitProcess@4"). Здесь таблицы переходов не будет. Будет таблица адресов, и косвенные call'ы непосредственно dll. Только в таком случае первым должен быть hutc'евский windows.inc

Почему не работает?
Попробуй сначала .model, а потом inc :)


Дата: Дек 3, 2003 12:40:49

Goodwen, эти вопросы уже неоднократно обсуждались и в разделе статей наверное что-то есть. Вот те два примера - компилятся без всяких ошибок.
.386 
.model flat,stdcall 
option casemap:none

include \masm32\include\windows.inc

ExitProcess PROTO :DWORD

includelib \masm32\lib\kernel32.lib

.code 
start:
    invoke ExitProcess, 0
end start



.386 
.model flat,stdcall 
option casemap:none

include \masm32\include\windows.inc

externdef _imp__ExitProcess@4:PTR pr1
ExitProcess equ <_imp__ExitProcess@4>

includelib \masm32\lib\kernel32.lib

.code 
start:
    invoke ExitProcess, 0
end start


Дата: Дек 7, 2003 09:55:20

Four-F
Ого... так мне что, теперь все функции в начале программы описывать придется ? Ведь кроме ExitProcess есть еще UpdateWindow ShowWindow CreateWindowEx DefWindowProc QuitMessage да мала ли что еще...спрашивается зачем тогда inc нужны...Подскажи что мне конкретно в моем коде исправить надо :))


Дата: Дек 7, 2003 13:27:02 · Поправил: Four-F

[ Goodwen: Ого... так мне что, теперь все функции в начале программы описывать придется... ]

Нет. include для того и существует, чтобы включать в текст один раз сделанные прототипы. В пакете masm прототипы функций находятся в каталоге masm32\include. Если тебе нужны инклуды, которые позволяют генерить импорт без JumpTable, то бери L2EXTIA (есть в masm32) и делай их самостоятельно, а потом точно также подключай с помощью include.


[ Goodwen: Подскажи что мне конкретно в моем коде исправить надо :)) ]

Ну как тебе сказать... Я бы исправил его так:
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
g_szClassName   db "window class 1", 0
g_szAppName     db "Da window!", 0

.data?
g_hInstance         HINSTANCE   ?
g_pszCommandLine    LPSTR       ?

.code

WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, lpCmdLine:LPSTR, nCmdShow:UINT

LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
    
    mov   wc.cbSize, sizeof WNDCLASSEX
    mov   wc.style, CS_HREDRAW + CS_VREDRAW
    mov   wc.lpfnWndProc, offset WndProc
    mov   wc.cbClsExtra, 0
    mov   wc.cbWndExtra, 0
    push  g_hInstance
    pop   wc.hInstance  
    mov   wc.hbrBackground, COLOR_WINDOW+1
    mov   wc.lpszMenuName, NULL
    mov   wc.lpszClassName, offset g_szClassName
    invoke LoadIcon, NULL, IDI_APPLICATION
    mov   wc.hIcon, eax
    mov   wc.hIconSm, eax
    invoke LoadCursor, NULL, IDC_ARROW
    mov   wc.hCursor, eax
    invoke RegisterClassEx, addr wc

    invoke CreateWindowEx, NULL, addr g_szClassName, addr g_szAppName, \
           WS_OVERLAPPEDWINDOW, \
           CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
           NULL, NULL, hInst, NULL
    mov   hwnd, eax
    
    invoke ShowWindow, hwnd, nCmdShow
    invoke UpdateWindow, hwnd

    .while TRUE
        invoke GetMessage, addr msg, NULL, 0, 0
        .break .if (!eax)
        invoke TranslateMessage, addr msg
        invoke DispatchMessage, addr msg
    .endw

    mov eax, msg.wParam
    ret
    
WinMain endp

WndProc proc uses esi edi hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

    .if uMsg == WM_DESTROY
        invoke PostQuitMessage, 0
    
    .else
        invoke DefWindowProc, hWnd, uMsg, wParam, lParam
        ret
    .endif

    xor eax, eax
    ret
    
WndProc endp

start:
    invoke GetModuleHandle, NULL
    mov g_hInstance, eax

    invoke WinMain, g_hInstance, NULL, g_pszCommandLine, SW_SHOWDEFAULT
    invoke ExitProcess, eax
end start


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097