Написания макроса xmov на fasm в шеллкод-стиле

Тема в разделе "WASM.BEGINNERS", создана пользователем EvilsInterrupt, 21 янв 2007.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Хочу написать макрос для использования в базонезависимом коде.
    Код (Text):
    1. macro   xmov    op1,op2 {
    2. }
    где op1,op2 - могут быть как меткой в тексте кода, так регистрами.
    Просьба научить этому шаманству
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. macro xmov op1,op2
    2.   {
    3.   if op2 in <eax,ebx,ecx,edx,esi,edi,ebp>
    4.      второй операнд - регистр  
    5.   else
    6.      второй - метка
    7.      mov op1,[(op2-EntryP)+ebp]
    8. end if
    9.   }
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    FreeManCPM
    Так проверяется только op2, а нужно оба операнда.
    EvilsInterrupt
    Скачать утиль препроцессинга с форума фасма, и шамань =)
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    показал принцип :)
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    n0name
    Чего за утиль? Ее Name ?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://board.flatassembler.net/topic.php?t=4490
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Пока остановился на этом:
    Код (Text):
    1. macro   xmov    op1,op2 {
    2.     if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    3.     ; op2 is register
    4.         if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    5.         ; op1 is register
    6.         mov op1,op2
    7.         else
    8.         ; op1 is memory
    9.         mov dword[(op1-EntryPoint)+ebp],op2
    10.         end if
    11.     else
    12.         if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    13.         ; op1 is register
    14.         lea op1,[(op2-EntryPoint)+ebp]
    15.         else
    16.         ; op1 is memory
    17.         display "op1 is memory",13,10
    18.         end if
    19.     end if
    20. }
    но веду улучшения, к примеру команды mov eax,esi и mov eax,[esi] разные по значению и надо это как-то распознавать. Приму любые конструктивные советы
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. macro     xmov     op1,op2 {
    2.    xmov12345 equ dsa
    3.    xmov54321 equ dsa
    4.    match [d1],op1
    5.    \{
    6.       xmov12345 equ asd
    7.       match [d2],op2
    8.       \\{
    9.         display "Не бываед токого mov [some],[thing]",13,10
    10.         xmov54321 equ asd
    11.       \\}
    12.  
    13.       match =dsa,xmov54321
    14.       \\{
    15.         if d1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    16.           if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    17.             mov dword#op1,op2
    18.           else
    19.             if d1 eq eax
    20.                push ebx
    21.                lea  ebx,[(op2-EntryPoint)+ebp]
    22.                mov  dword#op1,ebx
    23.                pop ebx
    24.             else
    25.                push eax
    26.                lea  eax,[(op2-EntryPoint)+ebp]
    27.                mov  dword#op1,eax
    28.                pop eax
    29.             end if
    30.           end if
    31.         else
    32.           if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    33.             mov dword[(d1-EntryPoint)+ebp],op2
    34.           else
    35.             push eax
    36.             lea  eax,[(op2-EntryPoint)+ebp]
    37.             mov  dword[(d1-EntryPoint)+ebp],eax
    38.             pop eax
    39.           end if
    40.         end if
    41.       \\}
    42.    \}
    43.    match =dsa,xmov12345
    44.    \{
    45.      match [d2],op2
    46.      \\{
    47.        xmov12345 equ asd
    48.        if d2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    49.          if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    50.            mov op1,dword#op2
    51.          else
    52.            display "Не бываед токого mov some,[reg]",13,10
    53.          end if
    54.        else
    55.          if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    56.            mov op1,dword[(d2-EntryPoint)+ebp]
    57.          else
    58.            display "Не бываед токого mov some,[thing]",13,10
    59.          end if
    60.        end if
    61.      \\}
    62.    \}
    63.  
    64.    match =dsa,xmov12345
    65.    \{
    66.      if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    67.        if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi>
    68.          mov op1,op2
    69.        else
    70.          lea op1,[(op2-EntryPoint)+ebp]
    71.        end if
    72.      else
    73.        display "Не бываед токого mov some,thing или mov some,reg",13,10
    74.      end if
    75.    \}
    76. }
    77.  
    78. proc EntryPoint
    79.      xmov [EntryPoint],EntryPoint
    80.      xmov [eax],EntryPoint
    81.      xmov eax,[ebx]
    82.      xmov eax,[EntryPoint]
    83.      xmov [ebx],eax
    84.      xmov [EntryPoint],eax
    85.      xmov eax,ebx
    86.      xmov eax,EntryPoint
    87. endp
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    To All:
    FreeManCPM написал хороший макрос, не молгли бы вы перевести на английский? А то я еще слаб и очень в этом языке
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1. if op2 eqtype eax ; любой регистр