Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Переопределение инструкции mov макросом.
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 августа 2009 19:14
· Личное сообщение · #1

Здравствуйте! Возникла проблема:
Нужно переопределить макросом инструкцию mov. Для чего? Для удобства написания базонезависимого кода. По примеру будет понятно:
Code:
  1. macro mov arg1,arg2
  2. {
  3.    
  4.    
  5.    if (arg1 eqtype [0]) | (arg2 eqtype [0]) | (arg2 eqtype '')
  6.        
  7.         mov arg1,arg2
  8.    
  9.    else if (arg1 eqtype eax) & (arg2 eqtype eax)
  10.         
  11.         mov arg1,arg2
  12.         
  13.    else if (arg1 eqtype eax)
  14.        
  15.         mov arg1,dword[ebx + arg2 - DELTA]
  16.         
  17.    else if (arg2 eqtype eax)
  18.         
  19.         mov dword[ebx + arg1 - DELTA],arg2
  20.         
  21.    end if  
  22.    


Так вот ругается "Invalid Operand" при коде вида

Code:
  1. mov dwAnyDword,0xDEAD


Будьте добры, подскажите как поправить макрос.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 21 августа 2009 21:14 · Поправил: Coderess
· Личное сообщение · #2

...

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 20.8 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 августа 2009 21:26
· Личное сообщение · #3

Да вроде и в первом варианте нет ошибок. Только нужно
Code:
  1. mov [dwAnyDword],0xDEAD

Coderess
Вы внутри макроса _mov используете его же, такой рекурсии Fasm не воспринимает.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 21 августа 2009 21:56
· Личное сообщение · #4

Ага, ошибся

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 августа 2009 22:14
· Личное сообщение · #5

um0v ведь если написать
Code:
  1. mov [dwAnyDword],0xDEAD

то так и скомпилится. а мен надо что бы в результате было(например):
Code:
  1. mov [ebx+0x10],1

то есть с учетом дельты..

или может я прогнал, тогда простите, забыл уже что такое сон ..



Ранг: 20.8 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 августа 2009 22:25
· Личное сообщение · #6

Sl4y[e]r
А Вы приведите код целиком, с ошибкой. А то как я не стараюсь, оную получить не могу



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 августа 2009 23:30 · Поправил: Sl4y[e]r
· Личное сообщение · #7

Значт. Для теста пишу:

Проблема вот в чем, пишу:

Code:
  1.     mov eax,eax
  2.     mov eax,1
  3.     mov eax,szTest
  4.     mov szTest,eax
  5.     mov eax,dwTest
  6.     mov dwTest,eax
  7.     mov dwTest,1
  8.     mov eax,[dwTest]
  9.     mov [dwTest],eax


Получаю:

Code:
  1.     MOV EAX, EAX
  2.   MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]
  3.   MOV EAX, DWORD PTR DS:[EBX-12]
  4.   MOV DWORD PTR DS:[EBX-12], EAX
  5.   MOV EAX, DWORD PTR DS:[EBX-9]
  6.   MOV DWORD PTR DS:[EBX-9], EAX
  7.   MOV EAX, DWORD PTR DS:[401009]
  8.   MOV DWORD PTR DS:[401009], EAX

Вообще, возможно ли сделать полную замену макросом, что бы только где надо был учет дельты?



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 августа 2009 13:17 · Поправил: Sl4y[e]r
· Личное сообщение · #8

В общем, утро вечера мудренее:

Code:
  1. macro mov arg1,arg2
  2. {
  3.   if (arg1 eqtype DELTA) & ((arg2 eqtype eax) | (arg2 eqtype 0))
  4.   
  5.     mov dword[ebx + arg1 - DELTA],arg2
  6.     
  7.   else if (arg2 eqtype DELTA) & ((arg1 eqtype eax) | (arg1 eqtype 0))
  8.   
  9.     mov arg1, dword[ebx + arg2 - DELTA]
  10.   
  11.   else
  12.   
  13.     mov arg1, arg2
  14.     
  15.   end if
  16.    
  17.   
  18.    
  19. }


Не работает только такая:

mov eax,1

конструкция. Хотя, вроде же явно указал.. не знаю даже.

Ассемблируется

MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]

Как бы поправить, подскажите пожалуйста.



Ранг: 20.8 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 22 августа 2009 14:45
· Личное сообщение · #9

Почему не работает? Выполняется второе условие
Code:
  1.  mov arg1, dword[ebx + arg2 - DELTA]

DELTA=0x401012, -DELTA=inc(not(DELTA))==0xFFBFEFEE, 0xFFBFEFEE +1==0xFFBFEFEF
Code:
  1. MOV EAX, DWORD PTR DS:[EBX+FFBFEFEF]




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 августа 2009 15:27
· Личное сообщение · #10

так вот и я не пойму почему оно выполняется.. ведь второй аргумент не метка. мне нужно что бы и получалось в итоге mov eax,1.



Ранг: 20.8 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 22 августа 2009 16:02
· Личное сообщение · #11

А если так:
Code:
  1. else if (arg2 eqtype ptr DELTA) & ((arg1 eqtype eax) | (arg1 eqtype 0))




Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 августа 2009 16:30
· Личное сообщение · #12

тогда код вида
Code:
  1. mov eax,szTest

компилится без учета дельты. блин. совсем запутался, вродеж легче легкого а туплю..


 eXeL@B —› Программирование —› Переопределение инструкции mov макросом.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати