Использование директивы extrn

Тема в разделе "WASM.BEGINNERS", создана пользователем C0deCreat0r, 14 мар 2009.

  1. C0deCreat0r

    C0deCreat0r New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    7
    Код (Text):
    1. .386
    2. .model flat, STDCALL
    3.  
    4. extrn GetStdHandle:PROC
    5. extrn FreeConsole:PROC
    6. extrn AllocConsole:PROC
    7. extrn ReadConsoleA:PROC
    8. extrn ExitProcess:PROC
    9.  
    10. .data
    11. num1 dd 0
    12. mess dd 80
    13. buf_v db 80 dup (0)
    14.  
    15. .code
    16. start: call FreeConsole
    17.          call AllocConsole
    18.          
    19.          push -10
    20.          call GetStdHandle
    21.          
    22.          push 0
    23.          push offset num1
    24.          push mess
    25.          push offset buf_v
    26.          push eax
    27.          call ReadConsoleA
    28.          
    29.          push 0
    30.          call ExitProcess
    31. end start
    Данный код на стадии линковки выдаёт ошибки unresolved external symbol для каждой функции (подписывая к ним подчёркивание, _ExitProcess например)
    Что не так ?
    Меня интересует пример именно в таком виде, применение invoke, includelib с include мне известно, интересен момент запуска кода в таком варианте.
    Поискал по форуму, не нашёл ничего толкового по extrn.
    Буду признателен за вашу помощь.
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    C0deCreat0r
    раз ты объявил что
    extrn GetStdHandle:PROC

    то в каком-то модуле его надо реализовать

    линкер эту реализацию не находит, и выдает ошибку
     
  3. C0deCreat0r

    C0deCreat0r New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    7
    Все функции принадлежат kernel32.
    Не понятно для чего преподаватель дал пример с extrn, когда можно подключить библиотеку kernel32.lib и прописать прототипы функций.
    В чём прелесть директивы ? если можно так выразится.
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ты kernel32.inc смотрел? там те же extern
     
  5. C0deCreat0r

    C0deCreat0r New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    7
    GoldFish Я перед тем как задавать вопрос конечно попытался покумекать.
    В inc прописаны прототипы и константы, ExitProcess PROTO :lol: WORD например.
    Или это одно и тоже ?
    В книге Пирогова вообще таким образом
    Код (Text):
    1. EXTERN   ExitProcess@4:NEAR
    прописано, но используется includelib.
    Это понятно примерно как работает, а в этом примере только указаны внешние функции и всё.
    Что это даёт.
     
  6. C0deCreat0r

    C0deCreat0r New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    7
    Открыл либу kernel32.lib, посмотрел имена функций, подставил
    Код (Text):
    1. .386
    2. .model flat, STDCALL
    3. option casemap:none
    4.  
    5. extrn GetStdHandle@4:PROC
    6. extrn FreeConsole@0:PROC
    7. extrn AllocConsole@0:PROC
    8. extrn ReadConsoleA@20:PROC
    9. extrn ExitProcess@4:PROC
    10.  
    11. includelib kernel32.lib
    12.  
    13. .data
    14. num1 dd 0
    15. mess dd 80
    16. buf_v db 80 dup (0)
    17.  
    18. .code
    19. start: call FreeConsole@0
    20.          call AllocConsole@0
    21.          
    22.          push -10
    23.          call GetStdHandle@4
    24.          
    25.          push 0
    26.          push offset num1
    27.          push mess
    28.          push offset buf_v
    29.          push eax
    30.          call ReadConsoleA@20
    31.          
    32.          push 0
    33.          call ExitProcess@4
    34. end start
    Работает.
    Могу только предположить одно.
    Данный пример был немного мной отредактирован, в оригинале был инклюд на файл wincon32.inc
    Предпологаю что в этом файле были следующие строки:
    Код (Text):
    1. ReadConsoleA equ ReadConsoleA@20
    2. и т.д.
    3. includelib kernel32.lib
    Если так, тогда всё понятно.
    extrn используется в связке с статическими библиотеками и хочешь не хочешь их надо подключать.
    Такой вывод я сделал, спасибо откликнувшимся ! :)
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.913
    C0deCreat0r
    А еще посмотри здесь
     
  8. C0deCreat0r

    C0deCreat0r New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    7
    Mikl___
    Посмотрел, вопрос отличается, но полезное почерпнул.
    Макросы из Болгарии тоже пригодятся.