Как на fasm назначить регистрам псевдонимы?

Тема в разделе "WASM.ASSEMBLER", создана пользователем OpticalToxin, 23 авг 2010.

  1. OpticalToxin

    OpticalToxin New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2010
    Сообщения:
    14
    Адрес:
    Russia
    Нужно в зависимости от значения var1 определить reg1 как имя регистра, но для equ выходит что последнее переопределяет все предыдущие вне зависимости от условий

    if var1 = 0
    reg1 equ eax
    else if var1 = 1
    reg1 equ ebx
    else if var1 = 2
    reg1 equ ecx
    else if var1 = 3
    reg1 equ edx
    else if var1 = 4
    reg1 equ esi
    else if var1 = 5
    reg1 equ edi
    else if var1 = 6
    reg1 equ ebp
    end if

    в итоге всегда: reg1 = ebp
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    if var1 eq 0
    ...

    ?
     
  3. OpticalToxin

    OpticalToxin New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2010
    Сообщения:
    14
    Адрес:
    Russia
    Тоже самое что и: if var1 = 0
     
  4. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    OpticalToxin, equ обрабатывает препроцессор, if и = – ассемблер. Если действительно хочется условий в препроцессоре:
    Код (Text):
    1. var equ 1
    2.  
    3. match =0,var {
    4.   reg1 equ eax
    5. }
    6.  
    7. match =1,var {
    8.   reg1 equ ebx
    9. }
    10.  
    11. ; и т. п.
    Если же var присваивается значение через =, нормальных способов нет. Есть извращения для частных случаев. Что вы хотите сделать?
     
  5. OpticalToxin

    OpticalToxin New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2010
    Сообщения:
    14
    Адрес:
    Russia
    я хочу рандомизировать имена регистров поэтому: var должно принимать случайное значение на этапе компиляции и видимо всетаки это будет через =
    я уже понял что нормальных способов нет, поэтому сделал через костыль...
    твой опробую завтра, мож ченить и получица лучше чем у мну щя
     
  6. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Код (Text):
    1. if ~ defined GenerateRandomValue.Seed
    2.     GenerateRandomValue.Seed = %t
    3. end if
    4.  
    5. macro GenerateRandomValue bMask*
    6. {
    7.     GenerateRandomValue.Seed = ((GenerateRandomValue.Seed*214013+2531011) shr 16) and 0xffffffff
    8.     RandomValue = GenerateRandomValue.Seed and bMask
    9. }      
    10.  
    11. macro GenerateRandomValueMax bMask* , bMaxValue*
    12. {
    13.     GenerateRandomValue bMask
    14.      while RandomValue > bMaxValue
    15.         GenerateRandomValue bMask
    16.      end while
    17. }  
    18. ;Макрос случайным образом обнуляет регистр eax, edx, ecx и запихивает в стек.
    19. macro x_push.imm_value.0
    20. {
    21.     GenerateRandomValue 11b
    22.     if      RandomValue = 0
    23.         zero_reg eax
    24.         push eax
    25.     else if RandomValue = 1
    26.         zero_reg edx
    27.         push edx
    28.     else if RandomValue = 2
    29.         zero_reg ecx
    30.         push ecx
    31.     else
    32.         push 0
    33.     end if
    34. }
    Хотя GenerateRandomValue.Seed лучше инициализировать по другому, к примеру скриптом перла.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Знаю, что тема слегка старовата, но, когда она появилась, я отложил решение проблемы автора до лучших времён. Лучшие времена настали сегодня (точнее, по моему времени уже вчера). :) Так что... на случай, если кто-то заглянет сюда в поисках ответа.

    Очевидно, что для решения исходной задачи необходимо делать подмену имён регистров на стадии препроцессорной обработки. Поэтому никакие директивы контроля ассемблирования (while, repeat, if, знак равенства и т.п.) нам не помогут. В общем, вот макросы, которые потребовались для реализации:
    Код (Text):
    1. macro dispExp delim*,[exp]
    2. {
    3.     common match \exp,exp
    4.     \{
    5.         _rest equ \exp
    6.         irps sym,\exp
    7.         \\{
    8.             display \\`sym
    9.             match head tail, _rest
    10.             \\\{
    11.                 restore _rest
    12.                 _rest equ tail
    13.                 display delim
    14.             \\\}
    15.         \\}
    16.         restore _rest
    17.     \}
    18.     display 13,10
    19. }
    20.  
    21. struc equcalc expr
    22. {
    23.     rept 1 res:expr
    24.     \{
    25.         restore .
    26.         . equ res
    27.     \}
    28. }
    29.  
    30. struc equmap values
    31. {
    32.     _rest equ values \.
    33.     match symbols, .
    34.     \{
    35.         irps sym, symbols
    36.         \\{
    37.             \\forward
    38.                 \\local tmp
    39.                 tmp equ
    40.                 match val any, _rest
    41.                 \\\{
    42.                     restore tmp
    43.                     tmp equ val
    44.                     restore _rest
    45.                     _rest equ any
    46.                 \\\}
    47.             \\forward
    48.                 sym equ tmp
    49.                 restore tmp
    50.         \\}
    51.     \}
    52.     restore _rest
    53. }
    54.  
    55. macro exchange syms*, pos1*, pos2*
    56. {
    57.     define samepos -
    58.     match p1,pos1
    59.     \{
    60.         match =p1,pos2
    61.         \\{
    62.             restore samepos
    63.             define samepos, +
    64.         \\}
    65.     \}
    66.     match -, samepos
    67.     \{
    68.         before equ
    69.         between equ
    70.         after equ
    71.         _rest equ syms .
    72.         symsLength      equ 0
    73.         match \\syms, syms \\{ irps sym, \\syms \\\{ symsLength equcalc symsLength+1 \\\} \\}
    74.        
    75.         define matched1 -
    76.         define matched2 -
    77.         rept symsLength n:1
    78.         \\{
    79.             define matched -
    80.             match =n, pos1
    81.             \\\{
    82.                 restore matched
    83.                 define matched +
    84.                 restore matched1
    85.                 define matched1 +
    86.                 match sym any,_rest \\\\{ sym1 equ sym \\\\}
    87.             \\\}
    88.             match =n, pos2
    89.             \\\{
    90.                 restore matched
    91.                 define matched +
    92.                 restore matched2
    93.                 define matched2 +
    94.                 match sym any,_rest \\\\{ sym2 equ sym \\\\}
    95.             \\\}
    96.             match -, matched
    97.             \\\{
    98.                 ;no symbols was still found (before part)
    99.                 match -, matched1
    100.                 \\\\{
    101.                     match -, matched2
    102.                     \\\\\{
    103.                         match sym any, _rest
    104.                         \\\\\\{
    105.                             tmp equ before
    106.                             restore before
    107.                             before equ tmp sym
    108.                             restore tmp
    109.                         \\\\\\}
    110.                     \\\\\}
    111.                 \\\\}
    112.                 ;exactly one of the symbols has been found (between part)
    113.                 define onlyonematched +
    114.                 match matched1, matched1
    115.                 \\\\{
    116.                     match =matched1, matched2
    117.                     \\\\\{
    118.                         restore onlyonematched
    119.                         define onlyonematched -
    120.                     \\\\\}
    121.                 \\\\}
    122.                 match +, onlyonematched
    123.                 \\\\{
    124.                     match sym any, _rest
    125.                     \\\\\{
    126.                         tmp equ between
    127.                         restore between
    128.                         between equ tmp sym
    129.                         restore tmp
    130.                     \\\\\}
    131.                 \\\\}
    132.                 restore onlyonematched
    133.                 ;both symbols has already been found (after part)
    134.                 match +, matched1
    135.                 \\\\{
    136.                     match +, matched2
    137.                     \\\\\{
    138.                         match sym any, _rest
    139.                         \\\\\\{
    140.                             tmp equ after
    141.                             restore after
    142.                             after equ tmp sym
    143.                             restore tmp
    144.                         \\\\\\}
    145.                     \\\\\}
    146.                 \\\\}
    147.             \\\}
    148.             restore matched
    149.             ;delete current symbol
    150.             match sym any, _rest
    151.             \\\{
    152.                 restore _rest
    153.                 _rest equ any
    154.             \\\}
    155.         \\}
    156.         restore matched2
    157.         restore matched1
    158.        
    159.         restore syms
    160.         syms equ before sym2 between sym1 after
    161.         restore before,sym1,between,sym2,after,_rest,symsLength
    162.     \}
    163.     restore samepos
    164. }
    165.  
    166. macro permuteSymbols symlist,permutationNumber
    167. {
    168.     symlistsize     equ 0
    169.     symlistsizefact equ 1
    170.     match \symlist, symlist
    171.     \{
    172.         irps sym, \symlist
    173.         \\{
    174.             symlistsize equcalc symlistsize+1
    175.             symlistsizefact equcalc symlistsizefact*symlistsize
    176.         \\}
    177.     \}
    178.     permutation     equ 0
    179.     permutation equcalc permutationNumber mod symlistsizefact
    180.     rept symlistsize i:1
    181.     \{
    182.         \reverse
    183.             symlistsizefact equcalc symlistsizefact/i
    184.             tmp equ 0
    185.             tmp equcalc permutation/symlistsizefact+1
    186.                 permutation equcalc permutation mod symlistsizefact
    187.                 exchange symlist,tmp,i
    188.             restore tmp
    189.     \}
    190.     restore symlistsize,symlistsizefact,permutation
    191. }
    192.  
    193. macro randomizeRegisters registerList,seed
    194. {
    195.     reglist     equ registerList
    196.     reglistcopy equ registerList
    197.    
    198.     permuteSymbols reglistcopy,seed
    199.     reglist equmap reglistcopy
    200.  
    201.     restore reglistcopy,reglist
    202. }
    1) dispExp выводит на экран через указанный разделитель все символы (в смысле symbols, а не characters), переданные, начиная со второго аргумента. Например,
    dispExp ' ', y = 17, x = 2*y+(y mod 12) shl 7 выведет на экран строку:
    y = 17 , x = 2 * y + ( y mod 12 ) shl 7

    2) equcalc утилизирует способность препроцессора считать, введённую автором fasm'а, начиная с версии 1.69. Например,
    x equcalc (x+1) mod 3
    инкрементирует... ну в общем, догадаться, вроде, нетрудно. Важно, что эти вычисления будут выполнены на стадии препроцессорной обработки.

    3) equmap определяет символы (symbols) из списка слева от макроса соответствующими символами (или их значениями) справа от макроса. Например,
    reglist equ eax edx
    reglist equmap edx eax

    установит везде замену регистра eax на регистр edx и наоборот.

    4) exchange принимает список символов первым параметром, а следующими двумя номера символов, которые в этом списке требуется обменять местами. Например,
    reglist equ eax ebx ecx
    exchange reglist, 2, 3

    заменит значение reglist на eax ecx ebx.

    5) permuteSymbols принимает первым параметром список символов, а вторым номер перестановки, которую нужно применить к этому списку. Номер перестановки должен принадлежать интервалу [0, n!-1], где n — число символов в списке. Последняя возможная перестановка совпадает с исходным порядком списка. Например,
    reglist equ eax ebx ecx
    permuteSymbols reglist, 5

    не изменит список reglist, а
    reglist equ eax ebx ecx
    permuteSymbols reglist, 2

    заменит значение reglist на ecx eax ebx.

    6) Ну и наконец randomizeRegisters аналогично предыдущему макросу принимает список символов и номер перестановки, но устанавливает не новый список, а новые значения каждому из символов, перемешивая те значения, которые символы имели до вызова макроса.
    Следующий код перемешает регистры, выведет новый соответствующий список регистров на экран и сгенерирует инструкцию nop:
    Код (Text):
    1. randomizeRegisters eax ebx ecx edx esi edi ebp, 127
    2. dispExp ', ', eax ebx ecx edx esi edi ebp
    3. xchg ebp,ebp
    4. restore eax,ebx,ecx,edx,esi,edi,ebp
    Можно и все возможные перестановки посмотреть:
    Код (Text):
    1. rept 5040 i:0
    2. {
    3.     randomizeRegisters eax ebx ecx edx esi edi ebp, i
    4.     dispExp ', ', eax ebx ecx edx esi edi ebp
    5.     restore eax,ebx,ecx,edx,esi,edi,ebp
    6. }
    Только предварительно нужно не забыть сообщить компилятору, что ему понадобятся полтора гигабайта памяти для рассчётов. :) fasmw скорее всего не сможет выделить необходимый объём памяти, поэтому придётся воспользоваться консольной версией компилятора, например, используя какую-нибудь альтернативную IDE.

    Обидно, но единственная возможность генерации seed'а для рандомизации регистров — %t — обрабатывается на стадии ассемблирования. Одним из вариантов обхода этой неприятности может быть утилизация способности fasm обрабатывать самомодифицирующиеся исходники. :) Так сказать, совместимость с более высокоуровневой многопроходностью, которая проявляется в том, что он может "компилировать" в файл с исходником. Поэтому лёгким движением регулярного выражения вышеприведенный код превращается в следующий:
    Код (Text):
    1. format binary as "asm"
    2.  
    3. db "macro dispExp delim*,[exp]",13,10
    4. db "{",13,10
    5. db "    common match \exp,exp",13,10
    6. db "    \{",13,10
    7. db "        _rest equ \exp",13,10
    8. db "        irps sym,\exp",13,10
    9. db "        \\{",13,10
    10. db "            display \\`sym",13,10
    11. db "            match head tail, _rest",13,10
    12. db "            \\\{",13,10
    13. db "                restore _rest",13,10
    14. db "                _rest equ tail",13,10
    15. db "                display delim",13,10
    16. db "            \\\}",13,10
    17. db "        \\}",13,10
    18. db "        restore _rest",13,10
    19. db "    \}",13,10
    20. db "    display 13,10",13,10
    21. db "}",13,10
    22. db "",13,10
    23. db "struc equcalc expr",13,10
    24. db "{",13,10
    25. db "    rept 1 res:expr",13,10
    26. db "    \{",13,10
    27. db "        restore .",13,10
    28. db "        . equ res",13,10
    29. db "    \}",13,10
    30. db "}",13,10
    31. db "",13,10
    32. db "struc equmap values",13,10
    33. db "{",13,10
    34. db "    _rest equ values \.",13,10
    35. db "    match symbols, .",13,10
    36. db "    \{",13,10
    37. db "        irps sym, symbols",13,10
    38. db "        \\{",13,10
    39. db "            \\forward",13,10
    40. db "                \\local tmp",13,10
    41. db "                tmp equ",13,10
    42. db "                match val any, _rest",13,10
    43. db "                \\\{",13,10
    44. db "                    restore tmp",13,10
    45. db "                    tmp equ val",13,10
    46. db "                    restore _rest",13,10
    47. db "                    _rest equ any",13,10
    48. db "                \\\}",13,10
    49. db "            \\forward",13,10
    50. db "                sym equ tmp",13,10
    51. db "                restore tmp",13,10
    52. db "        \\}",13,10
    53. db "    \}",13,10
    54. db "    restore _rest",13,10
    55. db "}",13,10
    56. db "",13,10
    57. db "macro exchange syms*, pos1*, pos2*",13,10
    58. db "{",13,10
    59. db "    define samepos -",13,10
    60. db "    match p1,pos1",13,10
    61. db "    \{",13,10
    62. db "        match =p1,pos2",13,10
    63. db "        \\{",13,10
    64. db "            restore samepos",13,10
    65. db "            define samepos, +",13,10
    66. db "        \\}",13,10
    67. db "    \}",13,10
    68. db "    match -, samepos",13,10
    69. db "    \{",13,10
    70. db "        before equ",13,10
    71. db "        between equ",13,10
    72. db "        after equ",13,10
    73. db "        _rest equ syms .",13,10
    74. db "        symsLength      equ 0",13,10
    75. db "        match \\syms, syms \\{ irps sym, \\syms \\\{ symsLength equcalc symsLength+1 \\\} \\}",13,10
    76. db "        ",13,10
    77. db "        define matched1 -",13,10
    78. db "        define matched2 -",13,10
    79. db "        rept symsLength n:1",13,10
    80. db "        \\{",13,10
    81. db "            define matched -",13,10
    82. db "            match =n, pos1",13,10
    83. db "            \\\{",13,10
    84. db "                restore matched",13,10
    85. db "                define matched +",13,10
    86. db "                restore matched1",13,10
    87. db "                define matched1 +",13,10
    88. db "                match sym any,_rest \\\\{ sym1 equ sym \\\\}",13,10
    89. db "            \\\}",13,10
    90. db "            match =n, pos2",13,10
    91. db "            \\\{",13,10
    92. db "                restore matched",13,10
    93. db "                define matched +",13,10
    94. db "                restore matched2",13,10
    95. db "                define matched2 +",13,10
    96. db "                match sym any,_rest \\\\{ sym2 equ sym \\\\}",13,10
    97. db "            \\\}",13,10
    98. db "            match -, matched",13,10
    99. db "            \\\{",13,10
    100. db "                ;no symbols was still found (before part)",13,10
    101. db "                match -, matched1",13,10
    102. db "                \\\\{",13,10
    103. db "                    match -, matched2",13,10
    104. db "                    \\\\\{",13,10
    105. db "                        match sym any, _rest",13,10
    106. db "                        \\\\\\{",13,10
    107. db "                            tmp equ before",13,10
    108. db "                            restore before",13,10
    109. db "                            before equ tmp sym",13,10
    110. db "                            restore tmp",13,10
    111. db "                        \\\\\\}",13,10
    112. db "                    \\\\\}",13,10
    113. db "                \\\\}",13,10
    114. db "                ;exactly one of the symbols has been found (between part)",13,10
    115. db "                define onlyonematched +",13,10
    116. db "                match matched1, matched1",13,10
    117. db "                \\\\{",13,10
    118. db "                    match =matched1, matched2",13,10
    119. db "                    \\\\\{",13,10
    120. db "                        restore onlyonematched",13,10
    121. db "                        define onlyonematched -",13,10
    122. db "                    \\\\\}",13,10
    123. db "                \\\\}",13,10
    124. db "                match +, onlyonematched",13,10
    125. db "                \\\\{",13,10
    126. db "                    match sym any, _rest",13,10
    127. db "                    \\\\\{",13,10
    128. db "                        tmp equ between",13,10
    129. db "                        restore between",13,10
    130. db "                        between equ tmp sym",13,10
    131. db "                        restore tmp",13,10
    132. db "                    \\\\\}",13,10
    133. db "                \\\\}",13,10
    134. db "                restore onlyonematched",13,10
    135. db "                ;both symbols has already been found (after part)",13,10
    136. db "                match +, matched1",13,10
    137. db "                \\\\{",13,10
    138. db "                    match +, matched2",13,10
    139. db "                    \\\\\{",13,10
    140. db "                        match sym any, _rest",13,10
    141. db "                        \\\\\\{",13,10
    142. db "                            tmp equ after",13,10
    143. db "                            restore after",13,10
    144. db "                            after equ tmp sym",13,10
    145. db "                            restore tmp",13,10
    146. db "                        \\\\\\}",13,10
    147. db "                    \\\\\}",13,10
    148. db "                \\\\}",13,10
    149. db "            \\\}",13,10
    150. db "            restore matched",13,10
    151. db "            ;delete current symbol",13,10
    152. db "            match sym any, _rest",13,10
    153. db "            \\\{",13,10
    154. db "                restore _rest",13,10
    155. db "                _rest equ any",13,10
    156. db "            \\\}",13,10
    157. db "        \\}",13,10
    158. db "        restore matched2",13,10
    159. db "        restore matched1",13,10
    160. db "        ",13,10
    161. db "        restore syms",13,10
    162. db "        syms equ before sym2 between sym1 after",13,10
    163. db "        restore before,sym1,between,sym2,after,_rest,symsLength",13,10
    164. db "    \}",13,10
    165. db "    restore samepos",13,10
    166. db "}",13,10
    167. db "",13,10
    168. db "macro permuteSymbols symlist,permutationNumber",13,10
    169. db "{",13,10
    170. db "    symlistsize     equ 0",13,10
    171. db "    symlistsizefact equ 1",13,10
    172. db "    match \symlist, symlist",13,10
    173. db "    \{",13,10
    174. db "        irps sym, \symlist",13,10
    175. db "        \\{",13,10
    176. db "            symlistsize equcalc symlistsize+1",13,10
    177. db "            symlistsizefact equcalc symlistsizefact*symlistsize",13,10
    178. db "        \\}",13,10
    179. db "    \}",13,10
    180. db "    permutation     equ 0",13,10
    181. db "    permutation equcalc permutationNumber mod symlistsizefact",13,10
    182. db "    rept symlistsize i:1",13,10
    183. db "    \{",13,10
    184. db "        \reverse",13,10
    185. db "            symlistsizefact equcalc symlistsizefact/i",13,10
    186. db "            tmp equ 0",13,10
    187. db "            tmp equcalc permutation/symlistsizefact+1",13,10
    188. db "                permutation equcalc permutation mod symlistsizefact",13,10
    189. db "                exchange symlist,tmp,i",13,10
    190. db "            restore tmp",13,10
    191. db "    \}",13,10
    192. db "    restore symlistsize,symlistsizefact,permutation",13,10
    193. db "}",13,10
    194. db "",13,10
    195. db "macro randomizeRegisters registerList,seed",13,10
    196. db "{",13,10
    197. db "    reglist     equ registerList",13,10
    198. db "    reglistcopy equ registerList",13,10
    199. db "    ",13,10
    200. db "    permuteSymbols reglistcopy,seed",13,10
    201. db "    reglist equmap reglistcopy",13,10
    202. db "",13,10
    203. db "    restore reglistcopy,reglist",13,10
    204. db "}",13,10
    205. db "",13,10
    206. db "randomizeRegisters eax ebx ecx edx esi edi ebp, "
    207.  
    208. seed = %t mod 5040
    209. tenPow = 10000
    210. while tenPow > 1
    211.     tenPow = tenPow/10
    212.     db seed/tenPow + '0'
    213.     seed = seed mod tenPow
    214. end while
    215.  
    216. db 13,10
    217. db "dispExp ', ', eax ebx ecx edx esi edi ebp",13,10
    218. db "restore eax,ebx,ecx,edx,esi,edi,ebp",13,10
    После двойной компиляции в любимом IDE (у меня это двойное нажатие CTRL+F7 в Notepad++ :)) получаем вывод вида:
    edi, eax, ebp, ebx, edx, esi, ecx
    Пересохраним исходник и опять дважды компилируем. Новый вывод:
    ecx, ebp, esi, ebx, edi, eax, edx