Приоритеты арифметических операторов

Тема в разделе "WASM.BEGINNERS", создана пользователем edemko, 18 авг 2010.

  1. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Расставьте по рангу пожалуйста.

    ред: это ста-а-рая картинка
     
  2. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    также "and"
     
  3. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    ( )
    sar sal/shl shr ror rol rcl rcr
    and xor or neg not
    * / mod
    + -

    Кажется так...

    (ред) арифметический сдвиг забыл и плюс на второе место влупил )
     
  4. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Здрастуйте.
    Дошло спустя четыре месяца.
    Хочу поделиться и тут(на другом форуме тема).
    Не пойму деления, а именно _ulldiv PROC, метка big_divisor.
    Следовательно /(div) и %(mod) отсутствуют.
    Все детали в \calc\calc.inc.
    Вы поймете, что главная процедура предельно проста.
    Никаких вычислений сама не производит - все делают расширения пользователя.
    Там вы найдете макро, а в нем написано "nothing displayed, is this possible?"(ничего не показывает или я туплю).
    Откомментируйте строчку выше - выскакивает, мол метод ровен нулю, хотя нет.
    Кто знает, где я неправ.
    Пожалсто дайте теории (и)ли сам метод деления.
    С приоритетами большой спор, не знаю, писал с фасма и наугад.
    Предложите ваши методы времени вычисления(см. архив).
    Спасибо.

    Архив тут:
    http://code.google.com/p/fasmme/downloads/detail?name=calc.zip&can=2&q=
    или тут:
    http://code.google.com/p/fasmme/downloads/detail?name=calc.rar&can=2&q=
     
  5. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Реализация самых простых алгоритмов умножения и деления в столбик. Только на масме calc_engine.zip.
     
  6. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    http://board.flatassembler.net/topic.php?t=7852&start=5
    красиво, ага?
     
  7. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Oбрати внимание на скорость выполнения uint_div.
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    edemko
    Есть у меня книжка быстрые алгоритмы ... Так там много математических финтов описано.
    Пусть надо умножить два 64 битных числа a на b;
    y=a*b a=[a1:a0] b=[b1:b0] y=[y1:y0]

    V0=1*a1+1*a2;
    V1=1*a1+w1*a2;

    U0=1*b1+1*b2;
    U1=1*b1+w1*b2;

    R0=V0*U0
    R1=V1*U1

    y0=(1*R0+1*R1)/2
    y1=(1*R0+w1*R1)/2

    Так вот дальше тут вопрос оптимизации.

    Деление делается аналогично. Дальше выкладки пойдут в других обозначениях, так что если не совпадут с предыдущим так это потому что не связаны.

    a=y/b
    R0=1*y0+1*y1
    R1=1*y0+w1*y1

    U0=1*b0+1*b1
    U1=1*b0+w1*b1

    V0=R0/U0 // вот оно деление тут может быть потеря точности
    V1=R1/U1 // и алгоритм окажется приближенным

    a0=(1*V0+1*V1)/2
    a1=(1*V0+w1*V1)/2

    Здесь во всех выкладках w1=-1
    А да еще тут надо отследить переполнение при сложение. Для удобства деление на 2 можно делать сразу а не в конце.

    А доказательство что это правильно основано на высшей математике, так что тут врятли, кто его поймёт так что не привожу.
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    DoctorWho
    По поводу приоритетов. Не правильно. Возьмем or и and. Они аналогичны * и +
    Поэтому у or приоритет больше. А у not еще больше так как считается унарной операцией. А вообще в интернете легкой найти табличку приоритетов операций в C++. Только там не только битовые or, но и логический.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Тут мысли в слух. Есть предположение что деление можно сделать через инвертирование порядка бит, что будет выполняться еще быстрее.
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    /off
    Pavia
    Создайте новую тему (по вашей просьбе). А в этой я потру лишнее.
     
  12. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    ?

    можете?

    p.s.: некоторые речи без ответов, но это не значит, что я их упустил, спасибо

    мама спортила нервы, но метку упростил, тест версия
    Код (Text):
    1.                                 ;dvd     -> edx:ecx
    2.                                 ;dvs     -> ebx:eax
    3.                                 ;ebx:eax <- 0:quo
    4.                                 ;edx,ecx <- ?
    5.                                 ;flags   <- ?
    6.         push   edi
    7.         push   0 0              ;dvd.dump & dvs.dump
    8.         xchg   ecx,eax          ;edx:ecx/ebx:eax -> edx:eax/ebx:ecx
    9.         mov    edi,ecx
    10.         bsr    ecx,ebx
    11.         shrd   [esp],edi,cl     ;dvs.dump
    12.         shrd   edi,ebx,cl
    13.         shr    ebx,cl
    14.         shr    ebx,1
    15.         rcr    edi,1            ;dvs = $8000'0000..$ffff'ffff
    16.         rcr    dword[esp],1     ;dvs.dump
    17.         shrd   [esp+4],eax,cl   ;dvd.dump
    18.         shrd   eax,edx,cl
    19.         shr    edx,cl
    20.         shr    edx,1
    21.         rcr    eax,1            ;dvd = $8000'0000..$7fff'ffff'ffff'ffff
    22.         rcr    dword[esp+4],1   ;dvd.dump
    23.         div    edi              ;quo < 2^32
    24.         pop    ecx edx          ;dvs.dump & dvd.dump
    25.         cmp    edx,ecx
    26.         sbb    eax,ebx          ;) =
    27.         pop    edi
    28.  
    29. ; $ffff'ffff'ffff'ffff / $0000'0001'ffff'ffff
    вот так с помощью макро прожка получает поддержку 8 методов
    Код (Text):
    1. ; form: value {rolb,rolw,rold,rolq,rorb,rorw,rord,rorq} value
    2. macro rocknroll[name,instro]{
    3. forward label name
    4.         cmp     ebx,1
    5.         jne     name#_nok
    6.         cmp     eax,ebx
    7.         jne     name#_nok
    8.         add     edi,9+1
    9.         mov     cl,[ecx+9+1]
    10.       if ~name eq .rolq & ~name eq .rorq
    11.         instro  [edi],cl
    12.         add     edi,8
    13.         ;clc
    14.       else
    15.         and     cl,63
    16.         cmp     cl,32
    17.         mov     ebx,[edi+4]
    18.         mov     eax,[edi]
    19.         jb      name#_cl_b_32
    20.         xchg    ebx,eax
    21.         sub     cl,32
    22.   name#_cl_b_32:
    23.         mov     edx,ebx
    24.         instro  ebx,eax,cl
    25.         instro  eax,edx,cl
    26.         stosd
    27.         mov     eax,ebx
    28.         stosd
    29.         clc
    30.       end if
    31.         ret     0
    32.   name#_nok:
    33.         stc
    34.         ret     0
    35. }
    36. rocknroll .rolb, rol byte,\
    37.           .rolw, rol word,\
    38.           .rold, rol dword,\
    39.           .rorb, ror byte,\
    40.           .rorw, ror word,\
    41.           .rord, ror dword,\
    42.           .rolq, shld,\
    43.           .rorq, shrd
    44. purge rocknroll
    p.s.:
    value - значение
    form - форма
    dvd - делимое
    dvs - делитель
    quo - остаток
    dump - остаток
     
  13. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Конечный код:
    Код (Text):
    1. ; ebx:eax <- edx:ecx div ebx:eax
    2. ; edx:ecx <- edx:ecx mod ebx:eax
    3. ; flags   <- xor reg32,reg32
    4. proc .div
    5.         cmp     ebx,edx
    6.         ja      .div_result_0
    7.         jb      .div_result_!0
    8.         cmp     eax,ecx
    9.         jna     .div_result_!0
    10.   .div_result_0:                ;dvd < dvs
    11.         xor     ebx,ebx
    12.         xor     eax,eax
    13.         ret     0
    14.   .div_result_!0:
    15.         test    ebx,ebx
    16.         jnz     .div_divisor.h_nz
    17.         test    eax,eax
    18.         jnz     .div_divisor.l_nz
    19.         xor     edx,edx         ;dvs = 0
    20.         xor     ecx,ecx
    21.         ret     0
    22.   .div_divisor.l_nz:            ;sizeof.quo = 64 bit, sizeof.rem = 32 bit
    23.         mov     ebx,eax
    24.         mov     eax,edx
    25.         xor     edx,edx
    26.         div     ebx             ;quo.h
    27.         xchg    ecx,eax
    28.         div     ebx             ;quo.l
    29.         mov     ebx,ecx
    30.         mov     ecx,edx
    31.         xor     edx,edx
    32.         ret     0
    33.   .div_divisor.h_nz:            ;sizeof.quo = 32 bit, sizeof.rem = 64 bit
    34.         test   eax,eax
    35.         jnz    .div_none_z
    36.         mov    eax,edx
    37.         xor    edx,edx
    38.         div    ebx
    39.         xor    ebx,ebx
    40.         ret    0
    41.   .div_none_z:                  ;sizeof.quo = 32 bit, sizeof.rem = 64 bit
    42.         push   edi
    43.         push   edx ecx ebx eax
    44.         ;=======================;DIV=
    45.         push   0 0              ;dvd.dump & dvs.dump
    46.         mov    edi,eax
    47.         mov    eax,ecx          ;edx:ecx/ebx:eax -> edx:eax/ebx:edi
    48.         bsr    ecx,ebx
    49.         shrd   [esp],edi,cl     ;dvs.dump
    50.         shrd   edi,ebx,cl
    51.         shr    ebx,cl
    52.         shr    ebx,1
    53.         rcr    edi,1            ;dvs = $8000'0000..$ffff'ffff
    54.         rcr    dword[esp],1     ;dvs.dump
    55.         shrd   [esp+4],eax,cl   ;dvd.dump
    56.         shrd   eax,edx,cl
    57.         shr    edx,cl
    58.         shr    edx,1
    59.         rcr    eax,1            ;dvd = $8000'0000..$7fff'ffff'ffff'ffff
    60.         rcr    dword[esp+4],1   ;dvd.dump
    61.         div    edi              ;quo < 2^32
    62.         pop    ecx edx          ;dvs.dump & dvd.dump
    63.         cmp    edx,ecx
    64.         sbb    eax,ebx          ;) =
    65.         ;=======================;MOD=
    66.         mov    ebx,eax
    67.         pop    edx
    68.         mul    edx
    69.         pop    edi
    70.         pop    ecx
    71.         sub    ecx,eax          ;mod.l
    72.         mov    eax,edi
    73.         pop    edi
    74.         sbb    edi,edx
    75.         mul    ebx
    76.         sub    edi,eax
    77.         mov    edx,edi          ;mod.h
    78.         mov    eax,ebx
    79.         xor    ebx,ebx
    80.         pop    edi
    81.         ret     0               ;2010_12_28
    82. ; $ffff'ffff'ffff'ffff / $0000'0001'ffff'ffff
    83. ; $ffff'ffff'ffff'ffff / $ffff'ffff'ffff'fffe
    84. endp
    Отсюда поддержка новых операторов - 'div','/' и 'mod','%':
    Код (Text):
    1. ; form1: val div val
    2. ; form2: val  /  val
    3. .div1:  cmp     ebx,1
    4.         jne     .div1_nok
    5.         cmp     eax,ebx
    6.         jne     .div1_nok
    7.         mov     ebx,[ecx+9+1+4]
    8.         mov     eax,[ecx+9+1]
    9.         add     edi,10
    10.         mov     edx,[edi+4]
    11.         mov     ecx,[edi]
    12.         call    .div
    13.         stosd
    14.         mov     eax,ebx
    15.         stosd
    16.         ret     0
    17.   .div1_nok:
    18.         stc
    19.         ret     0
    20.  
    21. ; form1: val mod val
    22. ; form2: val  %  val
    23. .mod:   cmp     ebx,1
    24.         jne     .mod_nok
    25.         cmp     eax,ebx
    26.         jne     .mod_nok
    27.         mov     ebx,[ecx+9+1+4]
    28.         mov     eax,[ecx+9+1]
    29.         add     edi,10
    30.         mov     edx,[edi+4]
    31.         mov     ecx,[edi]
    32.         call    .div
    33.         mov     eax,ecx
    34.         stosd
    35.         mov     eax,edx
    36.         stosd
    37.         ret     0
    38.   .mod_nok:
    39.         stc
    40.         ret     0
     
  14. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Дописал.
    На сегодня поддерживает методы:
    Код (Text):
    1. movd  
    2. movq  
    3. packssd
    4. packssw
    5. packusw
    6. paddb  
    7. paddd  
    8. paddsb
    9. paddsw
    10. paddusb
    11. paddusw
    12. paddw  
    13. pand  
    14. pandn  
    15. pcmpeqb
    16. pcmpeqd
    17. pcmpeqw
    18. pcmpgtb
    19. pcmpgtd
    20. pcmpgtw
    21. pmaddwd
    22. pmulhw
    23. pmullw
    24. por    
    25. pslld  
    26. psllq  
    27. psllw  
    28. psrld  
    29. psrlq  
    30. psrlw  
    31. psubb  
    32. psubd  
    33. psubsb
    34. psubsw
    35. psubusb
    36. psubusw
    37. psubw  
    38. punpckh
    39. punpckh
    40. punpckh
    41. punpckl
    42. punpckl
    43. punpckl
    44. pxor  
    45.        
    46. +      
    47. -      
    48. bsf, bsl
    49. bsr    
    50. byte  
    51. sbyte  
    52. word  
    53. sword  
    54. dword  
    55. sdword
    56.        
    57. *      
    58. **    
    59. ***    
    60. /, div
    61. %, mod
    62.        
    63. &, and
    64. |, or  
    65. ^      
    66. xor    
    67.        
    68. rolb  
    69. rolw  
    70. rold  
    71. rorb  
    72. rorw  
    73. rord  
    74. rolq  
    75. rorq  
    76. >>>, sar
    77. <<, shl
    78. >>, shr
    79. shld  
    80. shrd  
    81. shlq  
    82. shrq  
    83.        
    84. ~, neg
    85. !, not
    86. 1/, rcp
    Следующие формы вывода результата:
    Код (Text):
    1. двоичный
    2. десятичный
    3. шестнадцатеричный
    4. знаковый десятичный
    5. строковый
    6. двоичная-в-десятичную дробь строкой
    Ссылка для загрузки:
    http://code.google.com/p/fasmme/downloads/detail?name=calc.rar&can=2&q=
     
  15. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Привет форум!
    В модуль добавлена тестовая поддержка fpu те. дробных чисел.
    Писалось от 1'го января 2011 года, падений покась не увидел.
    Но в прошлой версии ошибки были: разрешалась 16'ричная десятка в десятичной записи; неправильно обрабатывальсь пустые блоки типа ().
    Часть комментария к get_number:
    Код (Text):
    1. ; rus: считать строку в беззнаковое число
    2. ;      поддерживаются двоичные(нап. 0b), десятичные(нап. 0 или 0d или 0D), шестнадцатеричные(нап. $0 или 0x0 или 0X0), строковые(нап. '''', """", 'строка', "как'есть") qword-числа
    3. ;      нуль-завершенная-строка -> esi
    4. ;      временный буфер         -> edi
    5. ;      flags.df                -> 0
    6. ;      "невидимый" символ      -> ah
    7. ;        используйте для удобности чтения(1'024 итд.), если ноль - игнорится
    8. ;      eax,ebx,ecx,edx         <- ?
    9. ;      esi,edi                 <- сдвинуты за конец строки и полученого qword-числа соответственно
    10. ;      flags.cf                <- 1 если ошибка(в этом случае esi,edi также неопределены)
    11. ;
    12. ;      Д О Р А Б О Т К А :
    13. ;      функция поддерживает tbyte-числа, будучи совместимой с режимом qword выше, следовательно результат занимает 10 байт
    14. ;      поддерживаемые формы записи(нап.): 0b, 0d, 0D, ,d, ,D, .d, .D, 0,d, 0,D, 0.d, 0.D, 0,0d, 0,0D, 0.0d, 0.0D, 1,e+-1, 1.E--1d, ляпота, $0, 0x0, 0X0, "''строкой"""
    15. ;      eax.последний_бит(31)   -> выставьте в 1 для перехода в режим чисел с плавающей запятой
    16. ;      fpu.st5..7              -> вдостоверьтесь в их доступности
    17. ;      fpu.tos                 <- стек восстанавливает?ся
    18. ;
    19. proc get_number                             ;2011_01_01
    20.         lodsb
    21.         cmp     al,1
    22.         jnc     @f
    23.         ret     0                           ;конец строки так сразу
    24. @@:     xor     ecx,ecx                     ;число отфильтрованных символом
    25.         cmp     al,'"'
    26.         je      .raw                        ;как есть
    27.         cmp     al,"'"
    28.         je      .raw                        ;как есть
    29. ...
    Несколько неоттестированых методов fpu:
    Код (Text):
    1. ; form1:   -v2
    2. ; form2: v1-v2
    3. .fsub:  cmp     ebx,1
    4.         jne     .fsub_nok       ;ошибочно параметров справа
    5.         cmp     eax,ebx
    6.         ja      .fsub_nok       ;ошибочно параметров слева
    7.         lea     edi,[edi+11]    ;ок, пропустить пустышку
    8.         mov     al,2            ;сказать "о да, я число :)"
    9.         stosb
    10.         fld     tbyte[ecx+11+1] ;загрузить первый правый параметр
    11.         je      .fsub_pair      ;так параметров два? - будем вычитать
    12.         fchs                    ;иначе только изменим знак
    13.   .fsub_store:
    14.         fstp    tbyte[edi]      ;запишем значение
    15.         add     edi,10          ;сместим указатель за тело
    16.         ret     0               ;flags.cf очищен предыдущей инстро
    17.   .fsub_pair:
    18.         fld     tbyte[edi]      ;левый параметр
    19.         fsubrp                  ;левый - правый
    20.         jmp     .fsub_store     ;... это первый fpu-метод, (по)тому так много комментариев ...
    21.   .fsub_nok:
    22.         stc                     ;не вышло
    23.         ret     0
    24.  
    25. ; form1:   +v2
    26. ; form2: v1+v2
    27. .fadd:  cmp     ebx,1
    28.         jne     .fadd_nok
    29.         cmp     eax,ebx
    30.         ja      .fadd_nok
    31.         lea     edi,[edi+11]
    32.         mov     al,2
    33.         stosb
    34.         fld     tbyte[ecx+11+1]
    35.         je      .fadd_pair
    36.   .fadd_store:
    37.         fstp    tbyte[edi]
    38.         add     edi,10
    39.         ret     0
    40.   .fadd_pair:
    41.         fld     tbyte[edi]
    42.         faddp
    43.         jmp     .fadd_store
    44.   .fadd_nok:
    45.         stc
    46.         ret     0
    47.  
    48. ; form: v1/v2
    49. .fdiv:  cmp     ebx,1
    50.         jne     .fdiv_nok
    51.         cmp     eax,ebx
    52.         jne     .fdiv_nok
    53.         add     edi,11+1
    54.         xor     eax,eax
    55.         cmp     [ecx+11+1],eax
    56.         jnz     .fdiv_divisor_nz
    57.         cmp     [ecx+11+1+4],eax
    58.         jnz     .fdiv_divisor_nz
    59.         stosd
    60.         stosd
    61.         stosw
    62.         ret     0
    63.   .fdiv_divisor_nz:
    64.         fld     tbyte[edi]
    65.         fld     tbyte[ecx+11+1]
    66.         fdivp
    67.         fstp    tbyte[edi]
    68.         add     edi,10
    69.         ret     0
    70.   .fdiv_nok:
    71.         stc
    72.         ret     0
    73.  
    74. ; form: v1*v2
    75. .fmul:  cmp     ebx,1
    76.         jne     .fmul_nok
    77.         cmp     eax,ebx
    78.         jne     .fmul_nok
    79.         add     edi,11+1
    80.         fld     tbyte[edi]
    81.         fld     tbyte[ecx+11+1]
    82.         fmulp
    83.         fstp    tbyte[edi]
    84.         add     edi,10
    85.         ret     0
    86.   .fmul_nok:
    87.         stc
    88.         ret     0
    89.  
    90. ; form1: fld2pi
    91. ; form2: 2pi
    92. .fld2pi:fldpi
    93.         fldpi
    94.         faddp
    95. .store_fpu_constant:
    96.         mov     al,2
    97.         stosb
    98.         fstp    tbyte[edi]
    99.         add     edi,10
    100.         ret     0
    101. ; form1: fldpi
    102. ; form2: pi
    103. .fldpi: fldpi
    104.         jmp     .store_fpu_constant
    105. ; form1: fldl2t
    106. ; form2: l2t
    107. .fldl2t:fldl2t
    108.         jmp     .store_fpu_constant
    109. ; form1: fldlg2
    110. ; form2: lg2
    111. .fldlg2:fldlg2
    112.         jmp     .store_fpu_constant
    113.  
    114. ;form: lb v
    115. .flb:   fld1
    116.         jmp     .flbld
    117. ;form: ld v
    118. .fld:   fldlg2
    119. .flbld: cmp     ebx,1
    120.         jne     .flbld_nok
    121.         cmp     eax,ebx
    122.         jnc     .flbld_nok
    123.         mov     edi,ecx
    124.         mov     al,2
    125.         stosb
    126.         fld     tbyte[ecx+11+1]
    127.         fabs
    128.         fyl2x
    129.         fstp    tbyte[edi]
    130.         add     edi,10
    131.         ret     0
    132.   .flbld_nok:
    133.         stc
    134.         ret     0
    Пример подключения таких методов через макро:
    Код (Text):
    1. ...
    2. \;fpu
    3.   'fld2pi'     ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    4.   '2pi'        ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    5.   'pi2'        ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    6.   'pipi'       ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    7.   'fldpi'      ,.fldpi     ,0 + 'f' shl 8 + $8000'0000 ,\
    8.   'pi'         ,.fldpi     ,0 + 'f' shl 8 + $8000'0000 ,\
    9.   'fldl2t'     ,.fldl2t    ,0 + 'f' shl 8 + $8000'0000 ,\
    10.   'l2t'        ,.fldl2t    ,0 + 'f' shl 8 + $8000'0000 ,\
    11.   'fldlg2'     ,.fldlg2    ,0 + 'f' shl 8 + $8000'0000 ,\
    12.   'lg2'        ,.fldlg2    ,0 + 'f' shl 8 + $8000'0000 ,\
    13.   \
    14.   '-'          ,.fsub      ,0 + 'f' shl 8 ,\
    15.   '+'          ,.fadd      ,0 + 'f' shl 8 ,\
    16.   'lb'         ,.flb       ,0 + 'f' shl 8 ,\
    17.   'ld'         ,.fld       ,0 + 'f' shl 8 ,\
    18.   \
    19.   '/'          ,.fdiv      ,1 + 'f' shl 8 ,\
    20.   '*'          ,.fmul      ,1 + 'f' shl 8 ,\
    21.   \
    22.   '~'          ,.fsub      ,5 + 'f' shl 8 ,\
    23.   'neg'        ,.fsub      ,5 + 'f' shl 8
    24. ...
    Прошу(просить легко, но все же) администрацию информировать через почту при получений сообщений в личку.
    Если вы как-то хотите изменить calc, свяжитесь со мной для получения логина и пароля под ссылку выше(письма на rambler.ru прошу не изменять и от моего имении не отсылать).
    Спасибо.

    ...вас тоже с новым; сидел без инета :)

    ред.: манюнька ошибка была(при подлаживании строки нолями метка .raw на выходе в cl ложила ch, нужно movzx ecx,ch) - обновил.
     
  16. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Доброй ночи.
    Вот так сейчас оно выглядит.
    На картинке украинский.
    Изменить язык можно константой LANG, что в самом начале "calc.asm".
    Покамись их три: ENU, RUS, UKR.
    Помогите с языками.
    Привожу огрызок методов:
    Код (Text):
    1. \;fpu
    2.   'fld2pi'     ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    3.   '2pi'        ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    4.   'pi2'        ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    5.   'pipi'       ,.fld2pi    ,0 + 'f' shl 8 + $8000'0000 ,\
    6.   'fldl2t'     ,.fldl2t    ,0 + 'f' shl 8 + $8000'0000 ,\
    7.   'l2t'        ,.fldl2t    ,0 + 'f' shl 8 + $8000'0000 ,\
    8.   'fldlg2'     ,.fldlg2    ,0 + 'f' shl 8 + $8000'0000 ,\
    9.   'lg2'        ,.fldlg2    ,0 + 'f' shl 8 + $8000'0000 ,\
    10.   'fldpi'      ,.fldpi     ,0 + 'f' shl 8 + $8000'0000 ,\
    11.   'pi'         ,.fldpi     ,0 + 'f' shl 8 + $8000'0000 ,\
    12.   \
    13.   '-'          ,.fsub      ,0 + 'f' shl 8 ,\
    14.   '+'          ,.fadd      ,0 + 'f' shl 8 ,\
    15.   \
    16.   '/'          ,.fdiv      ,1 + 'f' shl 8 ,\
    17.   '*'          ,.fmul      ,1 + 'f' shl 8 ,\
    18.   \
    19.   'fabs'       ,.fabs      ,5 + 'f' shl 8 ,\
    20.   'abs'        ,.fabs      ,5 + 'f' shl 8 ,\
    21.   'fcos'       ,.fcos      ,4 + 'f' shl 8 ,\
    22.   'cos'        ,.fcos      ,4 + 'f' shl 8 ,\
    23.   'fsin'       ,.fsin      ,4 + 'f' shl 8 ,\
    24.   'sin'        ,.fsin      ,4 + 'f' shl 8 ,\
    25.   'fsqrt'      ,.fsqrt     ,4 + 'f' shl 8 ,\
    26.   'sqrt'       ,.fsqrt     ,4 + 'f' shl 8 ,\
    27.   'sr'         ,.fsqrt     ,4 + 'f' shl 8 ,\
    28.   'hyp'        ,.fhyp      ,4 + 'f' shl 8 ,\
    29.   'lb'         ,.flb       ,4 + 'f' shl 8 ,\
    30.   'ld'         ,.fld       ,4 + 'f' shl 8 ,\
    31.   'log'        ,.flog      ,4 + 'f' shl 8 ,\
    32.   'power'      ,.fpower    ,4 + 'f' shl 8 ,\
    33.   'pow'        ,.fpower    ,4 + 'f' shl 8 ,\
    34.   '**'         ,.fpower    ,4 + 'f' shl 8 ,\
    35.   '^'          ,.fpower    ,4 + 'f' shl 8 ,\
    36.   \
    37.   '~'          ,.fsub      ,5 + 'f' shl 8 ,\
    38.   'neg'        ,.fsub      ,5 + 'f' shl 8
     
  17. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Добрый вечер.
    Дописал недостающий комментарий, добавилось пару операторов, оформил также библиотекой.
    Пример вызова:
    Код (Text):
    1. format pe gui 4.0
    2. include 'win32ax.inc'
    3.  
    4.  
    5.  
    6. section '' code executable import readable writable
    7.   library kernel32,'kernel32.dll',\
    8.           user32,'user32.dll',\
    9.           calc.dll,'..\calc\dll\calc.dll'
    10.  
    11.   import calc.dll,\
    12.          calc,'calc',\
    13.          get_equates,'get_equates'
    14.  
    15.   include 'api\kernel32.inc'
    16.   include 'api\user32.inc'
    17.  
    18.  
    19.   entry $
    20.     invoke  GetTickCount
    21.     mov     esi,eax
    22. ;    mov     ecx,1'000
    23. ;    @@:
    24.         invoke  calc,text,temp,<invoke get_equates>,0,0+"'",0+'dec',not 'q'
    25. ;    loop    @b
    26.     invoke  GetTickCount
    27.     sub     eax,esi
    28. ;    hlt
    29.         cinvoke wsprintf,lpOut,lpFmt,text,eax,ebx
    30.         invoke  MessageBoxA,0,lpOut,0,0
    31.         invoke  ExitProcess,0
    32.  
    33.  
    34.  
    35. lpFmt db '"%s"',13,10,'-> %u ms ->',13,10,'"%s"',0
    36.  
    37. text db '< (((((((((((((((((((((((((((((2^2^3)))))))))))))))))))))))))))))',0
    38. temp rb ($-text)*11 +1
    39.  
    40. lpOut rb MAX_PATH
    Ну и курсовик на 5 сдал(восьмой зачет).
    Спасибо за вдохновение.
    Удачи.
    Мы кажись все.
    Сорс по той же ссылке.
     
  18. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Здарова.
    Добавил подробное описание + косметические изменения.
    Покамись два языка: английский и украинский.
    -Почему и не на русском?
    -Не знаю, не знаю, не вините.
    Спасибо.
    /
    Сессия кончилась и гуляю до 31'го января.
    http://fasmme.googlecode.com/files/calc.rar
    Код (Text):
    1. enu: calc - a tiny calculator, based on equates
    2.  
    3.  
    4.  
    5.  
    6.     -----
    7.     ideas
    8.     -----
    9.     - fasm's built-in calculator by Tomasz Grysztar
    10.     - Total Calculator by logosman
    11.     - calculator by code_grinder
    12.     - calculator(Чиста Калькулятор) by avtlab
    13.     - calculator by MS
    14.  
    15.  
    16.  
    17.  
    18.     ----------
    19.     written in
    20.     ----------
    21.     fasm
    22.  
    23.  
    24.  
    25.  
    26.     ---------
    27.     main file
    28.     ---------
    29.     calc.inc
    30.     depends on an include: 'macro\proc32.inc'
    31.  
    32.  
    33.  
    34.  
    35.     ---------
    36.     main proc
    37.     ---------
    38.     calc in the main file
    39.     start from there if you are a developper
    40.  
    41.  
    42.  
    43.  
    44.     -------
    45.     machine
    46.     -------
    47.     32bits or compatible, with fpu(if used) and mmx(if used)
    48.  
    49.  
    50.  
    51.  
    52.     -------------
    53.     optional dirs
    54.     -------------
    55.     - dll, Windows dynamic link library with main function and relatives exported
    56.     - exe, Windows executable using calc.inc
    57.       set LANG constant there in a source if required
    58.  
    59.  
    60.  
    61.  
    62.     ---------
    63.     feed back
    64.     ---------
    65.     edemko@rambler.ru
    66.  
    67.  
    68.  
    69.  
    70.     ---------
    71.     operators
    72.     ---------
    73.     Operators of MMX.
    74.     MMX support so that required.
    75.     The program must be in a QWord mode.
    76.     Priority: 0.
    77.     Notation: v op v.
    78.     Detailed info about a one can be found at Intel and AMD docs.
    79.     Here they are:
    80.       movd, movq, packssdw, packsswb, packuswb, paddb ,paddd, paddsb, paddsw, paddusb, paddusw, paddw,
    81.       pand, pandn, pcmpeqb, pcmpeqd ,pcmpeqw, pcmpgtb, pcmpgtd, pcmpgtw, pmaddwd, pmulhw, pmullw, por, pslld,
    82.       psllq, psllw, psrld, psrlq, psrlw, psubb, psubd, psubsb, psubsw, psubusb, psubusw, psubw, punpckhbw,
    83.       punpckhdq, punpckhwd, punpcklbw, punpckldq, punpcklwd, pxor.
    84.                  |             |                       |
    85.          priority-----operator------possible notations------explanation
    86.                  |    + aliases|    'op' means operator|
    87.                  |             |    'v'  means value   |
    88.     QWord-mode operators.
    89.          0-------------------------------------------------------------
    90.                  |    +        |    v op v             |    adds two values
    91.                  |             |      op v             |
    92.                  |             |                       |
    93.                  |    -        |    v op v             |    subtracts two values or
    94.                  |             |      op v             |    negates a value(subtracts it from zero)
    95.                  |             |                       |
    96.                  |    bsf      |      op v             |    searches for a 1st bit=1 starting from the right, counts from 1,2...
    97.                  |    bsl      |                       |
    98.                  |             |                       |
    99.                  |    bsr      |      op v             |    searches for a 1st bit=1 starting from the left, counts from 1,2...
    100.                  |             |                       |
    101.                  |    byte     |      op v             |    fails if a value not in $00..$ff
    102.                  |             |                       |
    103.                  |    sbyte    |      op v             |    fails if a value not in -$80..+$7f
    104.                  |             |                       |
    105.                  |    word     |      op v             |    fails if a value not in $0000..$ffff
    106.                  |             |                       |
    107.                  |    sword    |      op v             |    fails if a value not in -$8000..+$7fff
    108.                  |             |                       |
    109.                  |    dword    |      op v             |    fails if a value not in $0000'0000..$ffff'ffff
    110.                  |             |                       |
    111.                  |    sdword   |      op v             |    fails if a value not in -$8000'0000..+$7fff'ffff
    112.          1-------------------------------------------------------------
    113.                  |    *        |    v op v             |    gets unsigned product in edx:ecx:ebx:eax, returns ebx:eax
    114.                  |             |                       |
    115.                  |    **       |    v op v             |    gets unsigned product in edx:ecx:ebx:eax, returns ecx:ebx
    116.                  |             |                       |
    117.                  |    ***      |    v op v             |    gets unsigned product in edx:ecx:ebx:eax, returns edx:ecx
    118.                  |             |                       |
    119.                  |    /        |    v op v             |    divides unsigned
    120.                  |    div      |                       |
    121.          2-------------------------------------------------------------
    122.                  |    %        |    v op v             |    returns unsigned division's remainder
    123.                  |    mod      |                       |
    124.          3-------------------------------------------------------------
    125.                  |    &        |    v op v             |    bitwise AND of two values
    126.                  |    and      |                       |
    127.                  |             |                       |
    128.                  |    |        |    v op v             |    bitwise OR of two values
    129.                  |    or       |                       |
    130.                  |             |                       |
    131.                  |    ^        |    v op v             |    bitwise EXCLUSIVE OR of two values
    132.                  |    xor      |                       |
    133.          4-------------------------------------------------------------
    134.                  |    rolb     |    v op v             |    rotates byte, 7 bits of rotate counter used only
    135.                  |             |                       |
    136.                  |    rolw     |    v op v             |    rotates word, 15 bits of rotate counter used only
    137.                  |             |                       |
    138.                  |    rold     |    v op v             |    rotates dword, 31 bits of rotate counter used only
    139.                  |             |                       |
    140.                  |    rorb     |    v op v             |    rotates byte, 7 bits of rotate counter used only
    141.                  |             |                       |
    142.                  |    rorw     |    v op v             |    rotates word, 15 bits of rotate counter used only
    143.                  |             |                       |
    144.                  |    rord     |    v op v             |    rotates dword, 31 bits of rotate counter used only
    145.                  |             |                       |
    146.                  |    rolq     |    v op v             |    rotates qword, 63 bits of rotate counter used only
    147.                  |             |                       |
    148.                  |    rorq     |    v op v             |    rotates qword, 63 bits of rotate counter used only
    149.                  |             |                       |
    150.                  |    >>>      |    v op v             |    shifts arithmetically right, 63 bits of counter used only
    151.                  |    sar      |                       |
    152.                  |             |                       |
    153.                  |    <<       |    v op v             |    shifts left, 63 bits of counter used only
    154.                  |    shl      |                       |
    155.                  |             |                       |
    156.                  |    >>       |    v op v             |    shifts right, 63 bits of counter used only
    157.                  |    shr      |                       |
    158.                  |             |                       |
    159.                  |    shld     |    op v v v           |    equals shld of a 32bit machine
    160.                  |             |                       |
    161.                  |    shrd     |    op v v v           |    equals shrd of a 32bit machine
    162.                  |             |                       |
    163.                  |    shlq     |    op v v v           |    equals shld of a 64bit machine
    164.                  |             |                       |
    165.                  |    shrq     |    op v v v           |    equals shrd of a 64bit machine
    166.          5-------------------------------------------------------------
    167.                  |    ~        |    op v               |    negates a value
    168.                  |    neg      |                       |
    169.                  |             |                       |
    170.                  |    !        |    op v               |    invert bits
    171.                  |    not      |                       |
    172.                  |             |                       |
    173.                  |    1/       |    op v               |    count unnormalized reciprocal, 0 returned for 0, 1 for 1
    174.                  |    rcp      |                       |    normalize a number to replace div with fast mul: 65'535 *** rcp 10 etc
    175.     TByte-mode operators.
    176.     FPU required.
    177.          0-------------------------------------------------------------
    178.                  |    e        |    op                 |    put e(2.71...)
    179.                  |             |                       |
    180.                  |    l2e      |    op                 |    put log(2;e)
    181.                  |             |                       |
    182.                  |    l2t      |    op                 |    put log(2;10)
    183.                  |             |                       |
    184.                  |    le2      |    op                 |    put log(e;2)
    185.                  |             |                       |
    186.                  |    let      |    op                 |    put log(e;10)
    187.                  |             |                       |
    188.                  |    lt2      |    op                 |    put log(10;2)
    189.                  |             |                       |
    190.                  |    lte      |    op                 |    put log(10;e)
    191.                  |             |                       |
    192.                  |    pi       |    op                 |    put 3.14...
    193.                  |             |                       |
    194.                  |    pipi     |    op                 |    put double pi
    195.                  |             |                       |
    196.                  |    sr2      |    op                 |    put square root of 2
    197.                  |             |                       |
    198.                  |    srpi     |    op                 |    put square root of pi
    199.                  |             |                       |
    200.                  |    +        |  v op v               |    add values
    201.                  |             |    op v               |
    202.                  |             |                       |
    203.                  |    -        |  v op v               |    subtract values
    204.                  |             |    op v               |
    205.          1-------------------------------------------------------------
    206.                  |    *        |  v op v               |    multiply values
    207.                  |             |                       |
    208.                  |    /        |  v op v               |    divide values
    209.          4-------------------------------------------------------------
    210.                  |    cotan    |    op v               |    compute co-tangent of radians
    211.                  |    ctg      |                       |
    212.                  |             |                       |
    213.                  |    deg      |    op v               |    radians to degrees
    214.                  |             |                       |
    215.                  |    fabs     |    op v               |    absolute value
    216.                  |    abs      |                       |
    217.                  |             |                       |
    218.                  |    fcos     |    op v               |    compute cosine of radians
    219.                  |    cos      |                       |
    220.                  |             |                       |
    221.                  |    fsin     |    op v               |    compute sine of radians
    222.                  |    sin      |                       |
    223.                  |             |                       |
    224.                  |    fsqrt    |    op v               |    compute square root = v^(1/2)
    225.                  |    sqrt     |                       |
    226.                  |    sr       |                       |
    227.                  |             |                       |
    228.                  |    hyp      |    op v v             |    compute hypotenuse of two legs
    229.                  |             |                       |
    230.                  |    int      |    op v               |    chop fraction leaving integral
    231.                  |             |                       |
    232.                  |    lb       |    op v               |    equals log(2 v), log 2 v, etc ;log is slower
    233.                  |             |                       |
    234.                  |    ld       |    op v               |    = log 10 v                    ;log is slower
    235.                  |             |                       |
    236.                  |    ln       |    op v               |    = log e v                     ;log is slower
    237.                  |             |                       |
    238.                  |    leg      |    op v v             |    get leg from a hypotenuse and known leg
    239.                  |             |                       |
    240.                  |    log      |    op v v             |    compute logarithm of an arbitrary base
    241.                  |             |                       |
    242.                  |    power    |  v op v               |    raise a value to some power
    243.                  |    pow      |                       |
    244.                  |    **       |                       |
    245.                  |    ^        |                       |
    246.                  |             |                       |
    247.                  |    rad      |    op v               |    degrees to radians
    248.                  |             |                       |
    249.                  |    tan      |    op v               |    compute tangent of radians
    250.                  |    tg       |                       |
    251.          5-------------------------------------------------------------
    252.                  |    ~        |  v op v               |    subtract values
    253.                  |    neg      |    op v               |
    254.          --------------------------------------------------------------
    255.  
    256.  
    257.  
    258.  
    259.     -----------
    260.     recognition
    261.     -----------
    262.     Blanks(TAB, LF, CR, SPACE) ignored.
    263.     This allowes writing v op v, v   op   v, etc expressions, and vopv as well.
    264.     Why? Do not we use 2-1, 1+1 etc forms, the answer is.
    265.     Braces () stored as is, numbers put in a qword or a tbyte form, depending on the mode.
    266.     Remember that mmx-operators allowed in qword mode and mmx support required.
    267.     In an fpu mode numbers stored as ten byte sequences.
    268.     Binary, decimal, hexadecimal, string form of numbers supported.
    269.     Fpu mode adds exponential one.
    270.     Binary numbers must end with b or B, decimal may end with nothing or d or D, hexadecimal must be preceded with 0x or 0X or $.
    271.     String numbers must start with " or '.
    272.     Every "" or '' depending on how a string was started will be witten as " or ' respectively.
    273.     Of course, simple "" or '' means zero.
    274.     But """hi" or 'hi''' equal '"hi' and "hi'" respectively.
    275.     If ' is inside a non-string number, it's ignored proving number readability for your sake.
    276.     So 0'b or 00''b or 0'000' mean zero.
    277.     A 0b', 0d' etc case will raise an error as a string expected, but 0', 0x00' etc not.
    278.     Exponential numbers additionally may have a fraction(after , or .) and 10's power(after e or E).
    279.     They, if you really want, can end with d or D too.
    280.     , or . means zero.
    281.     Examples of numbers: 0b, 0B, 0, 0d, 0D, 0x0, 0X0, $0, ,, ., 0.d, .D'e +- 1, 1.024'048'e-+-1D, 'string', "string", '1''34', "1""34", '', "".
    282.     Use bin or hex or string form to represent floats as is.
    283.     Integer floats of a qword range stored exactly too, this also applies some unique numbers like powers of two.
    284.  
    285.     Operators, though, will be found first: operator - number - operator...
    286.     After a one picked, a longer one can substitute it only.
    287.     Exempli gratia shld can substitute shl an so on.
    288.     Normally case of symbols ignored and ShL with shL treated same.
    289.  
    290.  
    291.  
    292.  
    293.     ---------
    294.     execution
    295.     ---------
    296.     After operators, braces, values got, an execution stage starts.
    297.     It calculates block a block skipping any empty ones () ()() etc.
    298.     For a (((()))) case queueing looks the way: (4th(3rd(2nd(1st)))).
    299.     For a (()(())) case queueing looks the way: (4th(1st)(3rd(2nd))).
    300.     Current operators set always expect a value to be passed to it.
    301.     Thus (+) or alike raise an error as there are no params, still the block must be counted.
    302.     Numbers like (number1(number2)) etc will be just unbraced into number1number2.
    303.  
    304.     Default method/operator execution is > id est left to the right.
    305.     Putting < or > as a first byte of text overrides the setting.
    306.     Hence: 1 shl 2 shl 3 -> (1 shl 2) shl 3 -> 4 shl 3  -> 32.
    307.     But : <1 shl 2 shl 3 -> 1 shl (2 shl 3) -> 1 shl 16 -> 65'536.
    308.  
    309.     It also results into --1 etc disallowance(only bigger priority executed first) and < --1 acceptance(bigger and equal priorities).
    310.     This makes putting same operations ander different names and priorities.
    311.     sr2 puts square root of 2.
    312.     But there is a command sr, and you can write sr2.1.
    313.     In this case it will be decoded as sr2 .1.
    314.     So write sqrt2.1 or sr 2.1 etc.
    315.     This is because of the fact operators searched first.
    316.  
    317.  
    318.  
    319.  
    320. ukr: calc - крихітний модульний калькулятор
    321.  
    322.  
    323.  
    324.  
    325.     ----
    326.     ідеї
    327.     ----
    328.     - fasm'мів вбудований калькулятор від Tomasz Grysztar
    329.     - Total Calculator від logosman
    330.     - calculator від code_grinder
    331.     - calculator(Чиста Калькулятор) від avtlab
    332.     - calculator від MS
    333.  
    334.  
    335.  
    336.  
    337.     -------
    338.     компило
    339.     -------
    340.     фасм
    341.  
    342.  
    343.  
    344.  
    345.     -------------
    346.     головний файл
    347.     -------------
    348.     calc.inc
    349.     передувати має include: 'macro\proc32.inc'
    350.  
    351.  
    352.  
    353.  
    354.     -----------------
    355.     головна процедура
    356.     -----------------
    357.     calc, що в головному файлі, якщо цікаві подробиці розробки
    358.  
    359.  
    360.  
    361.  
    362.     ------
    363.     машина
    364.     ------
    365.     32біт чи сумісна, fpu(якщо вик.) та mmx(якщо вик.)
    366.  
    367.  
    368.  
    369.  
    370.     ----------------
    371.     що то за папки ?
    372.     ----------------
    373.     - dll, бібліотека Віндоз з експортованою головною функцією та деякими корисними
    374.     - exe, програма, демонструюча роботу calc.inc
    375.       виставіть константу LANG під вашу мову
    376.  
    377.  
    378.  
    379.  
    380.     ------
    381.     звязок
    382.     ------
    383.     edemko@rambler.ru
    384.  
    385.  
    386.  
    387.  
    388.     ---------
    389.     оператори
    390.     ---------
    391.     Оператори MMX.
    392.     MMX підтримка відтак потрібна.
    393.     Програма має перебувати в режимі QWord.
    394.     Пріоритет для всіх: 0.
    395.     Запис для всіх: v op v.
    396.     Доки Intel та AMD проведуть тебе тернистими стежками.
    397.     Ось вони:
    398.       movd, movq, packssdw, packsswb, packuswb, paddb ,paddd, paddsb, paddsw, paddusb, paddusw, paddw,
    399.       pand, pandn, pcmpeqb, pcmpeqd ,pcmpeqw, pcmpgtb, pcmpgtd, pcmpgtw, pmaddwd, pmulhw, pmullw, por, pslld,
    400.       psllq, psllw, psrld, psrlq, psrlw, psubb, psubd, psubsb, psubsw, psubusb, psubusw, psubw, punpckhbw,
    401.       punpckhdq, punpckhwd, punpcklbw, punpckldq, punpcklwd, pxor.
    402.                  |             |                       |
    403.          ранг---------оператор------форми запису------------тлумачення-
    404.                  |    + прото  |    'op' =  оператор   |
    405.                  |             |    'v'  = вираз/число |
    406.     QWord-оператори.
    407.          0-------------------------------------------------------------
    408.                  |    +        |    v op v             |    додати два числа
    409.                  |             |      op v             |
    410.                  |             |                       |
    411.                  |    -        |    v op v             |    відняти два числа
    412.                  |             |      op v             |
    413.                  |             |                       |
    414.                  |    bsf      |      op v             |    пошук першого ненульового правого біта, рахунок з одиниці
    415.                  |    bsl      |                       |
    416.                  |             |                       |
    417.                  |    bsr      |      op v             |    пошук першого ненульового лівого біта, рахунок з одиниці
    418.                  |             |                       |
    419.                  |    byte     |      op v             |    вдостовіритись, що число в межах $00..$ff
    420.                  |             |                       |
    421.                  |    sbyte    |      op v             |    вдостовіритись, що число в межах -$80..+$7f
    422.                  |             |                       |
    423.                  |    word     |      op v             |    вдостовіритись, що число в межах $0000..$ffff
    424.                  |             |                       |
    425.                  |    sword    |      op v             |    вдостовіритись, що число в межах -$8000..+$7fff
    426.                  |             |                       |
    427.                  |    dword    |      op v             |    вдостовіритись, що число в межах $0000'0000..$ffff'ffff
    428.                  |             |                       |
    429.                  |    sdword   |      op v             |    вдостовіритись, що число в межах -$8000'0000..+$7fff'ffff
    430.          1-------------------------------------------------------------
    431.                  |    *        |    v op v             |    добуток в edx:ecx:ebx:eax, повернути ж ebx:eax
    432.                  |             |                       |
    433.                  |    **       |    v op v             |    добуток в edx:ecx:ebx:eax, повернути ж ecx:ebx
    434.                  |             |                       |
    435.                  |    ***      |    v op v             |    добуток в edx:ecx:ebx:eax, повернути ж edx:ecx
    436.                  |             |                       |
    437.                  |    /        |    v op v             |    беззнакове ділення
    438.                  |    div      |                       |
    439.          2-------------------------------------------------------------
    440.                  |    %        |    v op v             |    залишок беззнакового ділення
    441.                  |    mod      |                       |
    442.          3-------------------------------------------------------------
    443.                  |    &        |    v op v             |    побітове множення
    444.                  |    and      |                       |
    445.                  |             |                       |
    446.                  |    |        |    v op v             |    побітове І
    447.                  |    or       |                       |
    448.                  |             |                       |
    449.                  |    ^        |    v op v             |    побітове ВИКЛЮЧЕННЯ
    450.                  |    xor      |                       |
    451.          4-------------------------------------------------------------
    452.                  |    rolb     |    v op v             |    кручення, задіяно 7 біт лічильника
    453.                  |             |                       |
    454.                  |    rolw     |    v op v             |    кручення, задіяно 15 біт лічильника
    455.                  |             |                       |
    456.                  |    rold     |    v op v             |    кручення, задіяно 31 біт лічильника
    457.                  |             |                       |
    458.                  |    rorb     |    v op v             |    кручення, задіяно 7 біт лічильника
    459.                  |             |                       |
    460.                  |    rorw     |    v op v             |    кручення, задіяно 15 біт лічильника
    461.                  |             |                       |
    462.                  |    rord     |    v op v             |    кручення, задіяно 31 біт лічильника
    463.                  |             |                       |
    464.                  |    rolq     |    v op v             |    кручення, задіяно 63 біт лічильника
    465.                  |             |                       |
    466.                  |    rorq     |    v op v             |    кручення, задіяно 63 біт лічильника
    467.                  |             |                       |
    468.                  |    >>>      |    v op v             |    знаковий здвиг в право, задіяно 63 біт лічильника
    469.                  |    sar      |                       |
    470.                  |             |                       |
    471.                  |    <<       |    v op v             |    здвиг в ліво, задіяно 63 біт лічильника
    472.                  |    shl      |                       |
    473.                  |             |                       |
    474.                  |    >>       |    v op v             |    здвиг в право, задіяно 63 біт лічильника
    475.                  |    shr      |                       |
    476.                  |             |                       |
    477.                  |    shld     |    op v v v           |    = shld 32бітної машини
    478.                  |             |                       |
    479.                  |    shrd     |    op v v v           |    = shrd 32бітної машини
    480.                  |             |                       |
    481.                  |    shlq     |    op v v v           |    = shld 64бітної машини
    482.                  |             |                       |
    483.                  |    shrq     |    op v v v           |    = shrd 64бітної машини
    484.          5-------------------------------------------------------------
    485.                  |    ~        |    op v               |    відняти число від нуля
    486.                  |    neg      |                       |
    487.                  |             |                       |
    488.                  |    !        |    op v               |    інверсія біт
    489.                  |    not      |                       |
    490.                  |             |                       |
    491.                  |    1/       |    op v               |    отримати 1/дільник, 0 для 0, 1 для 1
    492.                  |    rcp      |                       |    нормалізуйте число для заміни повільного div швидшим mul: 65'535 *** rcp 10 тощо
    493.     TByte-оператори.
    494.     Здається завжди, використовується fpu.
    495.          0-------------------------------------------------------------
    496.                  |    e        |    op                 |    вписати e(2.71...)
    497.                  |             |                       |
    498.                  |    l2e      |    op                 |    вписати log(2;e)
    499.                  |             |                       |
    500.                  |    l2t      |    op                 |    вписати log(2;10)
    501.                  |             |                       |
    502.                  |    le2      |    op                 |    вписати log(e;2)
    503.                  |             |                       |
    504.                  |    let      |    op                 |    вписати log(e;10)
    505.                  |             |                       |
    506.                  |    lt2      |    op                 |    вписати log(10;2)
    507.                  |             |                       |
    508.                  |    lte      |    op                 |    вписати log(10;e)
    509.                  |             |                       |
    510.                  |    pi       |    op                 |    вписати 3.14...
    511.                  |             |                       |
    512.                  |    pipi     |    op                 |    вписати double pi
    513.                  |             |                       |
    514.                  |    sr2      |    op                 |    вписати корінь квадратний 2
    515.                  |             |                       |
    516.                  |    srpi     |    op                 |    вписати корінь квадратний пі
    517.                  |             |                       |
    518.                  |    +        |  v op v               |    додавання
    519.                  |             |    op v               |
    520.                  |             |                       |
    521.                  |    -        |  v op v               |    віднімання(змінити знак і додати)
    522.                  |             |    op v               |
    523.          1-------------------------------------------------------------
    524.                  |    *        |  v op v               |    множення
    525.                  |             |                       |
    526.                  |    /        |  v op v               |    ділення
    527.          4-------------------------------------------------------------
    528.                  |    cotan    |    op v               |    котангенс радіан
    529.                  |    ctg      |                       |
    530.                  |             |                       |
    531.                  |    deg      |    op v               |    радіани в градуси
    532.                  |             |                       |
    533.                  |    fabs     |    op v               |    модуль(абс. знач.)
    534.                  |    abs      |                       |
    535.                  |             |                       |
    536.                  |    fcos     |    op v               |    косинус радіан
    537.                  |    cos      |                       |
    538.                  |             |                       |
    539.                  |    fsin     |    op v               |    синус радіан
    540.                  |    sin      |                       |
    541.                  |             |                       |
    542.                  |    fsqrt    |    op v               |    корінь квадратний = v^(1/2)
    543.                  |    sqrt     |                       |
    544.                  |    sr       |                       |
    545.                  |             |                       |
    546.                  |    hyp      |    op v v             |    гіпотенуза за двома катетами
    547.                  |             |                       |
    548.                  |    int      |    op v               |    відкинути дріб, вернути ціле
    549.                  |             |                       |
    550.                  |    lb       |    op v               |    = log(2 v), log 2 v, тощо ;log повільніший
    551.                  |             |                       |
    552.                  |    ld       |    op v               |    = log 10 v                ;log повільніший
    553.                  |             |                       |
    554.                  |    ln       |    op v               |    = log e v                 ;log повільніший
    555.                  |             |                       |
    556.                  |    leg      |    op v v             |    катет за гіпотенузою та відомим катетом
    557.                  |             |                       |
    558.                  |    log      |    op v v             |    логарифм за дов. базою
    559.                  |             |                       |
    560.                  |    power    |  v op v               |    в степінь
    561.                  |    pow      |                       |
    562.                  |    **       |                       |
    563.                  |    ^        |                       |
    564.                  |             |                       |
    565.                  |    rad      |    op v               |    градуси в радіани
    566.                  |             |                       |
    567.                  |    tan      |    op v               |    тангенс радіан
    568.                  |    tg       |                       |
    569.          5-------------------------------------------------------------
    570.                  |    ~        |  v op v               |    віднімання
    571.                  |    neg      |    op v               |
    572.          --------------------------------------------------------------
    573.  
    574.  
    575.  
    576.  
    577.     -------------
    578.     розпізнавання
    579.     -------------
    580.     Пустоти(TAB=забій, LF=обрив лінії, CR=повернення каретки, SPACE=пробіл) ігноруються.
    581.     Звідси v op v, v   op   v, vopv тощо однакові.
    582.     Чому? Чи не пишемо 2-1, 1+1,.. ?
    583.     Дужки () сприймаються як є, числа зчитуються в qword чи tbyte форму залежно від режиму.
    584.     Памятай, що mmx-оператори дозволені в qword-режимі і mmx-підтримка очікується.
    585.     В fpu-режимі числа зберігаються як послідовності з десяти байт.
    586.     Двійкова, десяткова, шістнадцяткова, строкова форми чисел дозволені.
    587.     Fpu-режим додатково підтримує експоненціальну.
    588.     Двійкові числа мають завершуватись на b чи B, десяткові на d чи D або ніяк, шістнадцятковим передує 0x чи 0X або $.
    589.     Рядкові починай з " чи '.
    590.     Кожна пара "" або '', залежно від кавички стартуючої рядок, пропишеться " чи ' відповідно.
    591.     Звісно, прості "" та '' значить нуль.
    592.     Але """хохо" чи 'хохо''' рівно '"хохо' та "хохо'" відповідно.
    593.     ' в межах чисел ігнорується і слугує для зручності читання.
    594.     Отож 0'b чи 00''b або 0'000' значить нуль.
    595.     Проте 0b', 0d' тощо випадки викличуть помилку, бо очікується рядок, але 0', 0x00' тощо ні.
    596.     Експоненціальні числа можуть включати дріб(після , чи .) та 10'ву степінь(після e або E).
    597.     Якщо кортить, можна дописати d чи D в кінці.
    598.     , та . рівно нулю.
    599.     Зразки чисел: 0b, 0B, 0, 0d, 0D, 0x0, 0X0, $0, ,, ., 0.d, .D'e +- 1, 1.024'048'e-+-1D, 'рядок', "рядок", '1''34', "1""34", '', "".
    600.     Використовуй двійкову, шістнадцяткову, рядкову нотації для задання дійсного числа з беззаперечною точністю.
    601.     Цілі qword-числа в fpu-режимі, а також степені двійки зберігаються точно.
    602.  
    603.     Оператори всеж шукаються першими: оператор - число - оператор...
    604.     Програма намагається підібрати найдовший оператор.
    605.     Наприклад shl може змінити на shld, якщо той є.
    606.     Регістр символів неважливий, тому ShL та shL вважаються однаковими.
    607.  
    608.  
    609.  
    610.  
    611.     ---------
    612.     виконання
    613.     ---------
    614.     Після розпізнавання йде виконання.
    615.     Опускаючи пусті () ()() тощо, обчислюється значення кожного блоку.
    616.     Чергування для (((()))) виглядає так: (4тий(3тій(2гий(1ший)))).
    617.     Чергування для (()(())) виглядає так: (4тий(1ший)(3тій(2гий))).
    618.     Поточний набір операторів не передбачає відсутності операндів(параметрів).
    619.     Із-за цього (+) тощо викликають помилку.
    620.     Числа наподобі (число1(число2)) запишуться в число1число2.
    621.  
    622.     За умовчуванням порядок виклику методів=операторів має такий напрямок >, тобто з ліва на право.
    623.     Але < чи > на самому початку рядка змінює настройку.
    624.     Звідси: 1 shl 2 shl 3 -> (1 shl 2) shl 3 -> 4 shl 3  -> 32.
    625.     Хоча : <1 shl 2 shl 3 -> 1 shl (2 shl 3) -> 1 shl 16 -> 65'536.
    626.  
    627.     Така особливість --1 не пропустить(лише оператор більшого рангу може дістатись числа, відкинувши молодші на потім), а < --1 дозволить(щоб лівіший оператор перескочив через лівий, йому(лівішому) досить мати той же ранг).
    628.     Шняга сприє появі ідентичних операторів під іншими іменами та пріоритетеми.
    629.     sr2 вписує корінь 2.
    630.     Але ж існує оператор sr, а ми нехай пишемо sr2.1.
    631.     Вираз для програми виглядатиме як sr2 .1.
    632.     Ось чому sqrt2.1 та sr 2.1 існують водночас.
    633.     Нагадую, це викликано перевагою пошуку операторів перш від чисел.