|
|
| Посл.отвђт | Сообщен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 |