Хочу написать макрос для использования в базонезависимом коде. Код (Text): macro xmov op1,op2 { } где op1,op2 - могут быть как меткой в тексте кода, так регистрами. Просьба научить этому шаманству
Код (Text): macro xmov op1,op2 { if op2 in <eax,ebx,ecx,edx,esi,edi,ebp> второй операнд - регистр else второй - метка mov op1,[(op2-EntryP)+ebp] end if }
FreeManCPM Так проверяется только op2, а нужно оба операнда. EvilsInterrupt Скачать утиль препроцессинга с форума фасма, и шамань =)
Пока остановился на этом: Код (Text): macro xmov op1,op2 { if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> ; op2 is register if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> ; op1 is register mov op1,op2 else ; op1 is memory mov dword[(op1-EntryPoint)+ebp],op2 end if else if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> ; op1 is register lea op1,[(op2-EntryPoint)+ebp] else ; op1 is memory display "op1 is memory",13,10 end if end if } но веду улучшения, к примеру команды mov eax,esi и mov eax,[esi] разные по значению и надо это как-то распознавать. Приму любые конструктивные советы
Код (Text): macro xmov op1,op2 { xmov12345 equ dsa xmov54321 equ dsa match [d1],op1 \{ xmov12345 equ asd match [d2],op2 \\{ display "Не бываед токого mov [some],[thing]",13,10 xmov54321 equ asd \\} match =dsa,xmov54321 \\{ if d1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> mov dword#op1,op2 else if d1 eq eax push ebx lea ebx,[(op2-EntryPoint)+ebp] mov dword#op1,ebx pop ebx else push eax lea eax,[(op2-EntryPoint)+ebp] mov dword#op1,eax pop eax end if end if else if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> mov dword[(d1-EntryPoint)+ebp],op2 else push eax lea eax,[(op2-EntryPoint)+ebp] mov dword[(d1-EntryPoint)+ebp],eax pop eax end if end if \\} \} match =dsa,xmov12345 \{ match [d2],op2 \\{ xmov12345 equ asd if d2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> mov op1,dword#op2 else display "Не бываед токого mov some,[reg]",13,10 end if else if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> mov op1,dword[(d2-EntryPoint)+ebp] else display "Не бываед токого mov some,[thing]",13,10 end if end if \\} \} match =dsa,xmov12345 \{ if op1 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> if op2 in <eax,ecx,edx,ebx,ebp,esp,esi,edi> mov op1,op2 else lea op1,[(op2-EntryPoint)+ebp] end if else display "Не бываед токого mov some,thing или mov some,reg",13,10 end if \} } proc EntryPoint xmov [EntryPoint],EntryPoint xmov [eax],EntryPoint xmov eax,[ebx] xmov eax,[EntryPoint] xmov [ebx],eax xmov [EntryPoint],eax xmov eax,ebx xmov eax,EntryPoint endp
To All: FreeManCPM написал хороший макрос, не молгли бы вы перевести на английский? А то я еще слаб и очень в этом языке