FASM. Директива PROC во FreeBSD.

Тема в разделе "WASM.ASSEMBLER", создана пользователем andy_tallinn, 16 мар 2007.

  1. andy_tallinn

    andy_tallinn Andy Tallinn

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    13
    Адрес:
    World
    Здравствуйте.

    Условия: FreeBSD, FASM.

    При компиляции:

    Код (Text):
    1. format ELF
    2. section '.text' executable
    3. public _start
    4.  
    5. _start:
    6.     proc TestFunction
    7.         ret
    8.     endp
    9.  
    10.     call TestFunction
    11.  
    12.     xor eax, eax
    13.     push eax
    14.     inc eax
    15.     int 0x80
    Возникает ошибка:

    Код (Text):
    1. flat assembler  version 1.67.21  (16384 kilobytes memory)
    2. test.asm [5]:
    3.     proc TestFunction
    4. error: illegal instruction.
    Скажите, существует ли поддержка директивы PROC и какие-нибудь
    соглашения вызова в компиляторе FASM под FreeBSD и другие
    *nix системы? Или все же придется писать:

    Код (Text):
    1. format ELF
    2. section '.text' executable
    3. public _start
    4.  
    5. TestFunction:
    6.     ret
    7.  
    8. _start:
    9.     call TestFunction
    10.     xor eax, eax
    11.     push eax
    12.     inc eax
    13.     int 0x80
    С уважением,
    Andy.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    подключи macro/proc32.inc.
     
  3. andy_tallinn

    andy_tallinn Andy Tallinn

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    13
    Адрес:
    World
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    n0name
    proc32 - это stdcall, а в бсд fastcall используется, не так ли?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    IceStudent
    Я так понял ему нужно для своих процедур.
    А там без разницы. Процессор один, что под win, что под bsd.
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    andy_tallinn
    До call TestFunction дело даже не дойдёт, т.к. начало функции TestFunction совпадает с меткой _start, т.е. TestFunction выполнится на старте и ret (аварийно) завершит приложение.

    Тут нужен ещё один push с произвольным операндом, т.к. в BSD соглашение для системных вызовов требует дополнительного 4-байтного значения в стеке, эмулирующего адрес возврата:
    Код (Text):
    1. xor eax, eax
    2. push eax
    3. inc eax
    4. push eax ; dummy param
    5. int 0x80
     
  7. andy_tallinn

    andy_tallinn Andy Tallinn

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    13
    Адрес:
    World
    n0name

    Абсолютно с Вами согласен.


    Quantum

    Отнюдь, нет. Метка _start по умолчанию используется как точка входа
    (компоновщик ld (в случае ELF-формата) ищет ее описание в коде как
    public symbol). В качестве доказательства, я провел эксперимент —
    переименовал метку _start в метку _startup.

    Результат говорит сам за себя:

    Код (Text):
    1. ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
    Да, конечно. Признаюсь, не заметил упущение :-|
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    andy_tallinn
    Правильно. Только я имел в виду совсем другое, касательно первого листинга:
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    andy_tallinn
    Тебе Quantum говорил про баг:
    Код (Text):
    1. _start:
    2.     proc TestFunction
    3.         ret
    4.     endp
    Хотя твой же второй вариант его не содержит:
    Код (Text):
    1. TestFunction:
    2.     ret
    3. _start:
    А вот это напрасно - раньше или позже "необьяснимая" путаница обязательно возникнет ;)
     
  10. andy_tallinn

    andy_tallinn Andy Tallinn

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    13
    Адрес:
    World
    Quantum, Y_Mur

    Да :)