Машинные команды в C

Тема в разделе "LANGS.C", создана пользователем Mingan, 20 мар 2007.

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    не функции, а асм вставки, наверное? или именно функции?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Nouzui
    ну а вставки тем более должны вставляться 1 в 1 как есть в код.
     
  3. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Nouzui
    ага gcc... не violate (http://www.rambler.ru/dict/scripts/go.cgi?btnG=%CD%E0%E9%F2%E8%21&query=violate&where=enru&start=0&count=15) а volatile
    http://www.rambler.ru/dict/scripts/go.cgi?query=volatile&where=enru

    выдержка из GCC UG http://gcc.gnu.org/onlinedocs/
    Код (Text):
    1. ...Note that if all the output operands you specify are for this purpose (and hence
    2. unused), you will then also need to specify volatile for the asm construct, as described
    3. below, to prevent GCC from deleting the asm statement as unused....
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Nouzui
    компилер все может :dntknw:
    Great
    только не у MS - ничего святого для них нет :)
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    dag
    да знаю я.. случайно написал просто
    violate.. ))) изнасилуем компилятор
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    Которые идут с текущим компилятором. Vicual C++ - Reference - C/C++ Languages к примеру. Просто с каждой новой версией идут новые фичи, иногда полезно знать и использовать их.

    Для vc ничего не означает, о gcc не знал даже, что он так самонадеян.

    Асм-вставки точно нет, а вот с оптимизацией функций, имеющих вставки эти, у оптимизатора иногда начинаются проблемы: либо не хочет, либо не может.

    Ustus
    Ты имеешь ввиду VC8? Не знаю, не очень-то он соптимизировал следующее (только заинлайнил :) ):
    Код (Text):
    1. int foo(int a)
    2. {
    3.     __asm {
    4.         mov  eax,[a]
    5.         add  eax,16
    6.         mov  [a],eax
    7.         mov  eax,[a]
    8.         mov  [a],eax
    9.         mov  eax,[a]
    10.     }
    11.     return a;
    12. }
    13.  
    14. ///
    15. ; int __cdecl main(int argc,const char **argv,const char *envp)
    16. _main   proc near                       ; CODE XREF: ___tmainCRTStartup+15Ap
    17.          argc    = dword ptr  4
    18.  
    19.          mov     eax, [esp+argc]
    20.          mov     [esp+argc], eax
    21.          mov     eax, [esp+argc]
    22.          add     eax, 10h
    23.          mov     [esp+argc], eax
    24.          mov     eax, [esp+argc]
    25.          mov     [esp+argc], eax
    26.          mov     eax, [esp+argc]
    27.          mov     eax, [esp+argc]
    28.          retn
    29.  _main   endp
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в смысле? msdn, что ли? в 2003 emit'а нет

    ну, это не оптимизация.. он вообще вроде может заинлайнить любую функцию, если она меньше определенного размера и еще при каких-то условиях
    или что-то в этом роде..
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Я имел ввиду то, что вставку он и не пытался оптимизировать, что, в принципе, логично.
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    еще бы..
    вопрос только в том, может ли он оптимизировать саму функцию?
     
  10. IceStudent

    IceStudent Active Member

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

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    Про volatile:
    http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.4

    При использовании асм-вставок и оптимизации (-O3), у GCC часто сносит крышу (чем старше версия, тем чаще сносит). Поэтому, чтоб не отказываться вообще от оптимизации из-за асм вставок, можно сперва попробовать volatile, а если не поможет - тогда уже отключить оптимизацию.
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Quantum
    А gcc поддерживает управление компилятором из сорцов? Что-то вроде #pragma optimize в vc?

    Nouzui
    Ну как это нет? __asm _emit 0xCC
    The _emit Pseudoinstruction. И у нас проходили.
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    гм.. действительно есть
    просто я искал с двумя подчеркиваниями
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Nouzui
    оно есть еще с vc5, а скорее всего и раньше.
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    censored
    _emit еще в старом TC (Turbo-C) Борланда присутсвовал.
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ладно, ладно, сдаюсь )
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    два подчеркивания - это такой дурацкий стиль M$ =)
    всякие _emit, _stdcall, _cdecl, _asm и другие ключевые слова обычно используются с одним подчеркиванием..
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. unsigned char ret = 0xC3;
    2.  
    3. int main() {
    4.     ((void (*)())&ret)();
    5.     return 0;
    6. }
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    давайте устроим конкурс на самый извращенный метод +)
     
  20. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    реальны код из моего древнейшего проджекта:
    Код (Text):
    1.     _asm{
    2.             jmp short $+5
    3.             mov eax, 0310F0000h
    4.     }
    это RDTSC