вызов СИ функции из ассемблера в *NIX

Тема в разделе "WASM.BEGINNERS", создана пользователем stellaco, 29 дек 2008.

  1. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    По данной тематике нашёл только это http://www.wasm.ru/article.php?article=asminunix
    И то не получается вызвать СИ функцию fflush
    Если можно, поясните пожалуйста, как из ассемблерного кода вызвать функцию языка СИ.
    (Пользуюсь компилятором nasm и ОС Linux)
     
  2. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    Может ЭТО поможет. Код, правда, ФАСМ-овский.

    "A somewhat-advanced example of mixing assembly and C. It uses MS Visual C, but it may apply to other C compilers.
    Written by vid." - flatassembler.net
     
  3. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    PUSH
    Спасибо.

    Но к сожалению не помоголо..
    кажется разобрался какой код писать в nasm чтоб вызвать СИ функцию.. это
    extern printf а в фасм это
    extrn printf
    Теперь при вводе этого nasm -f elf ./test ld ./test.o
    компилятор не даёт ошибки хотя, функция не отробатывает (..видимо мои действия после компиляции не верны.
    Что следует делать после nasm -f elf ./test ?
     
  4. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    в документации nasm есть пример с printf.
    libc прилинковал? Лично я редко когда напрямую вызываю ld, даже если требуется линковка - то вызываю gcc, он сам все слинкует и не забудет libc.
     
  5. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    stellaco, юзайте gcc
     
  6. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    meduza
    libc не прилинковал.

    А ктонить может показать конкретный пример кода?
     
  7. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    http://www.csee.umbc.edu/help/nasm/sample.shtml
    для линковки используй gcc.
     
  8. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    meduza
    Спасибо
     
  9. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Напростейший пример

    щас буду разжевывать

    extern exit ; выход - функция из libc
    extern printf ; printf -- libc


    wd db "hello", 0xa, 0 ; наша строка


    global main ; int main ()

    main:

    xor eax,eax ; не обязательно, но я пишу, если вдруг захочешь этот код в середине проги юзать
    lea eax, [wd] ; думаю, понятно
    push eax ; и тут тоже
    call printf ; вызываем сишную ф-цию
    pop eax ; 1 раз положили в стек - не забываем извлечь. Иногда индийский код рулит
    push 0 ; параметр для exit
    call exit ; выходим
    pop eax ; тут понятно
    leave ; нах
    ret ; пошел, вот:)
     
  10. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    osrootd
    После этого наверно сразу появятся зависимости? Т.е. программа может не заработать на другой системе?
     
  11. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    K10
    Она заработает на любой x86-32 *nix. libс есть в любой *nix.
    п.с. когда я говорю "заработает", я имею ввиду, если ее скомпилить на этой системе. Т.е. исходные тексты портабельны на любую x86-32 *nix, а не бинарники.
     
  12. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    А вот я еще для тебя написал.

    Более сложный пример
    Код (Text):
    1. global  main
    2.     extern  printf
    3.     extern exit
    4.  
    5.  
    6.     section .text
    7.  
    8.  
    9.     struc msx
    10. mstr:
    11.     resb 32
    12. mqtr:
    13.     resb 32
    14.     endstruc
    15.  
    16. Hmsx:
    17.         istruc msx
    18.     at mstr,  db "hello, world%s", 10, 0
    19.     at mqtr,  db "! Ready to understand this? ",10,0
    20.     iend
    21.  
    22. main:
    23.  
    24.     xor edx, edx
    25.     lea edx, [Hmsx+mqtr]
    26.     push edx
    27.     xor edx, edx
    28.     lea edx, [Hmsx+mstr]
    29.     push edx
    30.     call printf
    31.     pop eax
    32.     pop edx ; Гыы
    33. ;--------------
    34.  
    35.     push 0
    36.     call exit
    37.     pop eax
    38.     leave
    39.     ret
     
  13. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    У меня вопрос по ходу:

    Я хочу с помощью dlopen на ассемблере плагин подключить.
    Но че-то не выходит, может у кого есть пример?
     
  14. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    osrootd
    Спасибо за разжёвывание =)
    К сожалению насчёт подключения плагинов в асме ничего не знаю ((((...Мне тоже интересно, как это грамотно делается.

    И у меня появился ещё вопрос.
    А если мне нужно использовать константы из <limits.h> (в котором определены приделы для конкретной *nix системы). Например _POSIX_CHILD_MAX или _POSIX_OPEN_MAX .
    Как ими можно воспользоваться при программировании на ассемблере?
     
  15. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Открываешь ЭТОТ файл: /usr/include/bits/posix2_lim.h
    и используешь так:
    Например, у тебя в .h файле написано
    #define _POSIX2_CHARCLASS_NAME_MAX 14

    Ну и используй в асм-прогах число 14. Переменную объяви.
     
  16. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    osrootd
    а нельзя в коде сделать так, чтоб можно было сразу писать следующее _POSIX2_CHARCLASS_NAME_MAX а при компиляции (на нужной ОС), nasm сам бы заглядывал в файлик /usr/include/bits/posix2_lim.h и подставлял бы нужные значения.
     
  17. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    meduza
    Вот про это я и говорю. А если сделать исключительно на системных вызовах, то будет ли переносимость бинарника?
     
  18. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Насм - это ассемблер, и глядеть никуда он не умеет.
    Для этого есть gnu autotools (autoconf, automake, autogen...)
    Создай динамический config.asm с помощью configure и инклудь его куда хошь
     
  19. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Нафиг она нужна?
     
  20. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    osrootd
    Для создания переносимого приложения.
    Если в *никс считается нормальным конечному пользователю заниматься компиляцией исходников и устранением всяких зависимостей, то это не значит, что так и должно быть.