|
|
| Посл.отвђт | Сообщен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
а ты чем компилишь? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |