|
|
| Посл.отвђт | Сообщен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 |
|
|
Дата: Ноя 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 :)))) Я вот думаю может их к пакету просто добавить? Гм... Хорошо, на след недели принесу. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.080 |