вопрос о вызове импортируемых функций, сегментах и WinMain

Тема в разделе "WASM.ASSEMBLER", создана пользователем acdel1, 9 ноя 2005.

  1. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Здравствуйте

    У меня три вопроса:



    1)У меня компилятор осуществляет вызов импортируемых функций следующим

    образом:



    call x

    ...

    x: jmp dword ptr y

    ...

    (таблица импорта)

    y: (вход в вызываемую функцию)



    незнает ли кто как указать компилятору осущестлять вызов таким образом:



    call dword ptr (x)

    ...

    (таблица импорта)

    x: (вход в вызываемую функцию)



    2)

    Можно ли каким либо образом указать линкеру чтобы описанные таким образом сегменты:



    X segment public 'DATA'

    X ends

    ...

    X segment public 'DATA'

    X ends



    были помещены вместе в секцию data исполняемого файла?



    3)

    Не знает ли кто нибудь почему после компиляции



    WinMain PROC hInstance:lol: WORD, hPrevInstance:lol: WORD, pCmdLine:lol: WORD, nCmdShow:lol: WORD



    push ebp

    mov ebp, esp

    ...

    WinMain endp



    становится:



    WinMain PROC hInstance:lol: WORD, hPrevInstance:lol: WORD, pCmdLine:lol: WORD, nCmdShow:lol: WORD



    push ebp

    mov ebp, esp

    push ebp

    mov ebp, esp

    ...

    WinMain endp
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    2) link /MERGE:lol: ATA=.data

    Это в msvc
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    acdel1

    1) Искать явно не пробовал, не первый раз обсуждается. Читай статью Edmond'a ("Записки Дзенствующего").



    2) Подобные одинаковые сегменты линкер объединяет в один. Если они не совсем одинаковы, смотри опции командной строки линкера (/merge)



    3) Потому что ML генерит код исходя из описания подпрограммы (proc)и своих опций (.model). Хочешь сам всё делать - смотри справку ML (option prologue, option epilogue).
     
  4. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Благодарю вас за помощь.

    по поводу второго вопроса хочу уточнить: мне необходимо

    чтобы эти сегменты находились вместе (последовательно один за другим)

    независимо от того где они описаны т.е. в общем то до линкования они расположены в разных *.obj

    файлах. т.е.

    до линкования



    1.obj

    ...

    X segment public 'DATA'

    X ends

    ...



    2.obj

    ...

    X segment public 'DATA'

    X ends

    ...



    а в исполняемом файле

    ...

    .data

    ...

    X segment public 'DATA'

    X ends

    X segment public 'DATA'

    X ends

    ...

    можно ли как нибудь указать это линкеру?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ты что-то чудишь.

    .data - это и есть "segment public 'DATA'". Точное написание смотри в справке или в примерах от TheSvin
     
  6. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Да нет какие уж тут чудеса -:)

    Просто в libc.lib(ctr0dat.obj) есть такая функция _cinit


    Код (Text):
    1. __cinit         proc near
    2.         mov     eax, dword ptr ds:__FPinit
    3.         test    eax, eax
    4.         jz      short loc_0_57
    5.         call    eax ; __FPinit
    6.  
    7. loc_0_57:                            
    8.         push    offset ___xi_z
    9.         push    offset ___xi_a
    10.         call    __initterm
    11.         push    offset ___xc_z
    12.         push    offset ___xc_a
    13.         call    __initterm
    14.         add     esp, 10h
    15.         retn
    16. __cinit         endp


    где ___xc_z и ___xc_a в ctr0init.obj


    Код (Text):
    1. _CRT$XCZ        segment dword public 'DATA' use32
    2.          assume cs:_CRT$XCZ
    3.          ;org 10h
    4.          public ___xc_z
    5. ___xc_z         db    0 ;  
    6.                 db    0 ;  
    7.                 db    0 ;  
    8.                 db    0 ;  
    9. _CRT$XCZ        ends
    10.  
    11. ; ===================================================
    12.  
    13. ; Segment type: Pure data
    14. _CRT$XCA        segment dword public 'DATA' use32
    15.                 assume cs:_CRT$XCA
    16.                 ;org 14h
    17.                 public ___xc_a
    18. ___xc_a         db    0 ;  
    19.                 db    0 ;  
    20.                 db    0 ;  
    21.                 db    0 ;  
    22. _CRT$XCA        ends


    так вот мне нужно как то поместить адреса своих функций между

    __xc_z и __xc_a. _CRT$XCZ _CRT$XCA сегменты помещаются в самом начале

    секции .data. Я думал как ни будь записать адреса в _CRT$XCZ но что то

    пока ничего не выходит -:dntknw:
     
  7. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    А почему просто не скопировать код этих ф-ций

    и не развесить спереди и сзади?
     
  8. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 Peshuha

    Тогда мне будет не подключить libc.lib, т.к. компилятор будет сообщать об ошибке: переобъявление __xc_z и __xc_a.

    Можно, конечно, сделать как вы говорите, выкинув предворительно ctr0init.obj из

    libc.lib, но я всё еще надеюсь обойтись без таких радикальных средств -:)
     
  9. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Благодарю всех за помощь.

    Проблема решилась следующим образом:

    при внимательном рассмотрении _CRT$XCZ _CRT$XCA оказались

    .CRT$XCZ .CRT$XCA таким образом, добавив в .asm "option dotname" и сделав свой .CRT$XCZ, получаем искомое. -:)