Как преобразовать syscalls.master в файл с макросами?

Тема в разделе "WASM.UNIX", создана пользователем STAKANOV, 19 ноя 2005.

  1. STAKANOV

    STAKANOV New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    73
    Адрес:
    Планета Земля
    Нуже скрипт(может perl или еще что) который преобразует фришный syscalls.master в нужный формат.



    Напрмер

    в syscalls.master -
    Код (Text):
    1. 1       AUE_NULL        MSTD    { void sys_exit(int rval); }




    а в результате работы скрипта получаем
    Код (Text):
    1. .macro sys_exit rval
    2.      pushl  \rval     # это надо повторить для всех аргументов
    3.      movl   $1,%eax   # это там самая 1 из syscalls.master
    4.      pushl  %eax
    5.      int    $0x80
    6.      addl   $8,%esp   # 8= (колич.aрг+1)*4
    7. .endm




    сам я не силен в шелл скриптах и перле
     
  2. guestapo

    guestapo New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2002
    Сообщения:
    6
    вот скрипт. если чего не скушает, пиши, поправим. у меня нет фри.

    пользоваться так

    # ./conv syscalls.master >syscall.inc

    или

    # ./conv <syscalls.master >syscall.inc



    ---------begin---------
    Код (Text):
    1.  
    2. #!/usr/bin/perl -w
    3.  
    4. $macro =<<'END';
    5. .macro %s %s
    6. %s
    7.     movl    $%s,%%eax
    8.     pushl   %%eax
    9.     int $0x80
    10.     addl    $%s,%%esp
    11. .endm
    12.  
    13. END
    14.  
    15. while(<>) {
    16.     ($no,$proto) = /^\s*(\d+).*{(.*)}/ and
    17.         ($name) = $proto =~ /\b(\w+)\s*\(/ or next;
    18.     @args = @pushs = ();
    19.     while($proto =~ /\b(\w+)\s*?[,)]/g) {
    20.         push(@args,$1);
    21.         push(@pushs,"\tpushl\t\\$1");
    22.     }
    23.     printf($macro,$name,join(',',@args),join("\n",@pushs),$no,(@args+1)*4);
    24. }
    25. __END__
    26.  




    а не лучше просто

    push $call_no

    вместо

    movl $call_no,%eax

    pushl %eax

    или какая-то оптимизация?
     
  3. guestapo

    guestapo New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2002
    Сообщения:
    6
    > а не лучше просто

    > push $call_no

    > вместо

    > movl $call_no,%eax

    > pushl %eax

    > или какая-то оптимизация?





    вопрос снят. я глупость сказал :)