Компоновка нескольких объектных файлов?

Тема в разделе "WASM.WIN32", создана пользователем V7T, 16 янв 2012.

  1. V7T

    V7T New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2012
    Сообщения:
    2
    Здравствуйте.
    Собственно есть три файла *.asm: add_sub, add2, sub1.
    add_sub вызывает процедуры из add2 и sub1. Процедуры (из add2, sub1) объявлены как extern в add_sub, а в файлах add2 и sub1, как public, в общем все соблюдено.
    Компиляция проходит успешно:
    E:\masm32\bin\ml /c /coff add_sub.asm add2.asm sub1.asm
    создается 3 объектных файла.

    Вопрос: Как компоновать линкером?
    Пытался так:
    E:\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:add_sub.def add_sub.obj add2.obj sub1.obj
    ах да, создаю библиотеку.

    Спасибо.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    И? Проблема-то в чем? По моему опыту - ошибки в файле def.
     
  3. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    а какие ошибки то
     
  4. alechoo

    alechoo New Member

    Публикаций:
    0
    Регистрация:
    26 янв 2012
    Сообщения:
    1
    И в чем проблема опишите подробнее
     
  5. V7T

    V7T New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2012
    Сообщения:
    2
    Файл add_sub:
    Код (Text):
    1. .686
    2. .model flat, stdcall
    3. .stack 100h
    4. option casemap: none
    5.     extern add2:proc
    6.     extern sub1:proc
    7.     public a1, a2, b3
    8. include D:\masm32\include\windows.inc
    9. .data
    10.     hInst HINSTANCE NULL
    11.     a1 dd 12
    12.     a2 dd 17
    13.     b3 dd 34
    14. .code
    15. start:
    16. DllEntryPoint proc hInstance:HINSTANCE, dwReason:dword, lpvReserved:LPVOID
    17.     .If dwReason == DLL_PROCESS_ATTACH
    18.         mov eax, hInstance
    19.         mov hInst, eax
    20.     .ElseIf dwReason == DLL_PROCESS_DETACH
    21.  
    22.     .ElseIf dwReason == DLL_THREAD_ATTACH
    23.  
    24.     .ElseIf dwReason == DLL_THREAD_DETACH
    25.  
    26.     .EndIf
    27.     mov eax, TRUE ;Return TRUE
    28.     ret
    29. DllEntryPoint endp
    30.  
    31. add_sub proc
    32.     clc
    33.     call add2   ;
    34.     push eax    ;
    35.     call sub1  
    36.  
    37.     ret
    38. add_sub endp
    39. end DllEntryPoint
    40. end start
    Файл sub1:
    Код (Text):
    1. .686
    2. .model flat
    3. option casemap: none
    4.     extern b3:dword
    5.     public sub1
    6. .code
    7. sub1 proc
    8.     push ebp
    9.     mov ebp, esp
    10.     mov eax, dword ptr [ebp+8]
    11.     sub eax, b3
    12.     pop ebp
    13.     ret 4
    14. sub1 endp
    15. end
    Файл add2:
    Код (Text):
    1. .686
    2. .model flat
    3. option casemap: none
    4.     public add2
    5.     extern a1: dword
    6.     extern a2: dword
    7.  
    8. .code
    9. add2 proc
    10.     mov eax, a1
    11.     adc eax, a2
    12.     ret
    13. add2 endp
    14. end
    файл def:
    Код (Text):
    1. LIBRARY add_sub
    2. EXPORTS add_sub
    Я читаю книгу (ассемблер для процессоров intel Pentium), набираю и компилирую примеры. К исходникам не придраться, доселе компилировались без единой ошибки.
    Проблема в том, что я никогда не сталкивался с соединением нескольких файлов в один исполняемый, а в данном случае в DLL. В книге не указано как быть в этом случае.