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

 WASM Phorum —› WASM.WIN32 —› файлы inc и lib

. 1 . 2 . >>

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


Дата: Ноя 7, 2003 04:07:53

Я начинающий. У меня вопросы:
1. Вот строчки
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

Как я понял файлы inc содержат прототипы API-функций которые необходимы транслятору чтобы он знал что существует такая ПОДПРОГРАММА(или функция???)и какие параметры в каком количестве ей нужны перед вызовом (например будем вызывать "call ExitProcess" (invoke ExitProcess)). Но это при трансляции а на этапе линковки увидев строчку сall ExitProcess линковщик прилинкует подпрограмму с таким же именем ExitProcess (или он её прилинкует когда увидет ExitProcess PROTO :DWORD ???) которая будет осуществлять вызов одноименной API-функции из kernel32.dll (в данном случаи) которая и прервет программу. От куда линковщик возьмет код этой подпрограммы (я так понимаю из kernel32.lib...если не то объясните зачем нужны libы) и в какую часть кода он ее присобачит и можно ли как-то взглянуть на этот код???


2 Вот еще вопрос. В рассылки "Ассемблер? Это просто! Учимся программировать" файлы inc пишутся иначе например в место ExitProcess PROTO :DWORD пишется
extrn __imp__ExitProcess@4:dword
ExitProcess equ __imp__ExitProcess@4
Но когда я заменяю эти две сточки на ExitProcess PROTO :DWORD при трансляции ассемблер выдает ошибку "language type must be specified" и не создает OBJ фаил.
Почему так происходит ? И как исправить ?


[u][/u][/i][i][i][/i][/b][b][b][/b][back=][back=][/back][img][/img]


Дата: Ноя 7, 2003 04:31:09

Но это при трансляции а на этапе линковки увидев строчку сall ExitProcess линковщик прилинкует подпрограмму с таким же именем ExitProcess (или он её прилинкует когда увидет ExitProcess PROTO :DWORD ???) которая будет осуществлять вызов одноименной API-функции из kernel32.dll (в данном случаи) которая и прервет программу. От куда линковщик возьмет код этой подпрограммы (я так понимаю из kernel32.lib...
Ну вот, начали за здравие, как говорится. API всё-таки лучше называть функциями, а не подпрограммами. Код API-функций НЕ копируется в компилируемую программу, иначе все экзешники имели бы чрезмерно большой размер. Вместо этого генерируется call/jmp на адрес используемой API, а т.к. адрес не всегда один и тотже, то необходимо разрешать его во время загрузки программы (в рантайме, короче). Всё это дело напрямую связано с IAT, загрузчиком и даже линкером. Рекомендую почитать про этих товарищей.

2 Вот еще вопрос.
Как разберётесь с первым вопросом, так сразу поймёте принцип "прямых" переходов.


Дата: Ноя 7, 2003 04:54:02

Goodwen

Кое что по второму вопросу можно почерпнуть здесь:

Записки Дzenствующего


Дата: Ноя 7, 2003 19:31:46

кое-что про второй вопрос.... асм от тебя хочет узнать, как ему передавать параметры функции, в стеке или еще как.
Так что смело пиши в хидере программы
.model что-ты-там-используешь, stdcall
Дальше можешь использовать прототипы.


Дата: Ноя 8, 2003 07:45:16

Quantum
1


Дата: Ноя 8, 2003 07:47:16

Quantum
ой...Код API-функций НЕ копируется в компилируемую программу"
Я и не говорю что код API функции копируется в программу, я сказал что копируется подпрограмма которая будет осуществлять вызов одноименной API-функции из kernel32.dll а код этой подпрограммы на скока я понимаю находится в kernel32.lIb Если я не прав напиши... А мой вопрос насчет "ПОДПРОГРАММА(или функция???)" я имел ввиду что мы описываем например строчкой ExitProcess PROTO :DWORD функцию из kernel32.dll или подпрограмму из kernel32.lib ?
…Спасиб за ответ - жду следующий :).
P.S.
"Рекомендую почитать про этих товарищей." Обязательно ! если есть оставь ссылки


Дата: Ноя 8, 2003 07:49:12

use_32Не помогло


Дата: Ноя 8, 2003 14:05:39 · Поправил: use_32

Goodwen, попробуй так:
                .386p
                .model  flat, stdcall

		include	../win32inc/windows.inc
		includelib	../win32lib/kernel32.lib
		include	../win32inc/kernel32.inc
                че-там-тебе-еще-надо
		option casemap: none

а ты чем компилишь?


Дата: Дек 3, 2003 09:16:06

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

MASM32 v7


Дата: Дек 4, 2003 16:56:59

Но это при трансляции а на этапе линковки увидев строчку сall ExitProcess линковщик прилинкует подпрограмму с таким же именем ExitProcess (или он её прилинкует когда увидет ExitProcess PROTO :DWORD ???) которая будет осуществлять вызов одноименной API-функции из kernel32.dll (в данном случаи) которая и прервет программу. От куда линковщик возьмет код этой подпрограммы (я так понимаю из kernel32.lib...если не то объясните зачем нужны libы) и в какую часть кода он ее присобачит и можно ли как-то взглянуть на этот код???

Обясняю.

Когда ты делаешь call ExitProcess, и при этом ExitProcess объявлен через PROTO

ассемблер делает вызов по метки _ExitProcess@4, либо на шлюз __imp_ExitProcess@4 (шлюз -- это просто переменная в памяти величиной dword, которая хранит адрес функции)

Если на шлюз, то call превращается в

call dword ptr __imp_ExitProcess@4

Вопросы есть?

Но когда я заменяю эти две сточки на ExitProcess PROTO :DWORD при трансляции ассемблер выдает ошибку "language type must be specified" и не создает OBJ фаил.
Почему так происходит ? И как исправить ?


Ну конечно (см. статью), а что ты хотел?
В в директивах EXTERN не указываешь как ты хочешь передать параметры, а INVOKE требует знать соглашение.
Ты его ему сказал? Нет. Вот и выходит ошибка.

А чтобы так не было, смотри статью. Правда она старая, а новую я не поместил на сайт

Кстати у Киндера или Квантума есть мой последний набор inc. Возми их не мучся :)))


Дата: Дек 4, 2003 17:05:38

А мой вопрос насчет "ПОДПРОГРАММА(или функция???)" я имел ввиду что мы описываем например строчкой ExitProcess PROTO :DWORD функцию из kernel32.dll или подпрограмму из kernel32.lib ?

%))))))

Мы описываем МЕТКУ, которая содержится в файле kernel32.lib.

Ты знаком с принципом объектных модулей? Чем OBJ отличается от EXE?
Тем, что он содержит помимо кода, метки -- адреса в коде, или данных.

Поэтому на самом деле когда переменная объявляется внешней, то obj модуль не хранит переменную, он хранит только ИМЯ её!!!

А теперь подробнее о DLL
LIB файл от майкрософт содержит два типа меток

_Fun@xx и __imp__Fun@xx

Что такое тип 1? Тип1 -- это метка функции заглушки, которая выглядит как

jmp dword ptr __imp__Fun@xx -- косвенный переход.

А вот __imp__Fun@xx -- это метка переменной dword, которая является на самом деле элементом массива IAT.

Поэтому когда линкёр видит call __imp__
он естественно добавляет dword ptr


Дата: Дек 4, 2003 17:06:39

Asterix
Или я тебе их давал? :)))


Дата: Дек 4, 2003 20:28:49

Edmond
Нету ;-)


Дата: Дек 4, 2003 21:01:40

Edmond

У меня что-то есть :-) но вот последние ли??


Дата: Дек 5, 2003 13:44:35

Asterix
А ты мне покажи файлик, самый маленький.

Он должен быть таким

=================================
переменная модуля EQU 1

Обявления

IF UNICODE_DEF

ENDIF

Короче покажи.

Quantum

Так, Володя, всё. помещаешь мои inc :))))
Я вот думаю может их к пакету просто добавить?
Гм...

Хорошо, на след недели принесу.

. 1 . 2 . >>


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